找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1500|回复: 5
打印 上一主题 下一主题
收起左侧

这个单片机程序按键3不能清零,哪里逻辑出问题

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^2;
sbit key4=P3^3;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar t0,bai,shi,ge;
uint num;
void display(uchar bai,uchar shi,uchar ge);
void keyscan();
void init();
void delayms(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void main()         
{
  
   init();
while(1)
{
     keyscan();
   display(bai,shi,ge);     
}
}
void init()
{
    TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
   
}
void display(uchar bai,uchar shi,uchar ge)
{

      
      dula=1;
   P0=table[bai];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfe;
  wela=0;
  delayms(5);
      dula=1;
  P0=table[shi];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfd;
  wela=0;
  delayms(5);
      dula=1;
  P0=table[ge];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0xfb;
  wela=0;
  delayms(5);      
}
void timer0() interrupt 1  
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==5)
{
     t0=0;
     num++;
     bai=num/100;
   shi=num%100/10;
   ge=num%10;
     if(num==999)
      num=0;
   }
  }
void keyscan()
{
  if(key1==0)
  {
   delayms(10);
   if(key1==0)
   {
     while(!key1);
     TR0=1;
          }
          }
    if(key2==0)
  {
   delayms(10);
   if(key2==0)
   {
     while(!key2);
     TR0=0;
          }
          }
if(key3==0)
  {
   delayms(10);
   if(key3==0)
   {
     while(!key3);
     num=0;
          }
          }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-2-2 18:04 | 只看该作者
由于数据分解语句在定时器中断里,如果按下key2就关闭了定时器,再按key3时num虽然为0,但bai、shi、ge没有变,显示数值当然不变。把数据分解语句放到显示程序中可以解决。
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit wela=P2^7;
  5. sbit dula=P2^6;
  6. sbit key1=P3^4;
  7. sbit key2=P3^5;
  8. sbit key3=P3^2;
  9. sbit key4=P3^3;
  10. uchar code table[]={
  11. 0x3f,0x06,0x5b,0x4f,
  12. 0x66,0x6d,0x7d,0x07,
  13. 0x7f,0x6f,0x77,0x7c,
  14. 0x39,0x5e,0x79,0x71};
  15. uchar t0,bai,shi,ge;
  16. uint num;
  17. void display();
  18. void keyscan();
  19. void init();
  20. void delayms(uint xms)
  21. {
  22.   uint i,j;
  23.   for(i=xms;i>0;i--)
  24.   for(j=110;j>0;j--);
  25. }
  26. void main()         
  27. {  
  28.         init();
  29.         while(1)
  30.         {
  31.                 keyscan();
  32.                 display();
  33.         }
  34. }
  35. void init()
  36. {
  37.         TMOD=0x11;
  38.         TH0=(65536-50000)/256;
  39.         TL0=(65536-50000)%256;
  40.         EA=1;
  41.         ET0=1;
  42.         TR0=0;  
  43. }
  44. void display()
  45. {
  46.         P0=0xff;//消隐
  47.         wela=1;
  48.         wela=0;
  49.         P0=table[num/100];
  50.         dula=1;
  51.         dula=0;
  52.         P0=0xfe;
  53.         wela=1;
  54.         wela=0;
  55.         delayms(5);

  56.         P0=0xff;//消隐
  57.         wela=1;
  58.         wela=0;
  59.         P0=table[num%100/10];
  60.         dula=1;
  61.         dula=0;
  62.         P0=0xfd;
  63.         wela=1;
  64.         wela=0;
  65.         delayms(5);

  66.         P0=0xff;//消隐
  67.         wela=1;
  68.         wela=0;
  69.         P0=table[num%10];
  70.         dula=1;
  71.         dula=0;
  72.         P0=0xfb;
  73.         wela=1;
  74.         wela=0;
  75.         delayms(5);
  76. }
  77. void timer0() interrupt 1  
  78. {
  79.         TH0=(65536-50000)/256;
  80.         TL0=(65536-50000)%256;
  81.         t0++;
  82.         if(t0==5)
  83.         {
  84.                 t0=0;
  85.                 num++;
  86.                 if(num==999)
  87.                         num=0;
  88.         }
  89. }
  90. void keyscan()
  91. {
  92.         if(key1==0)
  93.         {
  94.                 delayms(10);
  95.                 if(key1==0)
  96.                 {
  97.                         while(!key1);
  98.                         TR0=1;
  99.                 }
  100.         }
  101.         if(key2==0)
  102.         {
  103.                 delayms(10);
  104.                 if(key2==0)
  105.                 {
  106.                         while(!key2);
  107.                         TR0=0;
  108.                 }
  109.         }
  110.         if(key3==0)
  111.         {
  112.                 delayms(10);
  113.                 if(key3==0)
  114.                 {
  115.                         while(!key3);
  116.                         num=0;
  117.                 }
  118.         }
  119. }
复制代码

回复

使用道具 举报

板凳
ID:168996 发表于 2020-2-2 18:47 | 只看该作者
实测可以对num清零
测试方法:按k1(程序功能启动TR0,过几秒钟按k2(程序功能停止TR0),再按K3,停留在图示断点,执行num=0则清零(见左侧变量窗口)

回复

使用道具 举报

地板
ID:689459 发表于 2020-2-2 20:44 | 只看该作者
谢谢,明白了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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