程序在绝大多数情况下都得跑起来,不可以随便使用死循环和阻滞延时。虽然指令是逐条执行的,但由于单片机速度很快,主观感觉许多任务在同时执行。给你一个流水灯和数码管动态显示的简单示例参考。仿真图只代表逻辑正确,完善后才能用于实际电路。
- #include<reg51.h>
- unsigned char code table[]={//共阴数码管段码"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- unsigned char code wela[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
- unsigned char data dis_buf[8];//显示缓存
- unsigned int i,j,k,l;//计数变量
- void main()
- {
- P1=0xfe;//流水灯初始化
- while(1)
- {
- //i,j,k计数
- i++;
- if(i>=1000)
- {
- i=0;
- j++;
- if(j>9999)
- {
- j=0;
- k++;
- if(k>9999)
- k=0;
- }
- //流水灯
- P1=P1<<1|0x01;
- if(P1==0xff)
- P1=0xfe;
- }
- //分解数据
- dis_buf[0]=table[k/1000%10];
- dis_buf[1]=table[k/100%10];
- dis_buf[2]=table[k/10%10];
- dis_buf[3]=table[k%10];
- dis_buf[4]=table[j/1000%10];
- dis_buf[5]=table[j/100%10];
- dis_buf[6]=table[j/10%10];
- dis_buf[7]=table[j%10];
- //数码管动态显示
- P0=0x00;//消隐段码
- P2=wela[l];//位码
- P0=dis_buf[l];//段码
- l++;//数码管动态计数
- if(l>=8)
- l=0;
- }
- }
复制代码
|