版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、原理图设计说明 11.1数码管硬件电路设计 11.2矩阵键盘电路设计: 2二、程序设计说明 32.1键盘扫描程序设计 32.2算术运算程序设计 42.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所示。图2-2算术运算程序设计流程图2.3显示程序设计先是程序的过程为:显示开始时,先进行LED的初始化,判断是否显示,若不显示,则返回,若显示,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址。图2-3显示程序流程图三、工作原理图及程序流程图图3-1仿真工作原理电路图图3-2系统组成及总体框图图3-3-1PCB原理图图3-3-2PCB原理图图3-3-33D效果图图3-4程序流程图四、程序清单mian.c://简单的数码管显示按键编码0到9#include<reg52.h>typedefunsignedcharuint8;uint8num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极数码管uint8s[4]={0,10,10,10};uint8T0RH=0;//重载初值uint8T0RL=0;//重载初值uint8step=0;//步骤标号uint8oprt=0;//运算符标志longnum1=0;//运算数1longnum2=0;//运算数2longnum3=0;//结果voidInit_times(uint8ms);externvoid KeyDriver();//定义键盘驱动externvoid KeyScan();//定义键盘扫描voidmain(){ EA=1;//中断总允许位 Init_times(1);//配置T0定时1ms while(1) { KeyDriver(); //调用键盘驱动 } }voidInit_times(uint8ms)//配置并启动T0,ms-T0定时时间{unsignedlongtmp;tmp=11059200/12;//定时器计数频率tmp=(tmp*ms)/1000;//计算所需的计数值tmp=65536-tmp;//计算定时器重载值tmp=tmp+12;//修正中断响应延时造成的误差T0RH=(unsignedchar)(tmp>>8);//取高八位T0RL=(unsignedchar)tmp;//取第八位TMOD&=0xF0;//定义计时器工作状态TMOD|=0x01;TH0=T0RH;//初始值TH0(变量带入)TL0=T0RL;//初始值TL0ET0=1;//中断允许TR0=1;}//启动计时器/*数码管动态扫描函数*/voidfun(){ staticuint8i; switch(i)//数码管的位选和段选 { case0:P2=0xfe;P0=num[s[0]];break; case1:P2=0xfd;P0=num[s[1]];break; case2:P2=0xfb;P0=num[s[2]];break; case3:P2=0xf7;P0=num[s[3]];break; } i++; i&=0x03;}/*T0中断服务函数,执行按键扫描*/voidtime0()interrupt1{ TH0=T0RH; TL0=T0RL; KeyScan(); fun();}/*把数值的各个位分别存储在数组是s[4]中*/voidfuzhi(longn){ uint8i=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; }}/*复位*/voidReset(){ num1=0; num2=0; step=0; fuzhi(0);}/*读取运算数*/voidNumKeyAction(uint8n){ if(step>1){ Reset(); } if(step==0){ num1=num1*10+n; fuzhi(num1); } elseif(step==1){ num2=num2*10+n; fuzhi(num2); }}/*读取运算符*/voidOprtKeyAction(uint8n)//用于判断按键加、减、乘、除{ if(step==0){ fuzhi(0); s[0]=10; step=1; oprt=n; } } /*做运算*/voidGetResult()//加、减、乘、除函数运算{ if(step==1){ switch(oprt){ case0:num3=num1+num2;break; case1:num3=num1-num2;break; case2:num3=num1*num2;break; case3:num3=num1/num2;break; default:break; } fuzhi(num3); step=2; } }key.c:键盘按键程序#include<reg52.h>typedefunsignedcharuint8;sbitkeyout_1=P1^4;//定义键盘按键sbitkeyout_2=P1^5;sbitkeyout_3=P1^6;sbitkeyout_4=P1^7;sbitkeyin_1=P1^0;sbitkeyin_2=P1^1;sbitkeyin_3=P1^2;sbitkeyin_4=P1^3;externvoidReset();externvoid GetResult();externvoid NumKeyAction(uint8dat);externvoid OprtKeyAction(uint8dat);externuint8num[];uint8keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};//全部矩阵键盘的当前状态uint8keycode[4][4]={{'7','8','9','+'},//矩阵按键编号到标准键盘键码的映射表 {'4','5','6','-'}, {'1','2','3','*'}, {0x11,'0','=','/'}};voidKeyAction(uint8dat)//用于判断按键运算法则{ if((dat>='0')&&(dat<='9')){//判断按下键是否为数值 NumKeyAction(dat-'0'); } elseif(dat=='+'){ OprtKeyAction(0);//加法 } elseif(dat=='-'){ OprtKeyAction(1);//减法 } elseif(dat=='*'){ OprtKeyAction(2);//乘法 } elseif(dat=='/'){ OprtKeyAction(3);//除法 } elseif(dat=='='){ GetResult();//等于 } elseif(dat==0x11){//清零 Reset(); }}/*按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用*/voidKeyDriver()/{uint8i,j;staticuint8backup[4][4]={{1,1,1,1},{1,1,1,1},//按键值备份,保存前一次的值 {1,1,1,1},{1,1,1,1}}; for(i=0;i<4;i++)//循环检测4*4的矩阵按键 for(j=0;j<4;j++) if(keysta[i][j]!=backup[i][j]){//检测按键动作 if(backup[i][j]!=0) //按键按下时执行动作 KeyAction(keycode[i][j]); //调用按键动作函数 backup[i][j]=keysta[i][j]; //刷新前一次的备份值 } }/*按键扫描函数,需在定时中断中调用,调用间隔1ms*/voidKeyScan(){ uint8i; staticuint8keyout=0; //矩阵按键扫描输出索引 staticuint8keybuf[4][4]={ //矩阵按键扫描缓冲区 {0xff,0xff,0xff,0xff},{0xff,0xff,0xff,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]==0x00){ //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下 keysta[keyout][i]=0; } elseif(keybuf[keyout][i]==0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 种植桑黄方法
- 电缆线购买合同 购买电线合同
- 短视频创作者与经纪公司2024年度合作协议
- 2024年度金融投资与理财服务合同3篇
- 泵车租赁协议
- 二零二四年农业科研基地草坪除草合同
- 电梯维修合同范本
- 2024年度电梯门系统升级与改造合同3篇
- 玻璃容器生产与销售合同(04版)
- 二零二四年度设备采购合同
- 国企廉洁从业培训-《严守纪律底线、坚持廉洁从业》
- DB37-T 5020-2023 装配式建筑预制混凝土构件制作与验收标准
- 尿管滑脱不良事件分析
- 2023学年完整公开课版mydreamjob作文教学
- 急性脑梗塞护理查房1课件
- 课题结题材料初中生心理健康教育设计研究
- 沥青路面用木质素纤维检测原始记录
- 0~3岁儿童亲子活动设计与指导(高职学前教育)PPT完整全套教学课件
- 露天煤矿边坡监测报告
- 化脓性脑膜炎英文
- 消防演练制度规定
评论
0/150
提交评论