楼主的核心错误在这一条 led=led|0xfe; 如果改成 led=led|0x80; 右移后最高位补1就可以正常显示。但总体来说程序结构明显不合理。初始化完成以后所有程序都要约束在主循环while(1)中运行。改这样试试:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define led P2 //宏定义led=P2
- void main(void)
- {
- u8 cnt,num;
- TMOD=1;
- TH0=0XB8; //20ms
- TL0=0X00;
- TF0=0;
- TR0=1; //定时器开启
- led=0xfe;
- while(1)
- {
- if(TF0)
- {
- TF0=0;
- TH0=0XB8;
- TL0=0X00;
- cnt++;
- if(cnt>=50)
- {
- cnt=0;
- if(led==0xfe)
- {
- num=1;
- }
- if(led==0x7f)
- {
- num=0;
- }
- if(num==1)
- {
- led=led<<1|0x01;
- }
- if(num==0)
- {
- led=led>>1|0x80;
- }
- }
- }
- }
- }
复制代码 |