已解决,不是程序的问题,是仿真的问题。一个按键控制...

2020-02-03 10:10发布

本帖最后由 renwocai 于 2012-10-15 13:57 编辑

我的控制目的很简单,就是8位共阳数码管动态扫描,按键每按一次数码管最后两位显示加一,前面6位固定显示为0.
我的思想是,数码管和按键都放在定时器中断里面,按键用状态机做。我本来是想把这个做好后把按键和数码管扫描都放在主程序中的,但通过定时器设定标志位决定什么时候运行。用软件仿真的时候可以看到按键控制的变量的确是按一次加一的,但用PROTEUS仿真确看不到这个效果。
现将程序贴出来,工程和仿真打包上传。
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. uchar shu=85;
  5. sbit kb=P3^4;



  6. void sumaguan()
  7. {
  8.         static uchar i=0;
  9.         i++;
  10.         P0=0XFF;
  11.         P2=1<<(i-1);
  12.         if(i<7)
  13.                 P0=0XC0;
  14.         else if(i==7)
  15.                 P0=tab[shu/10];
  16.         else if(i==8)
  17.                 {
  18.                         P0=tab[shu%10];
  19.                         i=0;
  20.                 }
  21. }
  22. void anjianchuli()
  23. {
  24.         static uchar zhuangtai=0;
  25.         switch(zhuangtai)
  26.                 {
  27.                         case 0:
  28.                                 {
  29.                                         if(kb==0)
  30.                                                 zhuangtai++;
  31.                                 };break;
  32.                         case 1:
  33.                                 {
  34.                                         if(kb==0)
  35.                                                 zhuangtai++;
  36.                                         else
  37.                                                 zhuangtai--;

  38.                                 };break;
  39.                         case 2:
  40.                                 {
  41.                                         if(kb==0)
  42.                                                 {
  43.                                                         zhuangtai++;
  44.                                                         shu++;
  45.                                                         if(shu==100)
  46.                                                                 shu=0;
  47.                                                 }
  48.                                 };break;
  49.                         case 3:
  50.                                 {
  51.                                         if(kb==1)
  52.                                                 zhuangtai=0;
  53.                                 };break;
  54.                 }
  55.         }



  56. main()
  57. {
  58.         TMOD = 0x01;
  59.     TH0 = 0x0E8;
  60.     TL0 = 0x90;
  61.     EA = 1;
  62.     ET0 = 1;
  63.     TR0 = 1;
  64.         while(1);
  65.        
  66. }
  67. void timer0() interrupt 1
  68. {
  69.     TH0 = 0x0E8;
  70.     TL0 = 0x90;
  71.         sumaguan();       
  72.         anjianchuli();
  73. }
复制代码 按键控制数码管.rar (22.53 KB, 下载次数: 4) 2012-10-14 23:50 上传 点击文件名下载附件

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
renwocai
1楼-- · 2020-02-03 12:22
 精彩回答 2  元偷偷看……
xiaoyigechaos
2楼-- · 2020-02-03 17:27
感觉 似乎每次计时到时见之后 数码管重新扫描  如果数码管刚才没显示完  那剩下的不显示了  程序没看  感觉你的思路需要考虑这个问题
renwocai
3楼-- · 2020-02-03 22:01
谢谢。已经搞定。在硬件上没有问题的,再次见到PROTEUS的BUG

一周热门 更多>