四乘四键盘显示_第1页
四乘四键盘显示_第2页
四乘四键盘显示_第3页
四乘四键盘显示_第4页
四乘四键盘显示_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、四乘四键盘显示一、设计要求4*4 矩阵键盘共 16 个键,每按一次键,数码管就显示一次按键代表的值。二、元件选取单片机: STC89C52RC;电阻: 470;发光二极管; 4*4 键盘;共阳极七段数码管三、设计思想本设计硬件上采用STC89C52RC 单片机的最小系统,单片机的P1 口与键盘相连, P1.0P1.3 管脚分别与键盘的四行连接,P1.4P1.7 管脚分别与键盘的四列相连;P0 口 P1.0P1.7 管脚与数码管 1 的 adp 相连, P2 口 P2.0P2.7 管脚分别与数码管2 的 adp 相连,数码管的公共端接 +5V 电源,控制数码管的显示;发光二极管的阴极与单片机的P

2、3.0 管脚连接,阳极与 +5V 电源连接,低电平有效,控制二极管发光;程序上采用定时扫描方式,利用定时T0 产生 50ms 定时中断, CPU 响应中断后进入Scan_Key()子程序对键盘进行扫描,对P1 口初值 0xf7 扫描第一行,进入延时程序消抖动后,进入 switch()语句,屏蔽行的低四位,取列的高四位,检测哪一列有键按下,若有键按下,标志位 FLAG0=1 ,发光二极管的到低电平发光;令 P1 口的初值右移一位后或 0x80 进行高位补一,扫描第二行,如此循环右移,四行便全都检测到了。 当有键按下时, m!=0xf0,进入 while 循环不停地执行 m&0xf0 语句

3、,使 m=0xf0 ;按键松开后, m=0xf0 跳出 while 循环,执行中断程序,显示按键的值。如此软件与硬件结合,能合理的完成设计要求,每按一次键,数码管就显示一次按键代表的值。四、原理图四、程序流程开始开定时器中断,定时器 0 初始化键盘扫描是否有键按下?NY发光二极管发光,确定按键值按键是否放开?NY中断程序开始数码管显示按键值定时器 0 重装初值中断返回数码管显示按键值五、调试过程调试过程中,遇到了以下问题 :一是数码管不能正常显示, 经检查是数码管公共端未接电源,连接后数码管还是不能正常显示,经检查是单片机接触不良,将单片机拔出,对照底座重新插入,然后在仿真数码管显示正常;二是

4、发光二极管在按键按下后不能正常发光,经检查是软件编程存在缺陷,定时时间短,单片机接收不到二极管的低电平,故不发光。经改进后,将二极管管脚赋低电平的语句嵌入到键盘扫描程序中,二极管工作正常。六、程序清单#include<reg52.h>#define RELOAD_H #define RELOAD_L( 65536-50000)/256; /定义定时器 ( 65536-50000)%256;0 重装值extern void Timer0_Init(void); / 定时器初始化子函数 extern void Delay(unsigned int n); extern void Sca

5、n_Key(void);unsigned char dispcode2;unsigned char dofly16;unsigned char ptr,m;unsigned int t,c;bit FLAG0=0; / 定义是否有键按下sbit Beep = P30;/发光二极管管脚void main(void)Timer0_Init();while(1)Scan_Key();/扫描键盘void Timer0_Init(void)/定时器0 初始化TMOD=0x01;/定时器0,方式1TL0=RELOAD_L;/TL0定时器0 低8 位计数器TH0=RELOAD_H;/TH0定时器0 高8 位

6、计数器TR0=1;/定时器 /计数器0启动位./TR0=1:开始计时或计数ET0=1;/定时器 /计数器0 中断使能EA=1;/全局中断使能void Timer0_ISR(void) interrupt 1/定时器0 中断服务程序P0=doflyc;P2=doflyt;TL0=RELOAD_L;/定时器0 初值重装TH0=RELOAD_H;void Delay(unsigned int n)/延时unsigned int i,j;for(i=0;i<n;i+)for(j=0;j<80;j+);unsigned char dofly16=0xc0,0xf9,0xa4,0xb0,0x9

7、9,0x92,0x82,0xf8,0x80,0x90; / 数码管显示程序void Scan_Key(void)/ 键盘扫描程序char a1,i;bit FLAG0=0;a1=0xf7;ptr=0;/列扫描初值for(i=0;i<4;i+)/键盘4 个扫描列P1=a1;Delay(10);m=P1;switch(m&0xf0)/取行的高4 位,侦测哪一行有按键被按下case 0x70:ptr=i*4;/第一行被按否?如有则是tabi*4键FLAG0=1;Beep=0;/表示有按键break;case 0xb0:ptr=i*4+1;/第二行被按否?如有则是tabi*4+1键FLAG0=1;Beep=0;break;case 0xd0:ptr=i*4+2;/第三行被按否 ? 如有则是 tabi*4+2 键FLAG0=1; Beep=0;break;case 0xe0: ptr=i*4+3;/第四行被按否 ?如有则是 tabi*4+3 键FLAG0=1; Beep=0;break;default:break;a1=(a1>>1)|0x80;while(

温馨提示

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

最新文档

评论

0/150

提交评论