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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2297|回復: 6
收起左側

數碼管只顯示四位0,而且按鍵無反應,應該是單片機程序邏輯上的問題

[復制鏈接]
ID:447891 發表于 2019-5-29 23:53 | 顯示全部樓層 |閱讀模式
下面是原程序
  1. #include"math.h"
  2. #include "reg51.h"
  3. #define uchar unsigned char
  4. uchar key_temp,key=0,i,j,k,t=0;
  5. uchar a=0,b=0,c=0,d=0;
  6. unsigned long qian,hou;
  7. uchar table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  8. static unsigned char state_key=0;
  9. static unsigned char state_dis=0;


  10. void keyscan()
  11. {
  12.         switch(state_key)
  13. {
  14.         case 0:
  15.          key_temp=(P1&0x0f);
  16.          if(key_temp!=0x0f)
  17.          t=0;
  18.          state_key=1;
  19.    break;
  20.         case 1:
  21.                 if(t>=10)
  22.                 {
  23.                 if(key_temp==(P1&0x0f))
  24.                 {
  25.                   if(P1^0==0)
  26.                                 key=1;
  27.                         if(P1^1==0)
  28.                                 key=2;
  29.                         if(P1^2==0)
  30.                                 key=3;
  31.                         if(P1^3==0)
  32.                                 key=4;
  33.                 }
  34.                 state_key=2;
  35.                 }
  36.                   
  37.                   else
  38.                         state_key=0;
  39.                         break;        
  40.                
  41.         case 2:
  42.                 if(key_temp==(P1&0x0f))
  43.                 {
  44.                 state_key=0;
  45.                 break;
  46.                 }
  47.                 key=0;//default:break;
  48. }

  49. }

  50. void keyaction()
  51. {
  52. switch(key)
  53. {
  54.         case 1:break;
  55.         case 2:i=0;
  56.                      i++;
  57.                if(i>9)
  58.                break;
  59.         case 3:j=0;
  60.                                  if(j<=3)
  61.                                         j++;
  62.                                  switch(j)
  63.                                          {
  64.                                                  case 0:P3=0xfe;i++;break;
  65.                                                  case 1:P3=0xfd;i++;break;
  66.                                                  case 2:P3=0xfb;i++;break;
  67.                                                  case 3:P3=0xf7;i++;break;
  68.                                          }
  69.                                          break;
  70.         case 4: k=0;
  71.                       k++;
  72.                                         if(k==1)
  73.                                         hou=hou+qian;
  74.           qian=0;
  75.           if(k==2)
  76.           hou=hou+qian;
  77.           qian=0;
  78.           k=0;
  79.                                         break;                                       
  80. }
  81. }
  82. void display()
  83. {
  84. switch(j)
  85. {
  86.         case 0:P2=table[a];break;
  87.         case 1:P2=table[b][b];break;
  88.         case 2:P2=table[c];break;
  89.         case 3:P2=table[d];break;
  90. }
  91. }


  92. void display0()
  93. {

  94.         switch(state_dis)
  95. {
  96.         case 0:a=i;b=0;c=0;d=0;break;
  97.         case 1:b=i;c=0;d=0;break;
  98.         case 2:c=i;d=0;break;
  99.         case 3:d=i;break;
  100. }
  101. display();
  102. }



  103. void time0init()
  104. {
  105. TMOD=0x01;
  106.         TH0=-50000/256;
  107.          TL0=-50000%256;
  108.           EA=1;
  109.            ET0=1;
  110.             TR0=1;
  111. }



  112. void time0()interrupt 1
  113. {
  114. TH0=-50000/256;
  115. TL0=-50000%256;
  116. t++;
  117.                 if(state_dis<=3)
  118.                         state_dis++;
  119.                 else
  120.                   state_dis=0;
  121. }




  122. void main()
  123. {
  124.         time0init();
  125.   while(1)
  126.         {
  127.          keyscan();
  128.          keyaction();
  129.          display0();
  130.          switch(j)
  131.          {
  132.                  case 0:qian=a;break;
  133.                  case 1:qian=a+b*10;break;
  134.                  case 2:qian=a+b*10+c*100;break;
  135.                  case 3:qian=a+b*10+c*100+d*1000;break;
  136.          }
  137.         a=0;
  138.         b=0;
  139.         c=0;
  140.         d=0;

  141.         }
  142. }
復制代碼


