【单片机期中测试】5.LCD1602实现简单计算器

简介: 【单片机期中测试】5.LCD1602实现简单计算器

main.c如下

#include<reg52.h>
#include"1602.h"
#include"delay.h"
#define uc unsigned char
uc a=0,b=0,c=0,d=0,h=0,l=0,m=0,flag=0,s;     //a,b:两项;c:+-*/; d:运算结果
void delay(uc c1)
{  uc a1,b1;
  for(;c1>0;c1--)
    for(a1=38;a1>0;a1--)
      for(b1=130;b1>0;b1--);
} 
void main()
{
 LCD_Init();           //初始化液晶
 DelayMs(20);          //延时有助于稳定
 LCD_Clear();          //清屏
    while(1)
  {
    P1=0x0F;
    if(P1!=0x0F)
       {
      P1=0x0F; 
      switch(P1)  // 行判断
      {
        case 0x0E: h=0;break;       
        case 0x0D: h=1;break;       
        case 0x0B: h=2;break;       
        case 0x07: h=3;break;       
      }
    P1=0xF0;       
      switch(P1)   // 列判断
      {
        case 0xE0: l=0;break;       
        case 0xD0: l=1;break;       
        case 0xB0: l=2;break;       
        case 0x70: l=3;break; 
      }     
    m=h*4+l;
    if(m>=0&&m<=9)
    {   
        if(flag==0)
        {
          LCD_Clear();          //清屏
          LCD_Write_Com(0x80) ;
          a=m;
          LCD_Write_Data(a+'0') ;
        }
        else                
        { LCD_Write_Com(0x83) ;
          b=m;
          LCD_Write_Data(b+'0') ;
        }        
    }
    if(m>9&&m<14)
    {
      flag=1;
      c=m;
        LCD_Write_Com(0x82) ;
        switch(m)
        {
        case 10:s=0x2B;break;
        case 11:s=0x2D;break;
        case 12:s=0x2A;break;
          case 13:s=0x2F;break;
        }
        LCD_Write_Data(s) ;
    }
    if(m==15) 
    {
         a=0,b=0,c=0,d=0,flag=0;
       LCD_Write_String(0,0,"                ");
       LCD_Write_String(0,1,"        ");
     }
    if(m==14)
    {    
      switch(c)
      {
        case 10:d=a+b;break;
        case 11:if(a>b) d=a-b; else d=b-a;break;
        case 12:d=a*b;break;
        case 13:d=a/b;break;
      }
      LCD_Write_Com(0xc0) ;
        LCD_Write_Data('=');
      LCD_Write_Data(d/10+'0') ;
      LCD_Write_Data(d%10+'0') ;
        c=0,flag=0;     
    }
    delay(1);
    P1=0xf0;
    while(P1!=0xf0)
    {
      delay(1);
      P1=0xf0;    
    }
    delay(1);
    }
    } 
}

如果需要 1602.c 和 delay.c 的话可问老师

接线:

LCD1602数据线接P0

其他按照LCD1602.c的引脚定义连接

4*4矩阵键盘接P1(注意正反)

相关文章
|
3月前
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
【51单片机】在LCD1602上显示时间:包含按键进行校准时间+闹钟功能:按键设置闹钟响铃时间,以及响铃的时间长度
|
3月前
|
C语言
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
|
6月前
|
内存技术
模块化编程+LCD1602调试工具——“51单片机”
模块化编程+LCD1602调试工具——“51单片机”
模块化编程+LCD1602调试工具——“51单片机”
|
6月前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
95 0
|
6月前
|
数据可视化 API
【51单片机】LCD1602(可视化液晶屏)调试工具的使用(6)
【51单片机】LCD1602(可视化液晶屏)调试工具的使用(6)
|
11月前
|
编解码 前端开发 安全
基于CW32F030单片机的便携式多功能测试笔
一、产品背景 在日常的硬件调试工作中,我们最常使用的仪器仪表可能就是万用表了,虽然万用表号称“万用”,但大部分时候,我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”,万用表有时候也会存在一些缺点和局限性,比如:体积较大不便于携带、无法直接反应逻辑电平情况而需要自己判断、不同型号万用表的通断档位阈值电阻不同等等,而最令人头大的,莫过于万用表的COM表笔通常需要接地,而pcb上可能没有直插孔位可以方便的固定笔尖,因此不得不用手辅助“黑表笔“,影响操作灵活性。 二、产品构思 对于这支测试笔,我对他的功能有以下期望: 1、电压测量+阈值判断,阈值电平可以根据需求自行设定
基于CW32F030单片机的便携式多功能测试笔
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
【单片机期中测试】13.串口通信的应用(2)—— 超声波通过串口返回数据
103 0
【单片机期中测试】12.串口通信的应用(1)——两台单片机之间的通信
【单片机期中测试】12.串口通信的应用(1)——两台单片机之间的通信
121 0
【单片机期中测试】11.交通灯
【单片机期中测试】11.交通灯
58 0
【单片机期中测试】10.利用定时器实现pwm呼吸灯
【单片机期中测试】10.利用定时器实现pwm呼吸灯
144 0