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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 2760 | 評論數: 19 | 收藏 1
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-11-9 18:57

正文摘要:

單片機按鍵實驗,有兩個問題想請教 1.如圖,只有8多了一個小點,但是不知道代碼如何改才能去掉小點? 2.獨立按鍵k3,k4沒有反應,只有1,2可以控制,代碼如何改。代碼放在這里,感謝。 單片機源程序如下: # ...

回復

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




ID:624769 發表于 2021-11-11 20:53

你說的,在別的“單片機”上,是指別的單片機裝在這塊板子上,還是這個代碼,寫到另一塊同樣板子的單片機上?
ID:824490 發表于 2021-11-11 09:17
一天多了。還沒搞定?
如果只是LED亂顯示,這個故障其實用很簡單的方法就能找出問題所在了:
代碼先所有段不亮,再一段一段地點亮,看實際效果,
所有段不點亮,但“DP”還是亮了,說明硬件肯定壞了。重點就在鎖存器;
一段一段地點,只有某段亮時,“DP”亮了,說明該段與“DP”存在短路,可能是PCB、也可能是鎖存器;
如果都是正常的,說明是之前的代碼有問題。
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. }  
復制代碼








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

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

你這里的 <= 加上后目標未創建,去掉后才可以運行。但是還是沒有把.去掉。可是這個代碼在別的單片機上也是有.的
ID:624769 發表于 2021-11-10 17:48

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

DU = 1;//打開段選鎖存器
P0 = tabel[num];//
_nop_();
_nop_();                       <=  你在這里 加兩個nop 看看能不能有效果, 如果有效就湊活著用,如果無效,只能聯系賣家看能不能換了,這個屬于硬件問題了。
DU = 0;//鎖存段選數據
ID:976910 發表于 2021-11-10 17:34
188610329 發表于 2021-11-10 16:34
警告不用管,沒有調用那個數組,只要恢復那個  P0 = tabel[num];  警告就沒了,你照著這樣寫進單片機, ...

是的,只有點亮了
ID:624769 發表于 2021-11-10 16:34

警告不用管,沒有調用那個數組,只要恢復那個  P0 = tabel[num];  警告就沒了,你照著這樣寫進單片機,看看除了 .  還有什么段是亮的, 好分析是什么位子出了問題, 基本可以確定,你程序沒有問題,是板子的硬件問題。就看看有沒有可能自己排除。
ID:976910 發表于 2021-11-10 16:07
wulin 發表于 2021-11-10 14:00
這是按普中的相關電路做的仿真

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

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


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

感謝回復,但是問題沒有解決。8還是會有點,每個8都有,且獨立按鍵3雖然有反應,但是只是對數字閃爍了一下,按鍵4還是沒有反應
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. }  
復制代碼
ID:624769 發表于 2021-11-9 22:08
茴香打鹵面 發表于 2021-11-9 21:49
還是不對,0到8有點,8到0也有點,每個8都有

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

你把這句:                P0 = tabel[num];//
變成 P0= 0x80;  看看除了  點, 還有哪個段會亮?(正常的話,應該只有點會亮)
ID:976910 發表于 2021-11-9 21:53
Hephaestus 發表于 2021-11-9 20:35
0x7f沒錯,問題肯定不在這里。

大哥認為錯在哪里?可以指點一下嗎
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都有
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沒錯,問題肯定不在這里。
ID:220661 發表于 2021-11-9 20:10
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
修改這里的第9個
ID:624769 發表于 2021-11-9 20:00
       WE = 1;//打開位選鎖存器
        P0 = 0XFE; //1111 1110
        WE = 0;//鎖存位選數據

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

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97超碰免费 | 亚洲成人黄色 | 日本亚洲一区 | 成人在线一区二区 | 欧美视频xxx | 在线国产小视频 | 欧美色视频免费 | 欧美1区2区| 欧美 中文字幕 | 美国黄色毛片 | 国产伦精品一区二区 | 巨大黑人极品videos精品 | 天天激情综合 | 久久久国产一区二区三区 | 国产免费福利小视频 | 久久综合一区 | 国产精品乱码一二三区的特点 | 天天操夜夜看 | 成人精品网 | 亚洲精品一区二区网址 | 韩日视频在线观看 | 亚洲视频在线观看一区二区三区 | 成人在线播放网站 | 四虎成人av| 华丽的挑战在线观看 | 精品一区二区在线视频 | 日韩久久久久 | 久久91 | 欧美综合一区二区 | 精品国产成人 | 在线色网 | 神马影院一区二区三区 | 久久精品国产免费看久久精品 | 免费久久网 | 男女网站免费观看 | 亚洲国产高清高潮精品美女 | 亚洲精品一级 | www97影院| 欧美激情欧美激情在线五月 | 日本精品一区二区 | 在线观看国产 |