基于STC89C52单片机的计算器.docx
- 文档编号:11940343
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:14
- 大小:152.59KB
基于STC89C52单片机的计算器.docx
《基于STC89C52单片机的计算器.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的计算器.docx(14页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的计算器
4X4矩阵键盘实现的计算器
一、功能
实现基本的两个整数加、减、乘、除运算,采用4X4矩阵键盘输入数据,结果由LCD1602显示。
可以显示负数结果,并且还具有清除功能。
该软件基于普中科技的HC6800_EM3V2.2平台,微处理器为STC89C52单片机。
二、硬件电路图
硬件各个部分的电路图如下:
1、STC89C52单片机电路图
2、LCD1602显示电路图
3、矩阵键盘电路图
三、软件程序
1、LCD1602驱动程序
(1)LCD1602.c
#include
#include
sbitLCD_RS=P2^6;
sbitLCD_RW=P2^5;
sbitLCD_EN=P2^7;
#definedelayNOPs();{_nop_();_nop_();_nop_();_nop_();};
//延时函数,延时大约1ms乘以n
voidDelayNms(unsignedintn)
{
unsignedcharx;
while(n--)
{
for(x=0;x<250;x++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/***************************************************************************/
/**/
/*检查LCD忙状态*/
/*返回值为1时,表示忙,等待。
返回值为0时,表示闲,可以写入指令与数据。
*/
/*读状态:
RS=L,RW=H,E=H,D0-D7=状态字*/
/**/
/***************************************************************************/
bitLcd1602_is_busy(void)
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOPs();//保证使能脉冲的宽度
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*******************************************************************/
/**/
/*写指令到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码*/
/**/
/*******************************************************************/
voidLcd_Write_Command(unsignedcharcmd)
{
while(Lcd1602_is_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delayNOPs();//保证使能脉冲的宽度
LCD_EN=1;
delayNOPs();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
/**/
/*******************************************************************/
voidLcd_Write_Data(unsignedchardat)
{
while(Lcd1602_is_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOPs();
LCD_EN=1;
delayNOPs();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*******************************************************************/
voidInit_Lcd1602(void)
{
DelayNms(15);
Lcd_Write_Command(0x38);//设置成:
16*2显示,5*7点阵,8位数据接口
DelayNms(5);
//Lcd_Write_Command(0x08);//显示关闭
//DelayNms(5);
Lcd_Write_Command(0x0C);//显示开,关光标
DelayNms(5);
Lcd_Write_Command(0x06);//移动光标,输入方式从左到右
DelayNms(5);
Lcd_Write_Command(0x01);//清除LCD的显示内容,数据指针清零,将光标撤回液晶显示屏的左上方
DelayNms(5);
}
(2)LCD1602.h
voidLcd_Write_Command(unsignedcharcmd);
voidLcd_Write_Data(unsignedchardat);
voidInit_Lcd1602(void);
voidDelayNms(unsignedintn);
2、矩阵键盘驱动程序
(1)4X4KeyPad.c
#include
#include"LCD1602.h"//要用到延时函数voidDelayNms(unsignedcharn);
#definekeyP1
unsignedcharval=16;//获取的键值
#defineKEY_NULL0xFF//后来加上的
//键盘扫描函数
unsignedcharkey_scan(void)
{
unsignedcharstate,KeyTemp;
key=0x0F;
if(key!
=0x0F)//如果有按键按下
{
state=key;//记录第一次按键状态
DelayNms(10);//延时去抖
if(key==state)//判断按键状态是否和第一次一致
{
key=0x0F;//测试列,该行可屏蔽掉
switch(key)
{
case(0x07):
KeyTemp=0;break;
case(0x0B):
KeyTemp=1;break;
case(0x0D):
KeyTemp=2;break;
case(0x0E):
KeyTemp=3;break;
}
key=0xF0;//测试行
switch(key)
{
case(0x70):
val=KeyTemp+0;break;
case(0xB0):
val=KeyTemp+4;break;
case(0xD0):
val=KeyTemp+8;break;
case(0xE0):
val=KeyTemp+12;break;
}
while(key!
=0xF0);//等待松开按键
}
else
return(KEY_NULL);
}
else
return(KEY_NULL);
//elsekey=0xFF;//释放键盘总线
}
(2)4X4KeyPad.h
externunsignedcharkey_scan(void);
externunsignedcharval;
#defineKEY_NULL0xFF
3、计算器计算和显示程序
(1)caculatinganddisplaying.c
#include
#include"LCD1602.h"
#include"4X4KeyPad.h"
unsignedcharcodetable1[]={"0123456789+-*/=C"};
bitnumber_key=0;//数字键
bitadd_key=0;//加法键+
bitsub_key=0;//减法键-
bitmultiply_key=0;//乘法键*
bitdivision_key=0;//除法键/
bitequal_key=0;//等于键=
bitclear_key=0;//清除键
doublea=0,b=0,s=0;//a为计算的第一个数,b为第二个数,s为计算结果
//必须定义为浮点,否则不能够保证计算精度
//识别按键,置标记符
voidKey_Recognition(void)
{
if(key_scan()!
=KEY_NULL)//有按键按下时才置标志位和显示
{
if(val<=9)number_key=1;
if(val==10)add_key=1;
if(val==11)sub_key=1;
if(val==12)multiply_key=1;
if(val==13)division_key=1;
if(val==14)equal_key=1;
if(val==15)clear_key=1;
Lcd_Write_Data(table1[val]);//显示按键对应的字符
}
}
//计算被计算的两个数Getsthenumberoftwotobecalculated
voidGet_Parameters_for_calculation(void)
{
if(equal_key!
=1)//没有按等号键才进入
{
if((add_key||sub_key||multiply_key||division_key)!
=1)//没有按下运算键(+-*/)
{
if(number_key==1)//是数字键
{
a=a*10+val;//a为运算的第一个数
number_key=0;
}
}
else//按下运算键(+-*/)
{
if(number_key==1)
{
b=b*10+val;//b为运算的第二个数
number_key=0;
}
}
}
}
//计算结果
voidCalculate_Result(void)
{
if(equal_key==1)//只有按等号键才能计算
{
if(add_key==1)//加法
s=a+b;
if(sub_key==1)//减法
s=a-b;
if(multiply_key==1)//乘法
s=a*b;
if(division_key==1)//除法
s=a/b;
}
}
voidDisplay_Result(void)
{
unsignedchari=0;//显示字符的指针
unsignedcharresult[16]="";//待显示的字符计算结果
if(equal_key==1)//只有按等于键才显示
{
equal_key=0;
sprintf(result,"%.4f",s);//浮点数的默认有效位是小数点后6位,这里设置为4位
//sprintf(&temp1[0],"%f",a);
Lcd_Write_Command(0x80+0x40);//结果在第二行显示
while(result[i]!
='\0')
{
Lcd_Write_Data(result[i]);
i++;
}
}
}
//清除显示
voidClearScreen(void)
{
if(clear_key==1)//只有按清除键才能清除
{
Lcd_Write_Command(0x01);//LCD清屏指令,把光标撤回到显示器的左上number_key=add_key=sub_key=multiply_key=division_key=equal_key=clear_key=0;
//清除所有的状态标志
s=0;
a=0;
b=0;
}
}
(2)caculatinganddisplaying.h
voidKey_Recognition(void);
voidGet_Parameters_for_calculation(void);
voidCalculate_Result(void);
voidDisplay_Result(void);
voidClearScreen(void);
4、系统主程序
#include"LCD1602.h"
#include"caculatinganddisplaying.h"
voidStart_Screen(void)
{
unsignedcharcodetable1[]="WELCOMETO";
unsignedcharcodetable2[]="STC51CALCULATOR";
unsignedcharindex=0;//显示字符的指针
Lcd_Write_Command(0x80);
while(table1[index]!
='\0')
{
Lcd_Write_Data(table1[index]);
index++;
}
DelayNms(500);
index=0;
Lcd_Write_Command(0x80+0x40);
while(table2[index]!
='\0')
{
Lcd_Write_Data(table2[index]);
index++;
}
DelayNms(2000);
Lcd_Write_Command(0x01);//清屏
}
voidmain(void)
{
Init_Lcd1602();
Start_Screen();
while
(1)
{
Key_Recognition();
Get_Parameters_for_calculation();
Calculate_Result();
Display_Result();
ClearScreen();
}
}
如有侵权请联系告知删除,感谢你们的配合!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 计算器