標題: 單片機數(shù)碼管動態(tài)顯示有誤 前兩位是不亮只能隱約看到微亮 [打印本頁]

作者: 電子浪人    時間: 2022-1-22 19:18
標題: 單片機數(shù)碼管動態(tài)顯示有誤 前兩位是不亮只能隱約看到微亮
問題描述:單片機為清翔單片機,其兩個四位共陰極數(shù)碼管由兩片74HC573控制,我做的項目是利用矩陣按鍵做一個簡易加法計算器。我認為大致問題是出在數(shù)碼管顯示ShowNumber這個函數(shù)。數(shù)碼管雖然能夠正確顯示結果,但是在放著單片機不碰它的時候,數(shù)碼管只有第三位是常亮的,前兩位是不亮的,只能不停地按按鍵才能讓前兩位數(shù)碼管一閃一閃從而隱約地能夠看到結果。不知道怎么解決請大家?guī)蛡忙?

單片機源程序如下:
  1. #include <REGX52.H>
  2. sbit KeyOut1 = P3^0;
  3. sbit KeyOut2 = P3^1;
  4. sbit KeyOut3 = P3^2;
  5. sbit KeyOut4 = P3^3;
  6. sbit KeyIn1 = P3^4;
  7. sbit KeyIn2 = P3^5;
  8. sbit KeyIn3 = P3^6;
  9. sbit KeyIn4 = P3^7;
  10. sbit duan = P2^6;
  11. sbit wei = P2^7;
  12. #define uchar unsigned char
  13. #define uint  unsigned int
  14. #define ulong unsigned long
  15. uchar T0RH,T0RL;
  16. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  17. 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  18. uchar KeySta[4][4]={
  19. {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},
  20. };
  21. uchar code KeyCodeMap[4][4] = { //矩陣按鍵編號到標準鍵盤鍵碼的映射表
  22. { 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵
  23. { 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵
  24. { 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵
  25. { 0x30, 0x1B, 0x0D, 0x27 } //數(shù)字鍵 0、ESC 鍵、 回車鍵、 向右鍵
  26. };
  27. uchar we[]={0xFE,0xFD,0xFB,0xF7,0xef,0xdf,0xbf,0x7f};
  28. unsigned char LedBuff[6] = { //數(shù)碼管顯示緩沖區(qū)
  29. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  30. };
  31. void ConfigTimer0(uint ms)
  32. {
  33.         ulong tmp;
  34.         tmp = 11059200/12;
  35.         tmp = (tmp*ms)/1000;
  36.         tmp = 65536-tmp;
  37.         T0RH = (uchar)(tmp>>8);
  38.         T0RL = (uchar)tmp;
  39.         TMOD &= 0xF0;
  40.         TMOD |= 0x01;
  41.         TH0 = T0RH;
  42.         TL0 = T0RL;
  43.         ET0 = 1;
  44.         TR0 = 1;
  45.         EA = 1;
  46. }
  47. void delay(uchar i)
  48. {
  49.         uchar j,k;
  50.         for(j=i;j>0;j--)
  51.         for(k=125;k>0;k--);
  52. }
  53. void ShowNumber(ulong num)
  54. {
  55.         uchar bai,shi,ge;
  56.         bai = num/100%10;
  57.         shi = num/10%10;
  58.         ge = num/1%10;
  59.         duan = 0;
  60.         P0 = table[bai];
  61.         duan = 1;
  62.         duan = 0;
  63.         wei = 0;
  64.         P0 = we[0];
  65.         wei = 1;
  66.         wei = 0;
  67.         delay(5);
  68.         
  69.         duan = 0;
  70.         P0 = table[shi];
  71.         duan = 1;
  72.         duan = 0;
  73.         wei = 0;
  74.         P0 = we[1];
  75.         wei = 1;
  76.         wei = 0;
  77.         delay(5);
  78.         
  79.         duan = 0;
  80.         P0 = table[ge];
  81.         duan = 1;
  82.         duan = 0;
  83.         wei = 0;
  84.         P0 = we[2];
  85.         wei = 1;
  86.         wei = 0;
  87.         delay(5);
  88. }
  89. void KeyAction(uchar keycode)
  90. {
  91.         static ulong result,addend;
  92.         if((keycode>=0x30)&&(keycode<=0x39))
  93.         {
  94.                 addend = (addend*10)+keycode-0x30;
  95.                 ShowNumber(addend);
  96.         }
  97.         else if(keycode == 0x26)
  98.         {
  99.                 result += addend;
  100.                 addend = 0;
  101.                 ShowNumber(result);
  102.         }
  103.         else if(keycode == 0x0D)
  104.         {
  105.                 result += addend;
  106.                 addend = 0;
  107.                 ShowNumber(result);
  108.         }
  109.         else if(keycode == 0x1B)
  110.         {
  111.                 addend = 0;
  112.                 result = 0;
  113.                 ShowNumber(addend);
  114.         }
  115. }
  116. void KeyDriver()
  117. {
  118.         uchar i,j;
  119.         static uchar backup[4][4]={
  120.         {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},
  121.         };
  122.         for(i=0;i<4;i++)
  123.         {
  124.   for(j=0;j<4;j++)
  125.   {
  126.     if(backup[i][j]!=KeySta[i][j])
  127.     {
  128.       if(backup[i][j]!=0)
  129.      {
  130.         KeyAction(KeyCodeMap[i][j]);
  131.      }
  132.      backup[i][j] = KeySta[i][j];
  133.    }
  134.   }
  135. }
  136. }
  137. void main()
  138. {
  139.   ConfigTimer0(2);
  140.   while(1)
  141.   {
  142.     KeyDriver();
  143.   }
  144. }
  145. void KeyScan()
  146. {
  147.   uchar i;
  148.   static uchar KeyOut = 0;
  149.   static uchar KeyBuf[4][4]={
  150.   {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
  151.   {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
  152.   };
  153.   KeyBuf[KeyOut][0] = (KeyBuf[KeyOut][0]<<1)|KeyIn1;
  154.   KeyBuf[KeyOut][1] = (KeyBuf[KeyOut][1]<<1)|KeyIn2;
  155.   KeyBuf[KeyOut][2] = (KeyBuf[KeyOut][2]<<1)|KeyIn3;
  156.   KeyBuf[KeyOut][3] = (KeyBuf[KeyOut][3]<<1)|KeyIn4;
  157.   for(i=0;i<4;i++)
  158.   {
  159.     if((KeyBuf[KeyOut][i]&0x0F)==0x00)
  160.     KeySta[KeyOut][i] = 0;
  161.     else if((KeyBuf[KeyOut][i]&0x0F)==0x0F)
  162.     KeySta[KeyOut][i] = 1;
  163.   }
  164.   KeyOut++;
  165.   KeyOut = KeyOut&0x03;
  166.   switch(KeyOut)
  167.   {
  168.     case 0:KeyOut4=1;KeyOut3=1;KeyOut2=1;KeyOut1=0;break;
  169.     case 1:KeyOut4=1;KeyOut3=1;KeyOut2=0;KeyOut1=1;break;
  170.     case 2:KeyOut4=1;KeyOut3=0;KeyOut2=1;KeyOut1=1;break;
  171.     case 3:KeyOut4=0;KeyOut3=1;KeyOut2=1;KeyOut1=1;break;
  172.     default:break;
  173.   }
復制代碼
計算器.rar (33.89 KB, 下載次數(shù): 3)


作者: wulin    時間: 2022-1-22 19:18
本帖最后由 wulin 于 2022-1-23 20:52 編輯
電子浪人 發(fā)表于 2022-1-23 18:07
我想到了一個方法,就是設一個變量number去儲存KeyAction里每個if語句里面的result和addend的值也就是num ...

你這個思路是正確的。顯示函數(shù)示例:
需要實時顯示的內(nèi)容存放在緩存中
        LedBuff[0]=table[number/100%10];
        LedBuff[1]=table[number/10%10];
        LedBuff[2]=table[number%10];

顯示函數(shù)放在主循環(huán)中調(diào)用,對于3位數(shù)碼管動態(tài)顯示,主循環(huán)周期不大于7ms(8位不大于2.5ms),肉眼觀察不到閃爍
  1. void ShowNumber()
  2. {
  3.         static unsigned char i;
  4.         P0=0x00;//段消隱
  5.         duan=1;//鎖存
  6.         duan=0;
  7.         P0=we[i];//送位碼
  8.         wei=1;//鎖存
  9.         wei=0;
  10.         P0=LedBuff[i];//送段碼
  11.         duan=1;//鎖存
  12.         duan=0;
  13.         i=++i%3;//循環(huán)計數(shù)
  14. }
復制代碼




作者: heicad    時間: 2022-1-22 21:25
這個是消隱的問題
作者: wulin    時間: 2022-1-23 08:15
你這明顯是程序結構問題。數(shù)碼管要不停的循環(huán)逐位顯示,你把數(shù)碼管驅(qū)動函數(shù)放在與按鍵操作相關函數(shù)中調(diào)用,每按一下數(shù)碼管驅(qū)動函數(shù)只運行一次,當然就停留在最后一位上。
作者: 電子浪人    時間: 2022-1-23 18:07
wulin 發(fā)表于 2022-1-23 08:15
你這明顯是程序結構問題。數(shù)碼管要不停的循環(huán)逐位顯示,你把數(shù)碼管驅(qū)動函數(shù)放在與按鍵操作相關函數(shù)中調(diào)用, ...

我想到了一個方法,就是設一個變量number去儲存KeyAction里每個if語句里面的result和addend的值也就是number=addend,或者number=result,然后把ShowNumber這個函數(shù)放在mian函數(shù)的while里面,其形參就是number,這樣就解決了問題




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1