数码管显示简易计算器说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、原理图设计说明 (1)
1.1数码管硬件电路设计 (1)
1.2矩阵键盘电路设计: (2)
二、程序设计说明 (3)
2.1键盘扫描程序设计 (3)
2.2算术运算程序设计 (4)
2.3显示程序设计 (5)
三、工作原理图及程序流程图 (6)
四、程序清单 (9)
五、参考文献 (15)
一、原理图设计说明
1.1数码管硬件电路设计
数码管数据显示的硬件电路由单片机、4 位共阳极数码管、位驱动电路、限流电阻等组成。实验板中用杜邦线将P7 与单片机IO 口相连(这里以P0 口为例)。用跳线将P8 与单片机P2 低四位相连,P0 口送出数码管段选码,P2 送出位选码。
图1-1 数码管硬件电路原理图
1.2矩阵键盘电路设计:
4*4 矩阵键盘行输入接单片机P1.0-P1.3,列输入接单片机P1.4-P1.7,通过扫描方式检测是否有键按下,并确定键值,使用矩阵键盘时注意给P10 矩阵键盘选择端使能。对键盘进行编号,S3-S18,按下相应按键,在数码管上显示相应键值(0-F)。例如按下S10 键,显示A,按下S0 键,显示0。
图1-2 矩阵键盘电路原理图
二、程序设计说明
2.1键盘扫描程序设计
键盘扫描程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。其流程图如图2-1所示。
图2-1 键盘扫描程序流程图
算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。其流程图如图2.2所示。
图2-2 算术运算程序设计流程图
先是程序的过程为:显示开始时,先进行LED的初始化,判断是否显示,若不显示,则返回,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址。
图2-3 显示程序流程图
三、工作原理图及程序流程图
图3-1仿真工作原理电路图
数码管模块
最小系统
STC12C5A60S2
矩阵键盘
图3-2系统组成及总体框图
图3-3-1 PCB原理图图3-3-2 PCB原理图
图3-3-3 3D 效果图
开始
初始化参数
初始化LED
有键输入?
读取键码
数字键
清零键
功能键
输入数值计算结果
状态清零LED 显示
Y
N
图3-4 程序流程图
四、程序清单
mian.c: //简单的数码管显示按键编码0到9
#include
typedef unsigned char uint8;
uint8 num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x00,0x40}; //共阴极数码管uint8 s[4]={0,10,10,10};
uint8 T0RH=0; //重载初值
uint8 T0RL=0; //重载初值
uint8 step=0; //步骤标号
uint8 oprt=0; //运算符标志
long num1=0; //运算数1
long num2=0; //运算数2
long num3=0; //结果
void Init_times(uint8 ms);
extern void KeyDriver(); //定义键盘驱动
extern void KeyScan(); //定义键盘扫描
void main()
{
EA=1; // 中断总允许位
Init_times(1); //配置T0定时1ms
while(1)
{
KeyDriver(); // 调用键盘驱动
} }
void Init_times(uint8 ms) //配置并启动T0,ms-T0定时时间{
unsigned long tmp;
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 12; //修正中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8); //取高八位
T0RL = (unsigned char)tmp; //取第八位
TMOD &= 0xF0; //定义计时器工作状态
TMOD |= 0x01;
TH0 = T0RH; //初始值TH0(变量带入)
TL0 = T0RL; //初始值TL0
ET0 = 1; //中断允许
TR0 = 1; } //启动计时器/* 数码管动态扫描函数 */
void fun()
{
static uint8 i;
switch(i) //数码管的位选和段选
{
case 0:P2=0xfe;P0=num[s[0]];break;
case 1:P2=0xfd;P0=num[s[1]];break;
case 2:P2=0xfb;P0=num[s[2]];break;
case 3:P2=0xf7;P0=num[s[3]];break;
}
i++;
i&=0x03;}
/* T0中断服务函数,执行按键扫描 */
void time0()interrupt 1
{
TH0=T0RH;
TL0=T0RL;
KeyScan();
fun();
}
/*把数值的各个位分别存储在数组是s[4]中 */
void fuzhi(long n)
{
uint8 i=0;
if(n<0) //小于零为负数{
s[3]=11;
n=-n;
}
else
{
s[3]=10;
}
do{
s[i++]=n%10;
n /= 10;