久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2406|回復: 19
打印 上一主題 下一主題
收起左側

單片機按鍵數字顯示8會多一個點?代碼怎么改

[復制鏈接]
跳轉到指定樓層
樓主
單片機按鍵實驗,有兩個問題想請教
1.如圖,只有8多了一個小點,但是不知道代碼如何改才能去掉小點?
2.獨立按鍵k3,k4沒有反應,只有1,2可以控制,代碼如何改。代碼放在這里,感謝。

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit DU = P2^6;//數碼管段選
  6. sbit WE = P2^7;//數碼管段選
  7. sbit key_s2 = P3^0;//獨立按鍵S2
  8. sbit key_s3 = P3^1;//獨立按鍵S3
  9. sbit key_s4 = P3^2;//獨立按鍵S4
  10. sbit key_s5 = P3^3;//獨立按鍵S5
  11. sbit beep=P2^3;
  12. uchar num;//數碼管顯示的值

  13. //共陰數碼管段選表0-9
  14. uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
  15. uchar i;


  16. //毫秒級延時函數定義
  17. void delay(uint z)
  18. {
  19.         uint x,y;
  20.         for(x = z; x > 0; x--)
  21.                 for(y = 114; y > 0 ; y--);                 
  22. }

  23. void main()
  24. {
  25.         WE = 1;//打開位選鎖存器
  26.         P0 = 0XFE; //1111 1110
  27.         WE = 0;//鎖存位選數據
  28.         
  29.         while(1)
  30.         {
  31.                 if(key_s2 == 0)//判斷S2是否被按下
  32.                 {
  33.                         delay(20);//按鍵消抖
  34.                         if(key_s2 == 0)
  35.                         {
  36.                                 if(num != 9)//如果值不等于9則+1,功能把值限定為小于9
  37.                                 num++;
  38.                                 while(!key_s2);//松手檢測
  39.                         }        
  40.                 }
  41.                 if(key_s3 == 0)//判斷S3是否被按下
  42.                 {
  43.                         delay(20);//按鍵消抖
  44.                         if(key_s3 == 0)
  45.                         {
  46.                                 if(num > 0)        //如果大于0則執行減一
  47.                                         num--;
  48.                                 while(!key_s3);//松手檢測
  49.                         }        
  50.                 }
  51.                 //松手之后刷新顯示
  52.                 DU = 1;//打開段選鎖存器
  53.                 P0 = tabel[num];//
  54.                 DU = 0;//鎖存段選數據

  55.                 if(key_s4==0)//判斷S3是否被按下
  56.                 {
  57.                   delay(20); //按鍵消抖
  58.                   if(key_s4==0)
  59.                   {
  60.                     //while(key_s4==0)//按下S3時循環這個LED燈
  61.                          while(key_s2==1&&key_s3==1&&key_s5==1)//按下S3時循環這個LED燈
  62.                         {
  63.                         P1=0x7e;
  64.             delay(150);
  65.             P1=0xbd;
  66.             delay(150);
  67.             P1=0xdb;
  68.             delay(150);
  69.             P1=0xe7;
  70.             delay(150);
  71.             P1=0x00;
  72.             delay(150);
  73.                    }
  74.                         while(key_s2==0||key_s3==0||key_s5==0);        //松手檢測
  75.                         {
  76.                   P1=0xff;
  77.                 }
  78.                   }
  79.                  
  80.                     
  81.                 }
  82.                 if(key_s5==0)
  83.                 {
  84.                           delay(20);
  85.                         if(key_s5==0)
  86.                         {
  87.                           beep=0;
  88.                         }
  89.                         while(!key_s5);
  90.                 }
  91.         }        
  92. }  
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-11-9 20:00 | 只看該作者
       WE = 1;//打開位選鎖存器
        P0 = 0XFE; //1111 1110
        WE = 0;//鎖存位選數據

