標(biāo)題: 求助:數(shù)碼管消影問題 [打印本頁]

作者: LLL2022    時(shí)間: 2023-1-6 10:19
標(biāo)題: 求助:數(shù)碼管消影問題
目的:通過按下按鍵作為外部的中斷輸入信號(hào),通過數(shù)碼管顯示中斷次數(shù)。
問題:目前在PROTEUS仿真上能正常實(shí)現(xiàn)功能,但在實(shí)物上出現(xiàn)類似不能消影的問題,當(dāng)按下按鍵后,數(shù)碼管全亮(會(huì)一直顯示8888),計(jì)數(shù)功能也出現(xiàn)問題,按下按鍵后數(shù)碼管4位同時(shí)改變(在顯示8888時(shí),可以勉強(qiáng)觀察到數(shù)字有在變化)。


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.        
  5. //P0為SA-SH      P1為C0-C3

  6. sbit K1=P3^2;
  7. uchar  dis_code[11]={0xc0,0xf9,0xa4,0xb0,        // 0, 1, 2, 3
  8.                                                     0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};                // 4, 5, 6, 7, 8, 9, off
  9. uchar  buf[4];
  10. uint cnt=0;
  11.                                                                
  12. void delay(uchar ms)
  13. {
  14.         while(ms--)
  15.                 ;
  16. }


  17. void initial()
  18. {
  19.         IT0=1;
  20.         EX0=1;
  21.         EA=1;
  22. }



  23. int main()
  24. {
  25.         initial();
  26.         P0=0xff;
  27.         P1=0;
  28.         buf[0]=dis_code[0];
  29.         buf[1]=dis_code[0];
  30.         buf[2]=dis_code[0];
  31.         buf[3]=dis_code[0];
  32.        
  33.         while(1)
  34.         {
  35.                 P0=buf[3];//顯示千位
  36.                 P1=0x01;
  37.                 delay(5);
  38.                 P0=0xff;
  39.                
  40.                 P0=buf[2];//顯示百位
  41.                 P1=0x02;
  42.                 delay(5);
  43.                 P0=0xff;
  44.                
  45.                 P0=buf[1];//顯示十位
  46.                 P1=0x04;
  47.                 delay(5);
  48.                 P0=0xff;
  49.                
  50.                 P0=buf[0];//顯示個(gè)位
  51.                 P1=0x08;
  52.                 delay(5);
  53.                 P0=0xff;
  54.                
  55.         }
  56.        
  57. }

  58. void init0() interrupt 0

  59. {
  60.         EX0=0;
  61. if(K1==0)
  62. {
  63.                 cnt++;
  64.                 if(cnt>9999)
  65.                 {
  66.                         cnt=0;
  67.                 }
  68.         }
  69.        
  70.         buf[3]=dis_code[cnt/1000];  //千位
  71.         buf[2]=dis_code[cnt%1000/100];//百位
  72.         buf[1]=dis_code[cnt%100/10];//十位
  73.         buf[0]=dis_code[cnt%10];//個(gè)位
  74.         EX0=1;
  75.        
  76. }
復(fù)制代碼




作者: 景生2020    時(shí)間: 2023-1-6 16:00
加入P0消隱試試
if(k1==0)
{
P0=0XFF;
}
作者: wulin    時(shí)間: 2023-1-6 16:37
用外部中斷讀取按鍵信號(hào),消抖是個(gè)問題。仿真按鍵不會(huì)抖動(dòng),如果用簡單的延時(shí)消抖方法會(huì)導(dǎo)致動(dòng)態(tài)數(shù)碼管顯示停頓。實(shí)際電路會(huì)因?yàn)榘存I抖動(dòng),cnt會(huì)加不確定的值。給你程序修改了,你試試。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int      
  4. //P0為SA-SH      P1為C0-C3
  5. sbit K1=P3^2;
  6. uchar  dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
  7. 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};     // 4, 5, 6, 7, 8, 9, off

  8. uchar  buf[4];
  9. uint cnt=0;
  10.                                                                
  11. void delay(uint ms)
  12. {
  13.          while(ms--);               
  14. }
  15. void initial()
  16. {
  17.         IT0 = 1;
  18.         EX0 = 1;
  19.         EA = 1;
  20. }
  21. void main()
  22. {
  23.         uchar i;
  24.         initial();      
  25.         while(1)
  26.         {
  27.                 buf[0]=dis_code[cnt/1000%10];  //千位
  28.                 buf[1]=dis_code[cnt/100%10];//百位
  29.                 buf[2]=dis_code[cnt/10%10];//十位
  30.                 buf[3]=dis_code[cnt%10];//個(gè)位
  31.                 P1&=0xf0;
  32.                 P0=buf[i];
  33.                 P1|=0x01<<i;
  34.                 if(++i>3)
  35.                         i=0;
  36.                 delay(100);
  37.         }
  38. }

  39. void init0() interrupt 0
  40. {
  41.         cnt++;
  42.         if(cnt>9999)
  43.         {
  44.                 cnt=0;
  45.         }
  46. }
