基于STC89C52单片机的计算器Word文件下载.docx
- 文档编号:5596988
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:14
- 大小:152.59KB
基于STC89C52单片机的计算器Word文件下载.docx
《基于STC89C52单片机的计算器Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的计算器Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。
x<
250;
x++)
{
_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_RW=0;
P0=cmd;
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
voidLcd_Write_Data(unsignedchardat)
{
LCD_RS=1;
P0=dat;
}
/*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);
//移动光标,输入方式从左到右
Lcd_Write_Command(0x01);
//清除LCD的显示内容,数据指针清零,将光标撤回液晶显示屏的左上方
(2)LCD1602.h
voidLcd_Write_Command(unsignedcharcmd);
voidLcd_Write_Data(unsignedchardat);
voidInit_Lcd1602(void);
voidDelayNms(unsignedintn);
2、矩阵键盘驱动程序
(1)4X4KeyPad.c
STC89C5xRC.h>
#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;
case(0x0D):
KeyTemp=2;
case(0x0E):
KeyTemp=3;
}
key=0xF0;
//测试行
switch(key)
case(0x70):
val=KeyTemp+0;
case(0xB0):
val=KeyTemp+4;
case(0xD0):
val=KeyTemp+8;
case(0xE0):
val=KeyTemp+12;
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
stdio.h>
//sprintf语句用到
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为运算的第二个数
}
}
//计算结果
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清屏指令,把光标撤回到显示器的左上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、系统主程序
caculatinganddisplaying.h"
voidStart_Screen(void)
unsignedcharcodetable1[]="
WELCOMETO"
unsignedcharcodetable2[]="
STC51CALCULATOR"
;
unsignedcharindex=0;
//显示字符的指针
Lcd_Write_Command(0x80);
while(table1[index]!
{
Lcd_Write_Data(table1[index]);
index++;
DelayNms(500);
index=0;
Lcd_Write_Command(0x80+0x40);
while(table2[index]!
Lcd_Write_Data(table2[index]);
DelayNms(2000);
//清屏
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 单片机 计算器
![提示](https://static.bingdoc.com/images/bang_tan.gif)