這里的 P0 = 0;    8個燈都開看看情況,是每個8都多點,還是只有第一個 8 多點。
回復

使用道具 舉報

板凳
ID:220661 發表于 2021-11-9 20:10 | 只看該作者
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
修改這里的第9個
回復

使用道具 舉報

地板
ID:883242 發表于 2021-11-9 20:35 | 只看該作者
gongnn 發表于 2021-11-9 20:10
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
修改這里的第9個

0x7f沒錯,問題肯定不在這里。
回復

使用道具 舉報

5#
ID:976910 發表于 2021-11-9 21:49 | 只看該作者
188610329 發表于 2021-11-9 20:00
WE = 1;//打開位選鎖存器
        P0 = 0XFE; //1111 1110
        WE = 0;//鎖存位選數據

還是不對,0到8有點,8到0也有點,每個8都有
回復

使用道具 舉報

6#
ID:976910 發表于 2021-11-9 21:53 | 只看該作者
Hephaestus 發表于 2021-11-9 20:35
0x7f沒錯,問題肯定不在這里。

大哥認為錯在哪里?可以指點一下嗎
回復

使用道具 舉報

7#
ID:624769 發表于 2021-11-9 22:08 | 只看該作者
茴香打鹵面 發表于 2021-11-9 21:49
還是不對,0到8有點,8到0也有點,每個8都有

我知道不對,我只是看看是電路問題,還是數碼管問題,現在基本可以認為是電路問題了,

你把這句:                P0 = tabel[num];//
變成 P0= 0x80;  看看除了  點, 還有哪個段會亮?(正常的話,應該只有點會亮)
回復

使用道具 舉報

8#
ID:213173 發表于 2021-11-10 06:55 | 只看該作者
茴香打鹵面 發表于 2021-11-9 21:53
大哥認為錯在哪里?可以指點一下嗎

樓主沒有按照實驗板實際電路寫程序,出現奇怪現象是必然的。建議樓主先用此板配套示例程序測試,熟悉后再按自己意圖修改。隨便把別人的程序加自己意圖胡亂修改不會取得成功。給樓主按普中實驗板電路修改代碼,基本符合樓主意圖。
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. //sbit DU = P2^6;//數碼管段選
  6. //sbit WE = P2^7;//數碼管段選
  7. sbit key_s1 = P3^1;//獨立按鍵S1
  8. sbit key_s2 = P3^0;//獨立按鍵S2
  9. sbit key_s3 = P3^2;//獨立按鍵S3
  10. sbit key_s4 = P3^3;//獨立按鍵S4
  11. sbit beep=P1^5;
  12. uchar num;//數碼管顯示的值

  13. //共陰數碼管段選表0-9
  14. uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
  15. uchar i;


  16. //毫秒級延時函數定義
  17. void delay(uint z)
  18. {
  19.         uint x,y;
  20.         for(x = z; x > 0; x--)
  21.                 for(y = 114; y > 0 ; y--);
  22. }

  23. void main()
  24. {
  25.         beep=0;
  26. //        WE = 1;//打開位選鎖存器
  27.         P0 = tabel[num];
  28. //        WE = 0;//鎖存位選數據       
  29.         while(1)
  30.         {
  31.                 if(key_s1 == 0)//判斷S2是否被按下
  32.                 {
  33.                         delay(20);//按鍵消抖
  34.                         if(key_s1 == 0)
  35.                         {
  36.                                 if(num < 9)//如果值不等于9則+1,功能把值限定為小于9
  37.                                 {
  38.                                         num++;
  39.                                         P0 = tabel[num];
  40.                                 }
  41.                                 while(!key_s1);//松手檢測
  42.                         }        
  43.                 }
  44.                 if(key_s2 == 0)//判斷S3是否被按下
  45.                 {
  46.                         delay(20);//按鍵消抖
  47.                         if(key_s2 == 0)
  48.                         {
  49.                                 if(num > 0)        //如果大于0則執行減一
  50.                                 {
  51.                                         num--;
  52.                                         P0 = tabel[num];
  53.                                 }
  54.                                 while(!key_s2);//松手檢測
  55.                         }        
  56.                 }
  57.                 //松手之后刷新顯示
  58. //                DU = 1;//打開段選鎖存器
  59. //                P0 = tabel[num];//
  60. //                DU = 0;//鎖存段選數據
  61.        
  62.                 if(key_s3==0)//判斷S3是否被按下
  63.                 {
  64.                         delay(20); //按鍵消抖
  65.                         if(key_s3==0)
  66.                         {
  67.                                 //while(key_s4==0)//按下S3時循環這個LED燈
  68.                                 while(!key_s3)//按下S3時循環這個LED燈
  69.                                 {
  70.                                         P0 = 0x00;//關閉數碼管
  71.                                         P2=~(0x01<<i);//流水燈
  72.                                         delay(500);
  73.                                         i=++i%8;//循環計數
  74.                                 }
  75. //                                while(key_s1==0||key_s2==0||key_s4==0);        //松手檢測
  76. //                                {
  77.                                 i=0;//清0
  78.                                 P0 = tabel[num];//開數碼管
  79.                                 P2=0xff;//關閉流水燈
  80. //                                }
  81.                         }
  82.                 }
  83.                 if(key_s4==0)
  84.                 {
  85.                         delay(20);
  86.                         if(key_s4==0)
  87.                         {
  88.                                 beep=1;
  89.                         }
  90.                         while(!key_s4);
  91.                         beep=0;
  92.                 }
  93.         }        
  94. }  
