本帖最后由 renwocai 于 2012-10-15 13:57 编辑
我的控制目的很简单,就是8位共阳数码管动态扫描,按键每按一次数码管最后两位显示加一,前面6位固定显示为0.
我的思想是,数码管和按键都放在定时器中断里面,按键用状态机做。我本来是想把这个做好后把按键和数码管扫描都放在主程序中的,但通过定时器设定标志位决定什么时候运行。用软件仿真的时候可以看到按键控制的变量的确是按一次加一的,但用PROTEUS仿真确看不到这个效果。
现将程序贴出来,工程和仿真打包上传。
- #include <reg51.h>
- #define uchar unsigned char
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar shu=85;
- sbit kb=P3^4;
- void sumaguan()
- {
- static uchar i=0;
- i++;
- P0=0XFF;
- P2=1<<(i-1);
- if(i<7)
- P0=0XC0;
- else if(i==7)
- P0=tab[shu/10];
- else if(i==8)
- {
- P0=tab[shu%10];
- i=0;
- }
- }
- void anjianchuli()
- {
- static uchar zhuangtai=0;
- switch(zhuangtai)
- {
- case 0:
- {
- if(kb==0)
- zhuangtai++;
- };break;
- case 1:
- {
- if(kb==0)
- zhuangtai++;
- else
- zhuangtai--;
- };break;
- case 2:
- {
- if(kb==0)
- {
- zhuangtai++;
- shu++;
- if(shu==100)
- shu=0;
- }
- };break;
- case 3:
- {
- if(kb==1)
- zhuangtai=0;
- };break;
- }
- }
- main()
- {
- TMOD = 0x01;
- TH0 = 0x0E8;
- TL0 = 0x90;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- while(1);
-
- }
- void timer0() interrupt 1
- {
- TH0 = 0x0E8;
- TL0 = 0x90;
- sumaguan();
- anjianchuli();
- }
复制代码
按键控制数码管.rar
(22.53 KB, 下载次数: 4)
2012-10-14 23:50 上传
点击文件名下载附件
一周热门 更多>