版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、原理图设计说明 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年度山西省高校教师资格证之高等教育心理学通关题库(附答案)
- 2023年真空电子器件及零件资金筹措计划书
- 2024年福建省砌筑工竞赛理论题题库及答案
- 餐厅服务基本理论知识考试题及答案
- 第01讲 1.1反应热 焓变(含答案)-2024年高中化学同步精讲义(选择性必修一)
- 2024企业品牌产品区域代理经销协议
- AI技术在电力系统发展中的应用与前景
- 适合农村孩子的读书节活动方案
- 教学课件:第二十章紫外-可见吸光光度法
- 2024货物运输协议规范化文档
- 十大医药代表成功经验分享
- 《克服厌学情绪》课件
- 2024全新第五版FMEA培训教材
- 顶管施工安全警示与提醒
- 万千教育学前与儿童一起探索自然:幼儿园自然课程故事
- 小班美术教案:小兔家的新门帘教案及教学反思
- 人工智能在体育运动中的运用
- 残联交流经验发言模板
- 消防通道畅通
- 2024年沈阳水务集团招聘笔试参考题库含答案解析
- 新媒体视听节目制作 第七章 作品的编辑构思
评论
0/150
提交评论