数码管显示简易计算器说明书综述_第1页
数码管显示简易计算器说明书综述_第2页
数码管显示简易计算器说明书综述_第3页
数码管显示简易计算器说明书综述_第4页
数码管显示简易计算器说明书综述_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、原理图设计说明 1.1.1 数码管硬件电路设计 . 11.2 矩阵键盘电路设计 : . 2二、程序设计说明 3.2.1 键盘扫描程序设计 . 32.2 算术运算程序设计 . 42.3 显示程序设计 . 5三、工作原理图及程序流程图 . 6四、程序清单 . 9五、参考文献 . 15、原理图设计说明1.1 数码管硬件电路设计 数码管数据显示的硬件电路由单片机、 4 位共阳极数码管、 位驱动电路、 限流电阻等组 成。实验板中用杜邦线将 P7 与单片机 IO 口相连(这里以 P0 口为例)。用跳线将 P8 与单 片机 P2 低四位相连, P0 口送出数码管段选码, P2 送出位选码。图 1-1

2、 数码管硬件电路原理图1.2 矩阵键盘电路设计4*4 矩阵键盘行输入接单片机 P1.0-P1.3 ,列输入接单片机 P1.4-P1.7 ,通过扫描方式 检测是否有键按下,并确定键值,使用矩阵键盘时注意给 P10 矩阵键盘选择端使能。对键 盘进行编号, S3-S18,按下相应按键, 在数码管上显示相应键值 ( 0-F) 。例如按下 S10 键, 显示 A,按下 S0 键,显示 0。、程序设计说明2.1 键盘扫描程序设计 键盘扫描程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断, 有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭 合,若有键按下,则

3、判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则 返回继续释放。其流程图如图 2-1 所示。图 2-1 键盘扫描程序流程图2.2 算术运算程序设计算术运算程序的过程为:先判断输入的运算符是+、- 、*、/ 中的哪一个,若是 +或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是 / ,则要 先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是- ,则直接显示运算结果。其流程图如图 2.2 所示。图 2-2 算术运算程序设计流程图2.3 显示程序设计先是程序的过程为:显示开始时,先进行LED的初始化,判断是否显示,若不显示,则, 显示完则返回

4、,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完 返回,没有显示完则继续送地址。Y返回图 2-3 显示程序流程图、工作原理图及程序流程图图 3-1 仿真工作原理电路图矩阵键盘图 3-2 系统组成及总体框图图 3-3-2 PCB 原理图7图 3-4 程序流程图四、程序清单mian.c:/简单的数码管显示按键编码 0 到 9#includetypedef unsigned char uint8;uint8 num=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; / 共阴极数码管 uint8 s4=0,10,

5、10,10;uint8 T0RH=0; / uint8 T0RL=0;/uint8 step=0;/uint8 oprt=0;/long num1=0;/long num2=0;/long num3=0;/void Init_times(uint8 ms);extern void KeyDriver();/extern void KeyScan();/void main()EA=1; /Init_times(1); / while(1)KeyDriver(); / void Init_times(uint8 ms) /unsigned long tmp;tmp = 11059200 / 12;

6、/tmp = (tmp * ms) / 1000;/tmp = 65536 - tmp;/tmp = tmp + 12;/T0RH = (unsigned char)(tmp8);/T0RL = (unsigned char)tmp; / TMOD &= 0xF0; / TMOD |= 0x01;TH0 = T0RH;/TL0 = T0RL;/重载初值重载初值 步骤标号 运算符标志运算数 1 运算数 2 结果定义键盘驱动定义键盘扫描中断总允许位配置 T0 定时 1ms调用键盘驱动配置并启动 T0,ms-T0 定时时间定时器计数频率 计算所需的计数值 计算定时器重载值 修正中断响应延时造成的误差

7、 取高八位取第八位 定义计时器工作状态初始值 TH0(变量带入)初始值 TL0ET0 = 1;TR0 = 1; /* 数码管动态扫描函数 */ void fun()static uint8 i;switch(i) /中断允许/ 启动计时器数码管的位选和段选case 0:P2=0xfe;P0=nums0;break;case 1:P2=0xfd;P0=nums1;break;case 2:P2=0xfb;P0=nums2;break;case 3:P2=0xf7;P0=nums3;break;i+;i&=0x03;/* T0 中断服务函数,执行按键扫描 */ void time0()interr