復制代碼
回復

使用道具 舉報

9#
ID:976910 發表于 2021-11-10 12:34 | 只看該作者
wulin 發表于 2021-11-10 06:55
樓主沒有按照實驗板實際電路寫程序,出現奇怪現象是必然的。建議樓主先用此板配套示例程序測試,熟悉后再 ...

感謝回復,但是問題沒有解決。8還是會有點,每個8都有,且獨立按鍵3雖然有反應,但是只是對數字閃爍了一下,按鍵4還是沒有反應
回復

使用道具 舉報

10#
ID:213173 發表于 2021-11-10 14:00 | 只看該作者
茴香打鹵面 發表于 2021-11-10 12:34
感謝回復,但是問題沒有解決。8還是會有點,每個8都有,且獨立按鍵3雖然有反應,但是只是對數字閃爍了一 ...

這是按普中的相關電路做的仿真


回復

使用道具 舉報

11#
ID:976910 發表于 2021-11-10 16:04 來自手機 | 只看該作者
188610329 發表于 2021-11-9 22:08
我知道不對,我只是看看是電路問題,還是數碼管問題,現在基本可以認為是電路問題了,

你把這句:     ...

一個警告

B0DC5413-3D55-4412-82C4-1B278B63E282.jpeg (78.82 KB, 下載次數: 43)

B0DC5413-3D55-4412-82C4-1B278B63E282.jpeg
回復

使用道具 舉報

12#
ID:976910 發表于 2021-11-10 16:07 來自手機 | 只看該作者
wulin 發表于 2021-11-10 14:00
這是按普中的相關電路做的仿真

很厲害,雖然我看不懂
回復

使用道具 舉報

13#
ID:624769 發表于 2021-11-10 16:34 | 只看該作者

警告不用管,沒有調用那個數組,只要恢復那個  P0 = tabel[num];  警告就沒了,你照著這樣寫進單片機,看看除了 .  還有什么段是亮的, 好分析是什么位子出了問題, 基本可以確定,你程序沒有問題,是板子的硬件問題。就看看有沒有可能自己排除。
回復

使用道具 舉報

