一、设计要求
本课题模拟计算器设计硬件电路采用三部分电路模块构成,第一部分是键盘模块电路,采用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原理图
六、全套设计资料扫一扫关注公众号立即获取