基于51单片机的简易计算器系统设计

一、设计要求

本课题模拟计算器设计硬件电路采用三部分电路模块构成,第一部分是键盘模块电路,采用4*4矩阵式键盘作为输入电路;第二部分是LCD1602液晶显示模块;第三部分是以51单片机作为控制核心。软件程序主要由三部分组成:主程序、按键扫描程序和LCD1602显示程序。

二、设计资料、

三、部分程序代码

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P3^0;        //指令or数据
sbit wela=P3^1;      //读or写
sbit lcden=P3^2;   //使能信号
​
uchar code table[]= "                ";
long  int data_a,data_b;   //第一个数和第二个数
long  int data_c;      //计算结果
​
uchar dispaly[10];         //显示缓冲
​
​
void LCD_Delay_us(unsigned int t)
{
  while(t--);           //t=0,退出
}
//************************************************************************/
// 描述: 延时t ms函数
//************************************************************************/
void LCD_Delay_ms(unsigned int t)
{
  unsigned int i,j;
  for(i=0;i<t;i++)           //执行t次循环
  for(j=0;j<113;j++)         //执行113次循环
  ;
}
//************************************************************************/
// 描述: 1602液晶写指令
//************************************************************************/
void write_com(uchar com)      //1602液晶写指令
{
  rs=0;                       //写指令
  lcden=0;                    //使能1602 
  P1=com;                     //写入指令com
  LCD_Delay_ms(1);            //延时1ms
  lcden=1;                    //使能1602
  LCD_Delay_ms(2);            //延时2ms  
  lcden=0;                  //使能1602
}
//************************************************************************/
// 描述:1602液晶写数据 
//************************************************************************/
void write_date(uchar date) //1602液晶写数据
{
  rs=1;                        //写数据
  lcden=0;                     //使能1602 
  P1=date;                     //写入数据date
  LCD_Delay_ms(1);             //延时1ms
  lcden=1;                     //使能1602
  LCD_Delay_ms(2);             //延时2ms
  lcden=0;                   //使能1602
}
//************************************************************************/
// 描述:指定x,y写入字符函数
//************************************************************************/
 void W_lcd(unsigned char x,unsigned char y,unsigned char Data) 
{     
   if (y == 0){write_com(0x80 + x);}   //第一行  
   else{write_com(0xc0 + x);}          //第二行
   write_date( Data);                  //写入数据
 }
 //指定x,y写入字符串函数
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
 if (y == 0){write_com(0x80 + x);}     //第一行
 else{write_com(0xC0 + x);}            //第二行
 while (*s)                            //
   {write_date( *s); s++;}          //写入数据
 }
//************************************************************************/
// 描述:初始化液晶,及画面初始化 
//************************************************************************/
void init_lcd(void)            //初始化液晶,及画面初始化
{
  wela=0;                      //写液晶
  lcden=0;                     //使能1602
  write_com(0x38);             //8 位总线,双行显示,5X7 的点阵字符
  LCD_Delay_us(100);           //延时100us
  write_com(0x0c);             //开显示,无光标,光标不闪烁
  write_com(0x06);             //光标右移动
  write_com(0x01);             //清屏
  write_com(0x80);             //DDRAM 地址归0
}
//************************************************************************/
// 描述: 反转法键盘扫描 
//************************************************************************/
short keycheckdown()        /* 反转法键盘扫描 */
{
​
  short temp1,temp2,temp,a=0xff;
  P2=0xf0;            /* 输入行值(或列值) */
  LCD_Delay_ms(20);        /* 延时 */
  temp1=P2;            /* 读列值(或行值) */
  P2=0xff;
  LCD_Delay_ms(20);        /* 延时 */
  P2=0x0f;            /* 输入列值(或行值) */
  LCD_Delay_ms(20);        /* 延时 */  
  temp2=P2;            /* 读行值(或列值) */
  P2=0xff;
  temp=(temp1&0xf0)|(temp2&0xf);  /* 将两次读入数据组合 */
  switch(temp)          /* 通过读入数据组合判断按键位置 */
  {
​
​
    case 0x77 :a=0x0d;break;//  按键/   
    case 0x7b :a=0x0e; break;// 按键=  
    case 0x7d :a=0;     break;// 按键0
    case 0x7e :a=0x0f; break;// 按键CE
​
    case 0xb7 :a=0x0c;break;//   按键*
    case 0xbb :a=0x9;break; //  按键9
    case 0xbd :a=0x8;break; //  按键8 
    case 0xbe :a=0x7;break; //   按键7
​
    case 0xd7 :a=0x0b;break;//  按键-
    case 0xdb :a=0x6;break; //   按键6
    case 0xdd :a=0x5;break; //   按键5
    case 0xde :a=0x4;break; //   按键4
​
    case 0xe7 :a=0x0a; break;// 按键+
    case 0xeb :a=3;break;  //  按键3
    case 0xed :a=2;break;  //  按键2
    case 0xee :a=1;break;  //  按键1
​
    default :a=0xff;
  }
  return a;            /* 返回按键值 */
}
void display_a() //显示数据a
{
  dispaly[3]=data_a%10000/1000;    //千
  dispaly[2]=data_a%1000/100;      //百
  dispaly[1]=data_a%100/10;        //十
  dispaly[0]=data_a%10;            //个 
​
  write_com(0x80+0);               //显示数据a
  if(data_a>999){  write_date('0'+dispaly[3]);}      //显示千位
  if(data_a>99){  write_date('0'+dispaly[2]);}     //显示百位
  if(data_a>9){  write_date('0'+dispaly[1]);}     //显示十位
                  write_date('0'+dispaly[0]);      //显示个位
}
​

四、protues仿真

五、AD原理图

六、全套设计资料扫一扫关注公众号立即获取

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下饭的王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值