14#
ID:976910 發表于 2021-11-10 17:34 | 只看該作者
188610329 發表于 2021-11-10 16:34
警告不用管,沒有調用那個數組,只要恢復那個  P0 = tabel[num];  警告就沒了,你照著這樣寫進單片機, ...

是的,只有點亮了
回復

使用道具 舉報

15#
ID:624769 發表于 2021-11-10 17:48 | 只看該作者

我懷疑…… 鎖存器這里可能有問題,當拉高多的引腳電平時會把 7 腳位一起拉高。

DU = 1;//打開段選鎖存器
P0 = tabel[num];//
_nop_();
_nop_();                       <=  你在這里 加兩個nop 看看能不能有效果, 如果有效就湊活著用,如果無效,只能聯系賣家看能不能換了,這個屬于硬件問題了。
DU = 0;//鎖存段選數據
回復

使用道具 舉報

16#
ID:976910 發表于 2021-11-10 21:19 | 只看該作者
188610329 發表于 2021-11-10 17:48
我懷疑…… 鎖存器這里可能有問題,當拉高多的引腳電平時會把 7 腳位一起拉高。

DU = 1;//打開段選鎖 ...

你這里的 <= 加上后目標未創建,去掉后才可以運行。但是還是沒有把.去掉。可是這個代碼在別的單片機上也是有.的
回復

使用道具 舉報

17#
ID:213173 發表于 2021-11-11 06:43 | 只看該作者
茴香打鹵面 發表于 2021-11-10 16:07
很厲害,雖然我看不懂

樓主什么看不懂?電路看不懂還是代碼看不懂?在8樓回復的文字總該能看懂吧。你這個程序可以在天祥實驗板上運行,不可以在普中實驗板上運行。因為兩者單片機雖然相同但其它外圍電路差異很大。這是用你的原程序按天祥的相關電路做的仿真,只改了按鍵端口定義和添加beep=1復位,其它未做任何改動。你探討其它細枝末葉都是隔靴瘙癢。
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit DU = P2^6;//數碼管段選
  6. sbit WE = P2^7;//數碼管段選
  7. sbit key_s2 = P3^4;//獨立按鍵S2
  8. sbit key_s3 = P3^5;//獨立按鍵S3
  9. sbit key_s4 = P3^6;//獨立按鍵S4
  10. sbit key_s5 = P3^7;//獨立按鍵S5
  11. sbit beep=P2^3;
  12. uchar num;//數碼管顯示的值

  13. //共陰數碼管段選表0-9
  14. uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
  15. uchar i;


  16. //毫秒級延時函數定義
  17. void delay(uint z)
  18. {
  19.         uint x,y;
  20.         for(x = z; x > 0; x--)
  21.         for(y = 114; y > 0 ; y--);                 
  22. }

  23. void main()
  24. {
  25.         WE = 1;//打開位選鎖存器
  26.         P0 = 0XFE; //1111 1110
  27.         WE = 0;//鎖存位選數據
  28.        
  29.         while(1)
  30.         {
  31.                 if(key_s2 == 0)//判斷S2是否被按下
  32.                 {
  33.                         delay(20);//按鍵消抖
  34.                         if(key_s2 == 0)
  35.                         {
  36.                                 if(num != 9)//如果值不等于9則+1,功能把值限定為小于9
  37.                                 num++;
  38.                                 while(!key_s2);//松手檢測
  39.                         }        
  40.                 }
  41.                 if(key_s3 == 0)//判斷S3是否被按下
  42.                 {
  43.                                 delay(20);//按鍵消抖
  44.                         if(key_s3 == 0)
  45.                         {
  46.                                 if(num > 0)        //如果大于0則執行減一
  47.                                         num--;
  48.                                 while(!key_s3);//松手檢測
  49.                         }        
  50.                 }
  51.                 //松手之后刷新顯示
  52.                 DU = 1;//打開段選鎖存器
  53.                 P0 = tabel[num];//
  54.                 DU = 0;//鎖存段選數據
  55.        
  56.                 if(key_s4==0)//判斷S3是否被按下
  57.                 {
  58.                         delay(20); //按鍵消抖
  59.                         if(key_s4==0)
  60.                         {
  61.                                 //while(key_s4==0)//按下S3時循環這個LED燈
  62.                                 while(key_s2==1&&key_s3==1&&key_s5==1)//按下S3時循環這個LED燈
  63.                                 {
  64.                                         P1=0x7e;
  65.                                         delay(150);
  66.                                         P1=0xbd;
  67.                                         delay(150);
  68.                                         P1=0xdb;
  69.                                         delay(150);
  70.                                         P1=0xe7;
  71.                                         delay(150);
  72.                                         P1=0x00;
  73.                                         delay(150);
  74.                                 }
  75.                                 while(key_s2==0||key_s3==0||key_s5==0);        //松手檢測
  76.                                 {
  77.                                         P1=0xff;
  78.                                 }
  79.                         }
  80.                 }
  81.                 if(key_s5==0)
  82.                 {
  83.                         delay(20);
  84.                         if(key_s5==0)
  85.                         {
  86.                                 beep=0;
  87.                         }
  88.                         while(!key_s5);
  89.                         beep=1;
  90.                 }
  91.         }        
  92. }  