復(fù)制代碼




作者: LLL2022    時(shí)間: 2023-1-6 17:06
景生2020 發(fā)表于 2023-1-6 16:00
加入P0消隱試試
if(k1==0)
{

還是不行,我想應(yīng)該不是消影的問題,如果是消影的問題的話,當(dāng)我觸發(fā)中斷時(shí)數(shù)碼管的千百十應(yīng)該是不變的,只有個(gè)位的會(huì)出現(xiàn)問題,但現(xiàn)在當(dāng)我觸發(fā)中斷時(shí),數(shù)碼管的千百十個(gè)位都出現(xiàn)同樣的數(shù)字(數(shù)碼管還是顯示8888)只能勉強(qiáng)通過亮暗觀察到數(shù)碼管的數(shù)字發(fā)生變化。
作者: 上善-若水    時(shí)間: 2023-1-6 19:31
數(shù)碼管動(dòng)態(tài)顯示有閃爍主要是由于延時(shí)時(shí)間選擇不當(dāng)造成的 主要檢查延時(shí)方面的語句
作者: huazhaojiu    時(shí)間: 2023-1-6 21:22
每次顯示完后,加個(gè)1us延遲試試呢
作者: 188610329    時(shí)間: 2023-1-6 22:17
你消了個(gè)寂寞,把所有的p0=0xff,都改成p1=0x00才是消影。
作者: LLL2022    時(shí)間: 2023-1-9 09:42
wulin 發(fā)表于 2023-1-6 16:37
用外部中斷讀取按鍵信號(hào),消抖是個(gè)問題。仿真按鍵不會(huì)抖動(dòng),如果用簡單的延時(shí)消抖方法會(huì)導(dǎo)致動(dòng)態(tài)數(shù)碼管顯示 ...

十分感謝,代碼成功運(yùn)行,目前還在學(xué)習(xí)消化中
作者: LLL2022    時(shí)間: 2023-1-9 09:48
上善-若水 發(fā)表于 2023-1-6 19:31
數(shù)碼管動(dòng)態(tài)顯示有閃爍主要是由于延時(shí)時(shí)間選擇不當(dāng)造成的 主要檢查延時(shí)方面的語句

嗯嗯,但我現(xiàn)在試了之前的代碼發(fā)現(xiàn)又可以了,導(dǎo)致現(xiàn)在驗(yàn)證不了
作者: LLL2022    時(shí)間: 2023-1-9 09:48
huazhaojiu 發(fā)表于 2023-1-6 21:22
每次顯示完后,加個(gè)1us延遲試試呢

嗯嗯,但我現(xiàn)在試了之前的代碼發(fā)現(xiàn)又可以了,導(dǎo)致現(xiàn)在驗(yàn)證不了
作者: LLL2022    時(shí)間: 2023-1-9 09:52
188610329 發(fā)表于 2023-1-6 22:17
你消了個(gè)寂寞,把所有的p0=0xff,都改成p1=0x00才是消影。

我選用的是共陽極數(shù)碼管,P0是段選   所以我覺得P0=0xff  是消影沒錯(cuò)
作者: 人中狼    時(shí)間: 2023-1-9 11:18
缺電路圖,所以不好說,數(shù)碼管的顯示最好放在定時(shí)器中斷里
作者: lkc8210    時(shí)間: 2023-1-9 11:40
LLL2022 發(fā)表于 2023-1-9 09:52
我選用的是共陽極數(shù)碼管,P0是段選   所以我覺得P0=0xff  是消影沒錯(cuò)

P0=0xff 是可以消影,沒錯(cuò)
但代碼次序錯(cuò)了
你現(xiàn)在是
段選消影->段選顯示->位選改變

正確次序應(yīng)該是
段選消影->位選改變->段選顯示
作者: LLL2022    時(shí)間: 2023-1-9 14:06
人中狼 發(fā)表于 2023-1-9 11:18
缺電路圖,所以不好說,數(shù)碼管的顯示最好放在定時(shí)器中斷里

嗯嗯,我之后會(huì)去嘗試的
作者: LLL2022    時(shí)間: 2023-1-9 14:08
lkc8210 發(fā)表于 2023-1-9 11:40
P0=0xff 是可以消影,沒錯(cuò)
但代碼次序錯(cuò)了
你現(xiàn)在是

嗯嗯,謝謝,我發(fā)現(xiàn)我改不改次序最終效果都可以實(shí)現(xiàn),因此我還是有點(diǎn)懵,但我之后會(huì)注意次序這方面的問題。




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