基于STC89C52单片机的计算器.doc

上传人:xin****828 文档编号:6620500 上传时间:2020-03-01 格式:DOC 页数:10 大小:153KB
返回 下载 相关 举报
基于STC89C52单片机的计算器.doc_第1页
第1页 / 共10页
基于STC89C52单片机的计算器.doc_第2页
第2页 / 共10页
基于STC89C52单片机的计算器.doc_第3页
第3页 / 共10页
点击查看更多>>
资源描述
4X4矩阵键盘实现的计算器一、功能实现基本的两个整数加、减、乘、除运算,采用4X4矩阵键盘输入数据,结果由LCD1602显示。可以显示负数结果,并且还具有清除功能。该软件基于普中科技的HC6800_EM3 V2.2平台,微处理器为STC89C52单片机。二、硬件电路图硬件各个部分的电路图如下:1、STC89C52单片机电路图2、LCD1602显示电路图3、矩阵键盘电路图三、软件程序1、LCD1602驱动程序 (1)LCD1602.c#include #include sbit LCD_RS = P26;sbit LCD_RW = P25;sbit LCD_EN = P27;#define delayNOPs(); _nop_();_nop_();_nop_();_nop_();/ 延时函数,延时大约1ms乘以nvoid DelayNms(unsigned int n) unsigned char x; while(n-)for(x=0; x250; x+)_nop_(); _nop_(); _nop_(); _nop_(); /*/* */* 检查LCD忙状态 */* 返回值为1时,表示忙,等待。返回值为0时,表示闲,可以写入指令与数据。 */* 读状态:RS=L,RW=H,E=H,D0-D7=状态字 */* */*/ bit Lcd1602_is_busy(void) bit result; 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=指令码 */* */*/void Lcd_Write_Command(unsigned char cmd) 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=数据 */* */*/void Lcd_Write_Data(unsigned char dat) while(Lcd1602_is_busy(); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOPs(); LCD_EN = 1; delayNOPs(); LCD_EN = 0; /*/* */* LCD初始化设定 */* */*/void Init_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.hvoid Lcd_Write_Command(unsigned char cmd);void Lcd_Write_Data(unsigned char dat);void Init_Lcd1602(void);void DelayNms(unsigned int n);2、矩阵键盘驱动程序(1) 4X4KeyPad.c#include #include LCD1602.h / 要用到延时函数 void DelayNms(unsigned char n);#define key P1unsigned char val = 16;/ 获取的键值#define KEY_NULL 0xFF / 后来加上的/ 键盘扫描函数unsigned char key_scan(void) unsigned char state,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.hextern unsigned char key_scan(void);extern unsigned char val;#define KEY_NULL 0xFF3、计算器计算和显示程序(1)caculating and displaying.c#include / sprintf语句用到#include LCD1602.h#include 4X4KeyPad.hunsigned char code table1 = 0123456789+-*/=C;bit number_key= 0; / 数字键 bit add_key = 0; / 加法键 +bit sub_key = 0;/ 减法键 -bit multiply_key = 0;/ 乘法键 *bit division_key = 0; / 除法键 /bit equal_key = 0;/ 等于键 =bit clear_key = 0;/ 清除键double a=0,b=0,s=0;/a为计算的第一个数,b为第二个数,s为计算结果/ 必须定义为浮点,否则不能够保证计算精度/ 识别按键,置标记符void Key_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(table1val);/ 显示按键对应的字符/ 计算被计算的两个数 Gets the number of two to be calculatedvoid Get_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;/ 计算结果void Calculate_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;void Display_Result(void)unsigned char i = 0; / 显示字符的指针unsigned char result16 = ;/ 待显示的字符计算结果if(equal_key = 1)/ 只有按等于键才显示equal_key = 0;sprintf(result,%.4f,s);/ 浮点数的默认有效位是小数点后6位,这里设置为4位/sprintf(&temp10,%f,a);Lcd_Write_Command(0x80+0x40);/ 结果在第二行显示while(resulti != 0)Lcd_Write_Data(resulti);i+;/ 清除显示void ClearScreen(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) caculating and displaying.hvoid Key_Recognition(void);void Get_Parameters_for_calculation(void);void Calculate_Result(void);void Display_Result(void);void ClearScreen(void);4、系统主程序#include LCD1602.h#include caculating and displaying.hvoid Start_Screen(void)unsigned char code table1= WELCOME TO ;unsigned char code table2=STC51 CALCULATOR ;unsigned char index = 0;/ 显示字符的指针Lcd_Write_Command(0x80);while(table1index != 0)Lcd_Write_Data(table1index);index+;DelayNms(500);index = 0;Lcd_Write_Command(0x80+0x40);while(table2index != 0)Lcd_Write_Data(table2index);index+;DelayNms(2000);Lcd_Write_Command(0x01); / 清屏void main(void)Init_Lcd1602();Start_Screen();while(1)Key_Recognition();Get_Parameters_for_calculation();Calculate_Result();Display_Result();ClearScreen();
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 其他分类 > 大学论文


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!