资料清单:C程序+仿真+设计报告+使用说明+元件清单+操作视频
仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【Q06】
1.? 简介
? 本文提出了一种基于51单片机的LCD1602计算器设计。该设计是以AT89C51单片机为核心的计算器模拟系统,输入采用4×4矩阵键盘,可以进行加、减、乘、除数字运算,并在LCD1602上显示操作过程。
2.? 主要功能
a.通过LCD1602显示计算过程。
b.通过4×4矩阵键盘进行加、减、乘、除数字运算。
3.? 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
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;
P1=0xf0; /* 输入行值(或列值) */
LCD_Delay_ms(20); /* 延时 */
temp1=P1; /* 读列值(或行值) */
P1=0xff;
LCD_Delay_ms(20); /* 延时 */
P1=0x0f; /* 输入列值(或行值) */
LCD_Delay_ms(20); /* 延时 */
temp2=P1; /* 读行值(或列值) */
P1=0xff;
temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */
switch(temp) /* 通过读入数据组合判断按键位置 */
{
case 0x77 :a=0x0a;break;// 按键+
case 0x7b :a=0x0e; break;// 按键=
case 0x7d :a=0; break;// 按键0
case 0x7e :a=0x0f; break;// 按键CE
case 0xe7 :a=0x0d;break;// 按键/
case 0xbb :a=0x9;break; // 按键9
case 0xbd :a=0x8;break; // 按键8
case 0xbe :a=0x7;break; // 按键7
case 0xd7 :a=0x0c;break;// 按键*
case 0xdb :a=0x6;break; // 按键6
case 0xdd :a=0x5;break; // 按键5
case 0xde :a=0x4;break; // 按键4
case 0xb7 :a=0x0b; 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]); //显示个位
}
void display_b() //显示数据b
{
write_com(0x80+7); //第一行
dispaly[3]=data_b%10000/1000; //千
dispaly[2]=data_b%1000/100; //百
dispaly[1]=data_b%100/10; //十
dispaly[0]=data_b%10; //个
if(data_b>999){ write_date('0'+dispaly[3]); } //显示千位
if(data_b>99) { write_date('0'+dispaly[2]); } //显示百位
if(data_b>9) { write_date('0'+dispaly[1]); } //显示十位
write_date('0'+dispaly[0]); //显示个位
}
//计算结果
void display_c(x)
{
if(data_c<100000000&&data_c>-1)//溢出时显示错误
{
dispaly[8]=data_c%1000000000/100000000; //万万
dispaly[7]=data_c%100000000/10000000; //千万
dispaly[6]=data_c%10000000/1000000; //百万
dispaly[5]=data_c%1000000/100000; //十万
dispaly[4]=data_c%100000/10000; //万
dispaly[3]=data_c%10000/1000; //千
dispaly[2]=data_c%1000/100; //百
dispaly[1]=data_c%100/10; //十
dispaly[0]=data_c%10; //个
write_com(0x80+6+0x40); //第一行
if(x==4)
{
if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示万万
if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万
if(data_c>999999) { write_date('0'+dispaly[6]);} //百万
if(data_c>99999) { write_date('0'+dispaly[5]);} //十万
if(data_b!=0) {
write_date('0'+dispaly[4]); //万
write_date('.');
write_date('0'+dispaly[3]); //千
write_date('0'+dispaly[2]); //百
write_date('0'+dispaly[1]); //十
write_date('0'+dispaly[0]); //个
}
}
else{
if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示万万
if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万
if(data_c>999999) { write_date('0'+dispaly[6]);} //百万
if(data_c>99999) { write_date('0'+dispaly[5]);} //十万
if(data_c>9999) { write_date('0'+dispaly[4]);} //万
if(data_c>999) { write_date('0'+dispaly[3]);} //千
if(data_c>99) { write_date('0'+dispaly[2]);} //百
if(data_c>9) { write_date('0'+dispaly[1]);} //十
write_date('0'+dispaly[0]); //个
}
}
4.? 仿真proteus8.6
? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
加:
减:
乘:
除:
5.? 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6.? 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7.? 资料获取链接
百度网盘下载链接:【Q06】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
阅读全文
855