数码管之简单加减法计算器--项目总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数码管之简单加减法计算器--项目总结
总结人:徐冉1.项目使用到的硬件板载资源
1)单片机STC89C52RC作为系统的处理器
2)6位共阳极数码管作为计算器的数字显示器件
3)LCD1602液晶显示一些提示信息如计算时的符号(正/负)
4)4*4矩阵按键作为计算器的数字输入设备
5)8个贴片LED小灯,用于走马灯效果作为修饰
6)用到了单片机的内部资源定时器T0
2.项目的基本功能
通过程序的烧录,将工程中的hex文件烧录到Kingst-51开发板上。现象如下:
初始时
1)最右边的数码管上显示0,其余数码管不显示。
2)五个LED小灯像小火车一样循环跑着。
3)LCD1602液晶的左上角显示Symbol:字样,用于显示符号。
正数不显示,负数时将显示‘-’。
进行简单的加减法运算
当用户使用按键输入相应的数字时,会在数码管上显示。数字值将进行进位累加方式实现。数字键(k13 k1 ~ k3 k5 ~ k7 k9 ~ k11 0 ~ 9),k4加法功能键,k12减法功能键,k14 ESC清零键,k4和
k12是双功能键,即k4既是加法键也是计算键,k12既是减法键也是计算键。达到一键两用的效果。注意:用户在进行加法计算时可以随意计算,但在计算减法时第一步需要进行一次加法,然后才能进行减法运算。当计算结果是负数时会在数码管上显示相应的数值的绝对值,而在LCD1602液晶上显示‘-’。在计算期间LED 小灯会一直循环流动。这个计算器可以实现连加连减,计算十分方便,但没有处理小数。当计算完成时,或输入错误时可按k14进行清零操作。
3.项目的创新点
首先该项目使用了LED 的跑马灯效果进行了装饰,为了程序的简单且直观性程序使用了LCD1602进行运算时符号的显示。程序在计算上使用了一键两用的功能设计,这样设计方便快捷。
4.项目的设计流程
N
Y
上电
LCD1602液晶
初始化
74HC138译码器初始化
配置定时器T0定时1ms 中断
Lcd1602初始化显示Symbol
主函数while 循环进行按键动作检测
1ms 到
按键扫描
LED 小灯&数码管扫描
结束
5.项目的不足之处
本项目只考虑了简单的加法和减法运算,且只是整数运算,而未能考虑到小数运算。乘除法亦没有考虑到。在进行减法运算时都必须进行一次加法运算才可以运算正常。
6.项目需要改进的地方
可对本项目进行全面的扩展,使其既能进行加减乘除运算,又能处理小数和负数的功能。符号显示直接使用数码管显示即可。将计算功能键单独进行处理,做成真正的计算器。
7.项目的硬件电路连接图
8.项目的源代码
/**
********************************************************************************
* @file mytype.h
* @author qlp
* @date 2014年6月18日
* @version V1.2.3
* @brief 自定义类型头文件
******************************************************************************** */
#ifndef _MYTYPE_H_H
#define _MYTYPE_H_H
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
#endif //_MYTYPE_H_H
/**
***********************************************************************
* @file Lcd1602.c
* @author qlp
* @date 2014年6月18日
* @version V1.2.3
* @brief LCD1602液晶底层驱动
***********************************************************************
*/
#include
//LCD1602_IO
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_EN = P1^5;
//74HC138
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
bit tmpADDR0 = 0;
bit tmpADDR1 = 0;//地址选择缓冲区
#define LCD1602_DB P0
/*暂停LED扫描*/
void LEDRefreshPause()
{
ENLED = 1;//关闭LED使能
tmpADDR0 = ADDR0;//因为LED和LCD同时使用了P1^0和P1^1引脚,所以要暂时保存ADDR0和ADDR1的数据即LED扫描地址值
tmpADDR1 = ADDR1;
P0 = 0xFF; //数码管+LED小灯去抖动
}
/*继续扫描LED*/
void ContinueRefreshLED()
{
ADDR0 = tmpADDR0;
ADDR1 = tmpADDR1;//恢复原来LED扫描的地址选择值
ENLED = 0;//选择LED
P0 = 0xFF; //数码管和LED去抖
}
/* 液晶忙碌等待 */
void LCD1602Wait()
{
unsigned char sta;
LCD1602_DB = 0xFF;//总线拉高,检测液晶状态字
LCD1602_RS = 0;
LCD1602_RW = 1;