數碼管只顯示四位0,而且按鍵無反應,應該是邏輯上的問題,實在找不到,求大神!
回復

使用道具 舉報

ID:96682 發表于 2019-5-30 06:52 | 顯示全部樓層
這源程序明顯被閹割過
回復

使用道具 舉報

ID:56665 發表于 2019-5-30 08:22 | 顯示全部樓層
定時器及中斷好像沒問題,按鍵和顯示程序認真檢查一下,這兩者其中一個出問題都會導致顯示0而沒有其它動作。
回復

使用道具 舉報

ID:447891 發表于 2019-5-30 08:27 | 顯示全部樓層
wc86110 發表于 2019-5-30 06:52
這源程序明顯被閹割過

這是我自己寫的程序,通過3位按鈕使用計算器
回復

使用道具 舉報

ID:319023 發表于 2019-5-30 11:20 | 顯示全部樓層
可以自己調試一下, main函數里先把數碼管用延時的方式都顯示一遍,沒有問題再調試按鍵。剛開始還要多看別人的代碼
回復

使用道具 舉報

ID:517466 發表于 2019-5-30 14:13 | 顯示全部樓層
1、keyaction()函數中
case 2:i=0;
                     i++;
               if(i>9)
               break;
        case 3:j=0;
                                 if(j<=3)
                                        j++;
這樣的處理邏輯,每次主函數進入這個函數后,P1^1或者P1^2在按下時,走case 2或case 3的分支,i和j永遠都是從0開始,加一次變成1,永遠不會有2以后的數字出現?你確定是需要做成這樣的邏輯?
2、display()函數中case 1:P2=table[b][b];break;,這個table[b][b]是什么意思?
3、keyscan函數中
case 0:
         key_temp=(P1&0x0f);
         if(key_temp!=0x0f)
         t=0;
         state_key=1;
的處理,無論是否有按鈕按下,state_key=1;都會被執行,下次進入case 1的分支,你確定這個邏輯正確?不是應該有按鈕按下了,下次才進入case 1,判斷是那個按鈕按下嗎?是不是改成
if(key_temp!=0x0f) {
         t=0;
         state_key=1;
}更合理一些?
按照你現在的掃描邏輯,即使沒有按鈕按下,case 0,case 1,case 2也會按照順序全都走一遍!

另外自己的程序,無論是變量的聲明,還是代碼,都沒有注釋,即使現在你能看懂。過段時間你再看未必能明白。既然編程,一定要養成寫注釋的良好習慣。
回復

使用道具 舉報

ID:213173 發表于 2019-5-30 14:46 | 顯示全部樓層
樓上都是亂猜的,這種最基礎最基礎的東西都是錯的怎么幫你???
                case 1:
                        if(t>=10)
                        {
                                if(key_temp==(P1&0x0f))
                                {
                                        if(P1^0==0)??????????
                                                key=1;
                                        if(P1^1==0)??????????
                                                key=2;
                                        if(P1^2==0)?????????
                                                key=3;
                                        if(P1^3==0)?????????
                                                key=4;
                                }
                                state_key=2;
                        }
                        else
                        state_key=0;
                        break;        
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区中文 | 视频在线一区 | 青青伊人久久 | 久久久久久成人 | 久久精品亚洲成在人线av网址 | 成人超碰| 天堂亚洲 | 国产精品中文字幕在线播放 | 国产成人99久久亚洲综合精品 | 亚洲国产精品第一区二区 | 免费国产一区二区 | 天天爽网站| 久久久久9999亚洲精品 | 久久久久久久久99精品 | 亚洲一区精品在线 | 久久99国产精一区二区三区 | 亚洲成人福利视频 | 天天拍天天射 | 亚洲五码久久 | 黄久久久 | 久久久久成人精品免费播放动漫 | 免费av一区二区三区 | 九色 在线 | 国产精品久久久久久一区二区三区 | 日韩激情在线 | 欧美大片在线观看 | 91看片网| 久久国产综合 | 俺去俺来也www色官网cms | 日本精品一区二区三区在线观看 | 日韩精品一区二区三区在线播放 | 成人午夜高清 | 超碰在线人人 | 欧美日韩高清一区 | 欧美日日| 美国一级黄色片 | 91精品久久久久久久久久入口 | www.99re | 久久精品国产一区二区三区不卡 | 美女爽到呻吟久久久久 | 免费在线一区二区三区 |