数码管之简单加减法计算器--项目总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档