8、upt 1TH0=T0RH;TL0=T0RL;KeyScan();fun();/* 把数值的各个位分别存储在数组是 s4 中 */ void fuzhi(long n)uint8 i=0;小于零为负数if(n0) / s3=11; n=-n;else s3=10;dosi+=n%10; n /= 10;10while(n != 0);while(i 1)Reset();if(step = 0) num1=num1*10+n; fuzhi(num1);else if(step = 1) num2=num2*10+n; fuzhi(num2);/* 读取运算符 */用于判断按键加、减、乘、除voi

9、d OprtKeyAction(uint8 n) / if(step = 0)fuzhi(0);s0=10;step=1;oprt=n; /* 做运算 */加、减、乘、除函数运算void GetResult() /11if(step = 1)switch(oprt)case 0:num3=num1 + num2;break;case 1:num3=num1 - num2;break;case 2:num3=num1 * num2;break;case 3:num3=num1 / num2;break; default: break;fuzhi(num3);step=2;key.c : 键盘按键

10、程序#includetypedef unsigned char uint8;sbit keyout_1 = P14;/ 定义键盘按键sbit keyout_2 = P15;sbit keyout_3 = P16;sbit keyout_4 = P17;sbit keyin_1 =P10;sbit keyin_2 =P11;sbit keyin_3 =P12;sbit keyin_4 =P13;extern void Reset();extern void GetResult();extern void NumKeyAction(uint8 dat);extern void OprtKeyAct

11、ion(uint8 dat);extern uint8 num;全部矩阵键盘的矩阵按键编号到标准键盘用于判断按键运算法则判断按下键是否为数值uint8 keysta44=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1; / 当前状态 uint8 keycode44= 7,8,9,+, / 键码的映射表4,5,6,-,1,2,3,*,0x11,0,=,/;void KeyAction(uint8 dat) /if(dat=0)&(dat=9) /NumKeyAction(dat-0);12else if(dat = +)OprtKeyAction(0); else if(dat

12、= -)OprtKeyAction(1); else if(dat = *)OprtKeyAction(2); else if(dat = /)OprtKeyAction(3); else if(dat = =)GetResult();else if(dat = 0x11)/ 加法/ 减法/ 乘法/ 除法/等于清零按键值备份,保存前一次的值循环检测 4*4 的矩阵按键 检测按键动作/ 按键按下时执行动作/ / 调用按键动作函数/ 刷新前一次的备份值1ms */ 矩阵按键扫描输出索引矩阵按键扫描缓冲区Reset();/* 按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用 */ vo

13、id KeyDriver() / uint8 i,j;static uint8 backup44=1,1,1,1,1,1,1,1, / 1,1,1,1,1,1,1,1;for(i=0;i4;i+) / for(j=0;j4;j+) if(keystaij != backupij)/if(backupij != 0) KeyAction(keycodeij); backupij = keystaij; /* 按键扫描函数,需在定时中断中调用,调用间隔 void KeyScan()uint8 i;static uint8 keyout=0;static uint8 keybuf44=130xff,

14、0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff ;keybufkeyout0=(keybufkeyout01) | keyin_1; / 将一行的 4 个按键值移入缓冲 区keybufkeyout1=(keybufkeyout11) | keyin_2;keybufkeyout2=(keybufkeyout21) | keyin_3;keybufkeyout3=(keybufkeyout31) | keyin_4; / 消抖后更新按键状态 for(i=0;i4;i+) / 每行 4 个按键,所

15、以循环 4 次if(keybufkeyouti = 0x00)/ 连续 4 次扫描值为 0,即 4*4ms 内都是按下状态时,可认为按键已稳定的按下 keystakeyouti=0;else if(keybufkeyouti = 0xff)/ 连续 4 次扫描值为 1,即 4*4ms 内都是弹起状态时,可认为按键已稳定的弹起keystakeyouti=1;输出索引递增索引值加到 4 即归零根据索引,释放当前输出引脚,拉低下次的输出引/ 执行下一次的扫描输出 keyout+; / keyout &=0x03; / switch(keyout) /脚case 0:keyout_4=1;keyout_1=0;break;case 1:keyout_1=1;keyout_2=0;break;case 2:keyout_2=1;keyout_3=0;break;case 3:keyout_3=1;keyout_4=0;break; default: break; 14五、参考文献1 徐爱钧,徐阳等,单片机原理与应用 机械工业出版社 第 2版 20132 罗亚非,凌阳十六位单片机应用基

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论