樓主的核心錯誤在這一條 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;
- }
- }
- }
- }
- }
復制代碼 |