你不觉得60ms太短了吗?
org 0h
ljmp 0300h
org 000bh
ajmp time0
org 0300h
mov a,#0feh
mov p1,a
mov th0,#063h
mov tl0,#0c0h ;晶振8Mhz 每周期1.5us,60ms需要40000个周期,65536-40000=63c0h
mov tmod,#00000010b
setb ea
setb et0
setb tr0
ajmp $
time0:
clr tf0
rl a
mov p1,a
mov th0,#063h
mov tl0,#0c0h
reti
end
#include
#deifne uchar unsigned char
#define uint unsigned int
uchar temp = 0xfe;
void init_timer0() // 初始化定时器
{
TMOD = 0x01; // 设置为每50ms中断一次
TH0 = 0x63;
TL0 = 0xc0;
ET = 1;
EA = 1;
}
void main()
{
init_timer0();
while(1);
}
void timer0() interrupt 1 using 1
{
TH0 = 0x63;
TL0 = 0xc0;
P1 = temp;
temp <<= 1;
temp |= 0x01; // 包含这行的话是逐个点亮,前一个熄灭.
}
有些不明白:
60毫秒,是显示LED0~LED7中的一个位,还是把LED0~LED7都显示一遍?
另外:
60毫秒,这个时间,长、短不合适,一秒钟,有16遍,这将会闪烁的受不了。
再长一些,就看到流水灯的效果;
再短一些,就看到8个LED同时稳定显示。
这个很简单,在定时中断处理函数中实现将LED0~LED7逐个点亮的功能就行了
写这分太少,哈哈