文档详情

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

s****a
实名认证
店铺
DOCX
255.04KB
约18页
文档ID:157335157
数码管显示简易计算器说明书_第1页
1/18

目录、原理图设计说明 11.1数码管硬件电路设计 11.2矩阵键盘电路设计: 2、程序设计说明 3.2.1键盘扫描程序设计 32.2算术运算程序设计 42.3显示程序设计 5三、 工作原理图及程序流程图 6四、 程序清单 9五、 参考文献 15、原理图设计说明1.1数码管硬件电路设计数码管数据显示的硬件电路由单片机、4位共阳极数码管、位驱动电路、限流电阻等组成实验板中用杜邦线将P7与单片机10 口相连(这里以P0 口为例)用跳线将P8与单片机P2低四位相连,P0 口送也数码管段选码,P2送出位选码P74WEISHUMA图数码管硬件电路原理图1.2矩阵键盘电路设计4*4 矩阵键盘行输入接单片机 P1.0-P1.3,列输入接单片机P14P1.7,通过扫描方式检测是否有键按下,并确定键值,使用矩阵键盘时注意给 P10矩阵键盘选择端便能对键盘进行编号,S3-S18,按下相应按键,在数码管上显示相应键值(0-F)例如按下S10键.显示A.按下SO键•显 示0<_P101PHO 7]—S3_$4bi /ss8、2 3KEY—O 0—1KEY—o O IKEY~KEY S7—O O—i (KEYSS ■—o O—iKEYS9 *—o O—IKEY$10 GNDSll^ —O O—iKEY叫—O O—IKEYsi 3—O O—iKEY&|4,pi i yS16SI 7[$1$pipy图1-2矩阵键盘电路原理图、程序设计说明2.1铤盘扫描程序设计键盘扫描程序的过程为:开始时,先判断是否有铤闭合,无键闭合时,返回继续判断,有铤闭合时, 先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键 号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。

其流程图如图2-1所示图2-1键盘扫描程序流程图算术运算程序的过程为:先判断输入的运算符是+、・、•、/中的哪一个,若是+或・•则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是 /,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是 则直接显示运算结果其流程图如图2.2所示开始〈运算符图2-2算术运算程序设计流程图2.3显示程序设计先是程序的过程为:显示开始时,先进行 LED的初始化•判断是否显示.若不显示,则返回,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完返回, ,显示完则没有显示完则继续送地址I显示开始LED初始化显示数值相应功能设置送数据—否显示崟〉Y返回图2-3显示程序流程图、工作原理图及程序流程图图3・1仿真工作原理电路图图3-2系统组成及总体惟图E3K9..轮 04 R3竺句.4KDE3♦ ♦EZl E3X1KAKB KCI . a')E3EV| EZl)七IKEK7 -* K8图3-3-1 PCB原理图图3-3-2 PCB原理图3-3-3 3D效果图图3-4程序流程图四、程序清单mia // 简单的数码管显示按键编码0到9#/n cludetypedef un sig ned char uin t8;uint8 num[]=(0x3f,0x06,0x5b10x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //uin t8 s[4]=(0,10,10,10);uin t8 T0RH=0; //uint8 T0RL=0; //uin t8 step=0; //uint8 oprt=0; //long nu m1=0; //long nu m2=0; //long nu m3=0; //void Init_times(uint8 ms);extern void KeyDriver(); //exter n void KeySca n(); //void mai n() (EA=1; //Ini t_times(1); //while(1)(KeyDriver(); //}}void In it_times(ui nt8 ms) //(un sig ned long tmp;tmp= 11059200/12; //tmp = (tmp w ms) / 1000; //tmp = 65536 - tmp; //tmp = tmp + 12; //T0RH = (un sig ned char)(tmp»8); //T0RL = (un sig ned char)tmp; //TMOD &= OxFO; //TMOD |= 0x01;TH0 = T0RH; //共阴极数码管重载初值重载初值步骤标号运算符标志运算数1运算数2结果定义键盘驱动定义键盘扫描中断总允许位配置T0定时1ms调用键盘驱动配置并启动TO,ms・T0定时时间定时器计数频率计算所需的计数值计算定时器重载值修正中断响应延时造成的误差取高八位取第八位定义计时器工作状态初始值TH0 (变量带入)初始值TL0TLO = TORL; //ET0 = 1; // 中断允许TRO= 1;) // 启动计时器/*数码管动态扫描函数 •/void fun()(static uin t8 i;switch(i) II 数码管的位选和段选(case 0:P2=0xfe;P0=nu m[s[0]];break;case 1:P2=0xfd;P0=nu m[s[1]];break;case 2:P2=0xfb;P0=nu m[s⑵];break;case 3:P2=0xf7;P0=nu m[s[3]];break;i++;i&=0x03;}/* TO中断服务函数,执行按键扫描 7void timeO ()in terrupt 1(TH0=T0RH;TLO=TORL;KeySca n();fun();}/*把数值的各个位分别存储在数组是 s[4]中*/void fuzhi( long n)(ui nt8 i=0;小于零为负数if(n <0) //(s[3]=11;n=-n;)else(s[3]=10;)do{s[i++]=n%10; n /= 10;}while( n != 0);while(i<=2)(s[i++]=10;})/*复位*/void Reset()(nu m1=0;nu m2=0;step=O;fuzhi(O);)/* 读取运算数*/void NumKeyActio n(ui nt8 n)(if(step > 1)( Reset();)if(step == 0)(nu m 仁 nu m1*10+n;fuzhi (nu ml);)else if(step == 1)(num2=nu m2*10+n; fuzhi (nu m2);})/* 读取运算符*/用于判断按键加、减、乘、除加、减、乘、除函数运算void OprtKeyActio n(ui nt8 n) //(if(step == 0)( fuzhi(O); s[0]=10; step=1; oprt=n;})/*做运算*/void GetResult() //if(step == 1)(switch(oprt)(case 0:num3=num1 + nu m2;break;case 1:num3=num1 - nu m2;break;case 2:num3=num1 * nu m2;break;case 3:num3=num1 / nu m2;break; default: break;)fuzhi (nu m3);step=2;))key.c :键盘按键程序#in cludetypedef un sig ned char uin t8;sbit keyout_1 = P1A4; // 定义键盘按键sbit keyout_2 = P”5;sbit keyout_3 = P”6;sbit keyout_4 = P”7;sbit keyin_1 =P1A0;sbit keyin_2 = P 1 人 1;sbit keyin_3 =「J 1 人 2;sbit keyin_4 = P 1 人 3;exter n void Reset();extern void GetResult();exter n void NumKeyAct ion(uint8 dat);exter n void OprtKeyAct ion(uint8 dat);extern uint8 nu mQ;ui nt8 keysta[4][4]=({1,1,1,1},(1,1,1,1),(1,1,1,1},(1,1,1,1});// 全部矩阵键盘的当前状态uint8 keycode[4][4]=( {7,8,9,*'}, II 矩阵按键编号到标准键盘键码的映射表{4,5,'6*},{T,2,3L},{0x11,0,y,7}};void KeyActio n(ui nt8 dat) //{ 用于判断按键运算法则if((dat>=,0,)&&(dat<=,9,))( //NumKeyActio n(dat・'O'); 判断按下键是否为数值)else if(dat =='+'){OprtKeyActio//加法n(0);} else if(dat == *- •)(OprtKeyActio//减法n(1);} else if(dat ==OprtKeyActio//乘法n(2);} else if(dat ==■/■)(OprtKeyActio//除法n(3);} else if(dat ==■=■)(GetResult();//等于}else if(dat == 0x11)(//清零Reset();))/•按键驱动函数•检测按键动作,调度相应动作函数•需在主循环中调用 ./ voidKeyDriver() / (uin t8 i,j;static uint8 backup[4][4]={{1,1,1,1},{1,1,1,1}, 〃for(i=0;i<4;i++) //按键值备份•保存前一次的值循环检测4*4的矩阵按键检测按键动作〃按键按下时执行动作//调用按键动作函数〃 刷新前一次的备份值4 * /for(j=0;j<4;j++)if(keysta[i][j] != backup[i][j])( //if(backup[i][j] != 0) KeyActio n(keycode[i][j]);backup[i][j] = keysta[i]0];})/*按键扫描函数・需在定时中断中调用・调用间隔voidKeySca n()(ui nt8 i;static uint8 keyout=0;static uin t8 keybuf[4][4]=(矩阵按键扫描输出索引矩阵按键扫描缓冲区////(0xff,0xff,0xfft0xff},(0xff,0xfft0xff,0xff),{0xff,0xff,0xff,0xff),{0xff,0xff,0xff,0xff}};keybuf[keyout][0]=(keybuf[keyout][0]«1) | keyin_1; // 将一行的 4 个按键值移入缓冲区keybuf[keyout][1 ]=(keybuf[keyout][1 ]«1) | keyin_2;keybuf[keyout][2]=(keybuf[keyout][2]«1) | keyin_3;keybuf[keyout][3]=(keybuf[keyout][3]«1) | keyin_4; // 消抖后更新按铤状态for(i=0;i<4;i++)(// 每行4个按键,所以循环4次if(keybuf[keyout][i] == OxOO)(〃连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下keysta[keyout][i]=0;)else if(keybuf[keyout][i] == Oxff)(〃连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起keysta[keyout][i]=1;)}//执行下一次的扫描输出输出索引递增索弓I值加到4即归零根据索弓I,释放当前输出引脚,拉低下次的输出引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;})五、参考文献[1] 徐爱钧,徐阳等,单片机原理与应用 机械工业出版社第2版2013[2] 罗亚非,凌阳十六位单片机应用基础 北京航空航天大学出版社 2003年[3] 郭天祥51单片机C语言教程 电子工业出版社2009.1 ISBN 978-7-121-07893-4[4] 彭伟单片机C语言程序设计实训100例.[M]北京.高等教育出版社.2009[5] 侯媛彬等,单片机原理及其毕业设计精选 科学出版社2006年[6] 张义和,王敏男等例说51单片机(C语言版)2008.4 ISBN 978-7-115-17326-3[7] 张毅刚MCS-51单片机应用设计哈工大出版社, 第2版2004年。

下载提示
相关文档
正为您匹配相似的精品文档