找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 2922|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)數(shù)碼管動(dòng)態(tài)顯示有誤 前兩位是不亮只能隱約看到微亮

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:966442 發(fā)表于 2022-1-22 19:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
20黑幣
問題描述:單片機(jī)為清翔單片機(jī),其兩個(gè)四位共陰極數(shù)碼管由兩片74HC573控制,我做的項(xiàng)目是利用矩陣按鍵做一個(gè)簡(jiǎn)易加法計(jì)算器。我認(rèn)為大致問題是出在數(shù)碼管顯示ShowNumber這個(gè)函數(shù)。數(shù)碼管雖然能夠正確顯示結(jié)果,但是在放著單片機(jī)不碰它的時(shí)候,數(shù)碼管只有第三位是常亮的,前兩位是不亮的,只能不停地按按鍵才能讓前兩位數(shù)碼管一閃一閃從而隱約地能夠看到結(jié)果。不知道怎么解決請(qǐng)大家?guī)蛡€(gè)忙?

單片機(jī)源程序如下:
  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] = { //矩陣按鍵編號(hào)到標(biāo)準(zhǔn)鍵盤鍵碼的映射表
  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.   }
復(fù)制代碼
計(jì)算器.rar (33.89 KB, 下載次數(shù): 3)

最佳答案

查看完整內(nèi)容

你這個(gè)思路是正確的。顯示函數(shù)示例: 需要實(shí)時(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)用,對(duì)于3位數(shù)碼管動(dòng)態(tài)顯示,主循環(huán)周期不大于7ms(8位不大于2.5ms),肉眼觀察不到閃爍
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

你這個(gè)思路是正確的。顯示函數(shù)示例:
需要實(shí)時(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)用,對(duì)于3位數(shù)碼管動(dòng)態(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)計(jì)數(shù)
  14. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2022-1-22 21:25 | 只看該作者
這個(gè)是消隱的問題
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2022-1-23 08:15 | 只看該作者
你這明顯是程序結(jié)構(gòu)問題。數(shù)碼管要不停的循環(huán)逐位顯示,你把數(shù)碼管驅(qū)動(dòng)函數(shù)放在與按鍵操作相關(guān)函數(shù)中調(diào)用,每按一下數(shù)碼管驅(qū)動(dòng)函數(shù)只運(yùn)行一次,當(dāng)然就停留在最后一位上。
回復(fù)

使用道具 舉報(bào)

5#
ID:966442 發(fā)表于 2022-1-23 18:07 | 只看該作者
wulin 發(fā)表于 2022-1-23 08:15
你這明顯是程序結(jié)構(gòu)問題。數(shù)碼管要不停的循環(huán)逐位顯示,你把數(shù)碼管驅(qū)動(dòng)函數(shù)放在與按鍵操作相關(guān)函數(shù)中調(diào)用, ...

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

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表