找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1537|回复: 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. }
复制代码

最佳答案

查看完整内容

通常我会用数码管显示跟踪程序运行过程,这样就可以判断是哪里发生问题,看我示例尾部有一行注释掉的就是调试跟踪用的。 写成独立的函数有利于代码的维护,否则会看得很累。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-10-8 09:47 | 只看该作者
通常我会用数码管显示跟踪程序运行过程,这样就可以判断是哪里发生问题,看我示例尾部有一行注释掉的就是调试跟踪用的。
写成独立的函数有利于代码的维护,否则会看得很累。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-10-8 11:39 | 只看该作者
回复

使用道具 举报

地板
ID:61390 发表于 2020-10-8 12:22 | 只看该作者
你端口写错了,不能与按键同用端口,把峰鸣器端口关掉,或移到P3,
回复

使用道具 举报

5#
ID:451718 发表于 2020-10-8 12:48 | 只看该作者
这种情况一般都是端口复用造成的。  或者检查一下有没有干扰。
回复

使用道具 举报

6#
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 ;       
                }
        }
回复

使用道具 举报

7#
ID:332444 发表于 2020-10-10 10:13 | 只看该作者
可以在任何想观察的地方调用数码管显示,充分利用人机交互界面,这样会很轻松,没那么多痛苦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表