復制代碼








回復

使用道具 舉報

18#
ID:824490 發表于 2021-11-11 09:17 | 只看該作者
一天多了。還沒搞定?
如果只是LED亂顯示,這個故障其實用很簡單的方法就能找出問題所在了:
代碼先所有段不亮,再一段一段地點亮,看實際效果,
所有段不點亮,但“DP”還是亮了,說明硬件肯定壞了。重點就在鎖存器;
一段一段地點,只有某段亮時,“DP”亮了,說明該段與“DP”存在短路,可能是PCB、也可能是鎖存器;
如果都是正常的,說明是之前的代碼有問題。
回復

使用道具 舉報

19#
ID:624769 發表于 2021-11-11 20:53 | 只看該作者

你說的,在別的“單片機”上,是指別的單片機裝在這塊板子上,還是這個代碼,寫到另一塊同樣板子的單片機上?
回復

使用道具 舉報

20#
ID:690831 發表于 2021-11-12 03:08 | 只看該作者
主函數里最簡化,只寫
P0=0x00;
燒進單片機通電,用萬用表測試P0八個管腳電平和對應排針的電平,正常情況應該都是低電平。如果有異常,就要自己跑電路了
還有要注意就是,把除了P30和P31之外的無用連接拔掉。我看到是紅圈圈里的跳線,紅外接收器,溫度IC,或者還有其他,自己檢查。




回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品久久 | 日韩精品视频在线 | 欧美亚洲国产一区二区三区 | 一级免费毛片 | 人碰人操| 秋霞a级毛片在线看 | 一区二区三区视频在线 | 欧美日韩一二三区 | 久久久国产一区二区三区四区小说 | 久草在线 | 欧美一区免费 | 日韩精品免费在线观看 | 九九热精品视频在线观看 | 少妇特黄a一区二区三区88av | 欧美成人第一页 | 伊人精品久久久久77777 | 久久久久国产精品免费免费搜索 | 噜噜噜色网 | 奇米影视首页 | 97超碰成人| 久久久久久久久99 | 日韩成人专区 | 免费中文字幕 | 亚洲日本一区二区 | 国产一区免费视频 | 日韩激情视频一区 | 欧美一区永久视频免费观看 | 久久久久一区 | 亚洲欧美日韩精品久久亚洲区 | 麻豆久久久久 | 在线看91 | 日本免费在线 | 国产性生活一级片 | 国产高清视频在线 | 日本欧美国产 | 毛片免费视频 | 日韩国产免费观看 | 色播av| 日本超碰| japan21xxxxhd美女 日本欧美国产在线 | 亚洲福利在线视频 |