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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用單片機+數碼管做計算器時運行結果出行混亂 求解

[復制鏈接]
ID:825447 發表于 2020-10-8 09:47 | 顯示全部樓層 |閱讀模式
50黑幣
這是一個加法運算,運行到最后得出結果是出行亂碼,顯示數字是動態亂碼,求解!!!
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  5.                                                                                 0x66,0x6d,0x7d,0x07,
  6.                                                                                 0x7f,0x6f};
  7. void delay( uint m )                                        //延時函數
  8. {
  9.         uint x , y ;
  10.         for( x = m ; x > 0 ; x--)
  11.                 for( y = 110 ; y > 0 ; y--);
  12. }        
  13. sbit beep = P2^2  ;                                  //蜂鳴器
  14. uchar firstflot = 0 ;




  15. int keyscan()                                                        //掃描鍵盤
  16. {
  17.         int temp, num ;
  18.         P2=0x7f;
  19.         temp=P2;
  20.         temp=temp&0x0f;                        //判斷第一行按鍵
  21.         if(temp != 0x0f )
  22.         {
  23.                 delay( 10 ) ;
  24.                 temp = P2 ;                //重讀P2口值
  25.                 temp = temp & 0x0f ;
  26.                 if( temp != 0x0f )
  27.                 {
  28.                         temp = P2 ;
  29.                         switch(temp)
  30.                         {
  31.                                 case 0x77:        num=1;                                //1
  32.                                                                                 firstflot=1 ;
  33.                                                                                 break;               
  34.                                 case 0x7b:        num=2;                        //2
  35.                                                                                 firstflot=1 ;
  36.                                                                                 break;               
  37.                                 case 0x7d:        num=3;                        //3
  38.                                                                                 firstflot=1 ;
  39.                                                                                 break;
  40.                                 case 0x7e:  num = '+' ;                //+
  41.                                                                                 break;
  42.                         }
  43.                         while(temp != 0x0f)                        //等待按鍵釋放
  44.                         {
  45.                                 temp = P2;
  46.                                 temp = temp & 0x0f;
  47.                         }
  48.                 }
  49.         }
  50.         P2 = 0xbf ;                                                                //掃描第二行鍵盤
  51.         temp = P2 ;
  52.         temp = temp & 0x0f;
  53.         if( temp != 0x0f )
  54.         {
  55.                 delay( 10 ) ;                                //消抖
  56.                 temp = P2 ;
  57.                 temp = temp & 0x0f ;
  58.                 if( temp != 0x0f )
  59.                 {
  60.                         temp = P2 ;
  61.                         switch( temp )
  62.                         {
  63.                                 case 0xb7:        num=4;                                //4
  64.                                                                                 firstflot=1 ;
  65.                                                                                 break;
  66.                                 case 0xbb:        num=5;                        //5
  67.                                                                                 firstflot=1 ;
  68.                                                                                 break;
  69.                                 case 0xbd:        num=6;                        //6
  70.                                                                                 firstflot=1 ;
  71.                                                                                 break;
  72.                                 case 0xbe:        num = '-' ;                //-
  73.                                                                                 break;
  74.                         }
  75.                 while( temp != 0x0f )
  76.                 {
  77.                         temp = P2 ;
  78.                         temp = temp & 0x0f ;
  79.                 }
  80.          }
  81. }
  82.         P2 = 0xdf ;                                        //掃描第三行鍵盤
  83.         temp = P2 ;
  84.         temp = temp & 0x0f ;
  85.         if( temp != 0x0f )
  86.         {
  87.                 delay( 10 ) ;                                        //消抖
  88.                 temp = P2 ;
  89.                 temp = temp & 0x0f ;
  90.                 if( temp != 0x0f )
  91.                 {
  92.                         temp = P2 ;
  93.                         switch( temp )
  94.                         {
  95.                                 case 0xd7:        num=7;                        //7
  96.                                                                                 firstflot=1 ;
  97.                                                                                 break;
  98.                                 case 0xdb:  num=8;                        //8
  99.                                                                                 firstflot=1 ;
  100.                                                                                 break;
  101.                                 case 0xdd:        num=9;                        //9
  102.                                                                                 firstflot=1 ;
  103.                                                                                 break;
  104.                                 case 0xde:        num = '*'        ;        //*
  105.                                                                                 break;
  106.                         }
  107.                         while( temp != 0x0f )
  108.                         {
  109.                                 temp = P2;
  110.                                 temp = temp & 0x0f ;
  111.                         }
  112.                 }
  113.         }
  114.         P2 = 0xef ;                                                //掃描第四行鍵盤
  115.         temp = P2 ;
  116.         temp = temp & 0x0f ;
  117.         if( temp != 0x0f )
  118.         {
  119.                 delay( 10 ) ;                                //消抖
  120.                 temp = P2 ;
  121.                 temp = temp & 0x0f;
  122.                 if( temp != 0x0f )
  123.                 {
  124.                         temp = P2 ;
  125.                         switch( temp )
  126.                         {
  127. //                                case 0xe7:        printf("num%s",onn)                //歸0
  128. //                                                                                break;
  129.                                 case 0xeb:        num = 0 ;                                                //0
  130.                                                                                 firstflot=1 ;
  131.                                                                                 break;
  132.                                 case 0xed:        num = '=' ;                        //=
  133.                                                                                 break;
  134.                                 case 0xee:        num = '/' ;                                //除
  135.                                                                                 break;
  136.                         }
  137.                 }
  138.         }
  139.         return num ;
  140. }



  141. int modern()                                //輸入與計算
  142. {
  143.         int second = 0 ,  m , n  ; //操作符
  144.         P0 = 0x7f ;                                                 //初始化數碼管 0
  145.         P1 = table[0];
  146.         delay(1);
  147.         while(1)
  148.         {
  149.                 keyscan() ;
  150.                 init:                                                                                //返回標記處
  151.                 if(firstflot==1)                                                        //給m賦值
  152.                 {
  153.                                 P0 = 0x7f ;
  154.                                 m = keyscan() ;
  155.                                 P1 = table[ m ] ;
  156.                           delay( 1 ) ;
  157.                                 second=1 ;
  158.                                 firstflot = 0 ;
  159.                 }
  160.                         if(second==1)
  161.                         {
  162.                                 while(1)
  163.                                 {        
  164.                                                 keyscan() ;
  165.                                                 if(firstflot==1)
  166.                                                 {
  167.                                                         P0 = 0x7f ;
  168.                                                         n = keyscan() ;
  169.                                                         P1 = table[ n ] ;
  170.                                                         beep = 0 ;                                                //蜂鳴器置加點
  171.                                                         delay( 1 );                                                //關
  172.                                                         firstflot = 0 ;                                //重新設
  173.                                                         second = 0 ;
  174.                                                         goto init ;
  175.                                                 }
  176.                                         }
  177.                         }
  178.                 if(keyscan() == '+' || keyscan() == '-' || keyscan() == '*' || keyscan() == '/' )
  179.                 {
  180.                         P0 = 0xff ;                                                //關閉
  181.                         beep = 1 ;                                                //蜂鳴器開
  182.                         second = 1 ;
  183.                         delay( 1 ) ;
  184.                         goto  init ;
  185.                 }
  186.                 if(        keyscan() == '=' )                                //等號
  187.                 {
  188.                                 m += n ;                                                //計算加法
  189.                                 return m ;        
  190.                 }
  191.         }
  192. }



  193. void display_1(int a)
  194. {
  195.         P0 = 0xbf ;
  196.         P1= table[a/10] ;                                //十位
  197.         delay(1) ;
  198.         P0 = 0x7f ;
  199.         P1 = table[a%10] ;                                //個位
  200.         delay(1) ;
  201. }
  202. int main()
  203. {
  204.         while(1)
  205.         {
  206.                 display_1( modern());                        
  207.         }
  208. }
