搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2012-10-14 23:50:08 | 显示全部楼层 |阅读模式
本帖最后由 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. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-10-15 11:38:06 | 显示全部楼层
思想很简单,就是数码管和按键的处理都放到中断里面去完成,我想先测试完这个再把这两个函数都放到主程序中去。但现在第一步就不能成功

出0入4汤圆

发表于 2012-10-15 12:56:37 | 显示全部楼层
感觉 似乎每次计时到时见之后 数码管重新扫描  如果数码管刚才没显示完  那剩下的不显示了  程序没看  感觉你的思路需要考虑这个问题

出0入0汤圆

 楼主| 发表于 2012-10-15 13:56:35 | 显示全部楼层
谢谢。已经搞定。在硬件上没有问题的,再次见到PROTEUS的BUG
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表