数码管显示简易计算器说明书

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

相关文档
最新文档