復制代碼

最佳答案

查看完整內容

通常我會用數碼管顯示跟蹤程序運行過程,這樣就可以判斷是哪里發生問題,看我示例尾部有一行注釋掉的就是調試跟蹤用的。 寫成獨立的函數有利于代碼的維護,否則會看得很累。
回復

使用道具 舉報

ID:332444 發表于 2020-10-8 09:47 | 顯示全部樓層
通常我會用數碼管顯示跟蹤程序運行過程,這樣就可以判斷是哪里發生問題,看我示例尾部有一行注釋掉的就是調試跟蹤用的。
寫成獨立的函數有利于代碼的維護,否則會看得很累。
回復

使用道具 舉報

ID:332444 發表于 2020-10-8 11:39 | 顯示全部樓層
回復

使用道具 舉報

ID:61390 發表于 2020-10-8 12:22 | 顯示全部樓層
你端口寫錯了,不能與按鍵同用端口,把峰鳴器端口關掉,或移到P3,
回復

使用道具 舉報

ID:451718 發表于 2020-10-8 12:48 | 顯示全部樓層
這種情況一般都是端口復用造成的。  或者檢查一下有沒有干擾。
回復

使用道具 舉報

ID:825447 發表于 2020-10-9 16:15 | 顯示全部樓層
現在是按等號鍵m, n無法正確計算。大佬看看為什么
int modern()                                //輸入與計算
{
        int second = 0 ,  m , n , b ; //操作符
                keyscan() ;                                                                
                for(b=0; b<1; b++)
                {
                        if(firstflot==1)                                                        //給m賦值
                        {
                                        P0 = 0x7f ;
                                        m = keyscan() ;
                                        P1 = table[ m ] ;
                                        delay( 1 ) ;
        //                                second=1 ;
                                        firstflot = 0 ;
                        }
                }
                init:
                while(1)
                {
                        keyscan() ;
                        if(second==1)
                        {
                                while(1)
                                {       
                                                keyscan() ;
                                                if(firstflot==1)
                                                {
                                                        P0 = 0x7f ;
//                                                        n=6        ;
                                                        n = keyscan() ;
                                                        P1 = table[ n ] ;
                                                        beep = 0 ;                                                //蜂鳴器置加點
                                                        delay( 1 );                                                //關
                                                        firstflot = 0 ;                                //重新設
                                                        second = 0 ;
                                                        goto init ;
                                                }
                                        }
                        }
                if(keyscan() == '+' || keyscan() == '-' || keyscan() == '*' || keyscan() == '/' )
                {
                        P0 = 0xff ;                                                //關閉
                        beep = 1 ;                                                //蜂鳴器開
                        second = 1 ;
                        delay( 200 ) ;
                }
                if(        keyscan() == '=' )                                //等號
                {               
//                                m = 1 ;
//                                n        = 5 ;
                                m += n ;                                                //計算加法
                                return m ;       
                }
        }
回復

使用道具 舉報

ID:332444 發表于 2020-10-10 10:13 | 顯示全部樓層
可以在任何想觀察的地方調用數碼管顯示,充分利用人機交互界面,這樣會很輕松,沒那么多痛苦。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区在线免费 | 色久影院| 成人h视频在线 | 国产精品久久久久久久一区二区 | 国产xxxx岁13xxxxhd | 日韩欧美在线观看 | 一区二区三区视频免费看 | 在线视频三区 | 日本粉嫩一区二区三区视频 | 国产精品久久久久久久久久久免费看 | 国产精品网页 | 久久久青草婷婷精品综合日韩 | 奇米av| 欧美黄视频 | 一级免费在线视频 | 欧美日韩国产一区二区三区 | 中文字幕精品一区二区三区精品 | 日韩精品在线一区 | 91视频导航 | 国产欧美精品一区二区色综合 | 国产成人精品免高潮在线观看 | 国产精品久久久久久久久久三级 | 国产农村妇女毛片精品久久麻豆 | 国产免费一区二区 | 中文字幕在线电影观看 | 久久久久亚洲 | 欧美一a一片一级一片 | 国内精品免费久久久久软件老师 | 中文字幕一区二区三区四区五区 | 成人免费一区二区三区视频网站 | 亚洲国产成人精品女人久久久野战 | 一区二区三区成人 | www.久草| 麻豆av电影网 | 亚洲综合资源 | 男女视频在线观看 | 成人在线视频网站 | 国产高清在线精品一区二区三区 | 日p视频免费看 | 久久久久国产 | 亚洲精品一 |