标题: 这个单片机程序按键3不能清零,哪里逻辑出问题 [打印本页]

作者: 13221865969    时间: 2020-2-2 15:34
标题: 这个单片机程序按键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;
          }
          }
}


作者: wulin    时间: 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. }
复制代码


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


作者: 13221865969    时间: 2020-2-2 20:44
谢谢,明白了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1