找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1709|回复: 1
收起左侧

10以内的计算器 单片机程序

[复制链接]
ID:589945 发表于 2019-8-19 15:55 | 显示全部楼层 |阅读模式
问题是按键时第一次和第二次按下时正常,按下第三个时一下子出3~4个相同的数求
批注 2019-08-19 150357.png

单片机源程序如下:
  1. #include<reg51.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. unsigned char code xianshi[16]={'*','0','#','=','7','8','9','/','4','5','6','-','1','2','3','+'};
  5. unsigned char code shu[16]={0,0,0,0,7,8,9,0,4,5,6,0,1,2,3,0};
  6. unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};

  7. #define      anjian P1
  8. #define      LCD_D  P2
  9. sbit         LCD_RS=P3^0;
  10. sbit         LCD_RW=P3^1;
  11. sbit         LCD_E=P3^2;

  12. u8 jianwei,i=0,jieguo;
  13. u8 zancun[4];

  14. void delay(u16 i)                                    
  15. {
  16.         while(i--);        
  17. }


  18. void delayms(u16 c)   //延时函数ms         误差 0us
  19. {
  20.     u8 a,b;
  21.         for (; c>0; c--)
  22.         {
  23.                  for (b=199;b>0;b--)
  24.                  {
  25.                           for(a=1;a>0;a--);
  26.                  }      
  27.         }            
  28. }

  29. void dat(u8 d)             //写入数据
  30. {
  31.   LCD_E=0;                            //关闭使能端
  32.   LCD_RW=0;                    //进入  写
  33.   LCD_RS=1;                           //选择 数据

  34.   LCD_D=d;                           //输入数据
  35.   delayms(1);                   //等待数据稳定

  36.   LCD_E=1;                           //打开使能端
  37.   delayms(5);                   //延时1ms
  38.   LCD_E=0;                           //关闭使能端

  39. }

  40. void junzhenanjian()
  41. {
  42.     u8 a;
  43.         anjian=0x0f;
  44.         if(anjian!=0x0f)
  45.         {        
  46.            delay(1000);             //消抖                                                                  
  47.            if(anjian!=0x0f)
  48.            {
  49.              anjian=0x0f;
  50.              switch(anjian)
  51.                {
  52.                 case(0x07): jianwei=0;break;
  53.                 case(0x0b): jianwei=1;break;
  54.                 case(0x0d): jianwei=2;break;
  55.                 case(0x0e): jianwei=3;break;
  56.                 }
  57.               anjian=0xf0;
  58.               switch(anjian)
  59.                 {
  60.                  case(0x70): jianwei=jianwei;   break;
  61.                  case(0xb0): jianwei=jianwei+4; break;
  62.                  case(0xd0): jianwei=jianwei+8; break;
  63.                  case(0xe0): jianwei=jianwei+12;break;
  64.                 }        
  65.                 while((a<50)&&(anjian!=0xf0))
  66.                 {
  67.               delay(1000);
  68.                        a++;
  69.                 }
  70.                         dat(xianshi[jianwei]);
  71.                         zancun[i]=jianwei;
  72.                         i++;
  73.                   }
  74.     }
  75. }



  76. void com(u8 c)             //写入命令
  77. {
  78.   LCD_E=0;                            //关闭使能端
  79.   LCD_RW=0;                    //进入 写
  80.   LCD_RS=0;                           //选择 命令

  81.   LCD_D=c;                           //输入命令
  82.   delayms(1);                   //等待数据稳定

  83.   LCD_E=1;                           //打开使能端
  84.   delayms(5);                   //延时1ms
  85.   LCD_E=0;                           //关闭使能端

  86. }



  87. void qingping()                 //清屏
  88. {
  89.   
  90.   com(0x06);                        //光标右移  
  91.   com(0x0c);                        //显示光标
  92.   com(0x38);                        //8线 1行  5×10
  93.   com(0x01);                        //清屏
  94.   com(0x80);                        //设置起点
  95. }

  96. void main()
  97. {
  98.     u8 shi,ge;
  99.     qingping();
  100.         while(1)
  101.         {
  102.          junzhenanjian();
  103.          if(i==4)
  104.          {
  105.             switch(zancun[1])
  106.                 {
  107.                 case(0):jieguo=(shu[zancun[0]]*shu[zancun[2]]);break;
  108.                 case(7):jieguo=(shu[zancun[0]]/shu[zancun[2]]);break;
  109.                 case(11):jieguo=(shu[zancun[0]]-shu[zancun[2]]);break;
  110.                 case(15):jieguo=(shu[zancun[0]]+shu[zancun[2]]);break;
  111.                 }
  112.                 if(jieguo>=10)
  113.                 {
  114.                    shi=jieguo/10;
  115.                    ge=jieguo-shi*10;
  116.                    dat(table[shi]);
  117.                    dat(table[ge]);
  118.                 }
  119.                 else
  120.                 dat(table[jieguo]);
  121.                 i=0;
  122.          }  
  123.         }
  124. }
复制代码


回复

使用道具 举报

ID:602844 发表于 2019-8-22 20:43 | 显示全部楼层
拿来学习,挺有用的。感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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