51单片机矩阵键盘扫描程序_第1页
51单片机矩阵键盘扫描程序_第2页
51单片机矩阵键盘扫描程序_第3页
51单片机矩阵键盘扫描程序_第4页
51单片机矩阵键盘扫描程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、/*名称:矩阵键盘依次输入控制使用行列逐级扫描论坛:编写:shifang日期:2009.5修改:无内容:如计算器输入数据形式相同从右至左使用行列扫描方法 */#include / 包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 定义数据端口程序中遇到 DataPort则用P0替换#define KeyPortP1sbit LATC H仁P2八2;/定义锁存使能端口段锁存sbit LATCH2=P2A3;/位 锁存unsigned char codedofly_DuanMa=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d

2、,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/显示段码值 0Fun sig nedcharcodedofly_WeiMa=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; 分别对应相应的数码管点亮 ,即位码unsigned char TempData8; /存储显示值的全局变量void DelayUs2x(unsigned char t);/us 级延时函数声明void DelayMs(unsigned char t); /ms 级延时void Display (un sig ned char FirstBit,

3、un sig ned char Num);/数码管显示函数 un sig ned char KeySca n(v oid);/键盘扫描 unsigned char KeyPro(void);void Init_Timer0(void);/ 定时器初始化/*主函数*/void main (void)unsigned char num,i,j;unsigned char temp8;Init_Timer0();while(1)/ 主循环 num=KeyPro(); if(num!=0xff)if(i8)tempi=dofly_DuanManum;for(j=0;j=i;j+)TempData7-i

4、+j=tempj;i+;if(i=9)多出一个按键输入为了清屏原本应该为8i=0;for(j=0;j8;j+) 清屏TempDataj=0;/Display(0,8); / 显示全部 8 位/ 主循环中添加其他需要一直工作的程序 /*uS延时函数,含有输入参数 un sig ned char t,无返回值un sig ned char是定义无符号字符变量,其值的范围是0255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS */void DelayUs2x(unsigned char t)while(-t);/*mS延时函数,含有输入参数 un sig ned c

5、har t,无返回值un sig ned char是定义无符号字符变量,其值的范围是0255这里使用晶振12M,精确延时请使用汇编*/void DelayMs(unsigned char t)while(t-)/大致延时 1mSDelayUs2x(245);DelayUs2x(245);/*显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值 2 表示从第三个数码管开 始显示如输入 0 表示从第一个显示。Num 表示需要显示的位数,如需要显示 99 两位数值则该值输入 2 */void Display(unsigned char FirstBit,unsigne

6、d char Num)static unsigned char i=0; DataPort=0;/ 清空数据,防止有交替重影LATCH仁1;/段锁存LATCH1=0;DataPort=dofly_WeiMai+FirstBit; / 取位码LATCH2=1;/位锁存LATCH2=0;DataPort=TempDatai; /取显示数据,段码LATCH仁1;/段锁存LATCH1=0;i+;if(i=Num)i=0;/*定时器初始化子程序 */void Init_Timer0(void)TMOD |= 0x01 ;/使用模式 1 , 1 6位定时器,使用 | 符 号可以在使用多个定时器时不受影响T

7、HO=OxOO;给定初值/TL0=0x00;EA=1;总中断打开ET0=1;定时器中断打开TR0=1;定时器开关打开/*定时器中断子程序*/void TimerO_isr(void) interrupt 1TH0=(65536-2000)/256; 重新赋值 2msTL0=(65536-2000)%256;Display(0,8);调用数码管扫描/*按键扫描函数,返回扫描键值*/un sig ned char KeySca n(void)/键盘扫描函数,使用行列逐级扫描法 un sig ned char Val;KeyPort=OxfO;高四位置高,低四位拉低if(KeyPort!=OxfO)

8、 表示有按键按下DelayMs(10);/去抖if(KeyPort!=0xf0)/表示有按键按下KeyPort=0xfe; /检测第一行if(KeyPort!=0xfe)Val=KeyPort&0xf0;Val+=0x0e;while(KeyPort!=0xfe);DelayMs(10); /去抖while(KeyPort!=0xfe);return Val;KeyPort=0xfd; / 检测第二行 if(KeyPort!=0xfd)Val=KeyPort&0xf0; Val+=0x0d;while(KeyPort!=0xfd);DelayMs(10); /去抖while(KeyPort!=

9、0xfd);return Val;KeyPort=0xfb; / 检测第三行 if(KeyPort!=0xfb)Val=KeyPort&0xf0; Val+=0x0b;while(KeyPort!=0xfb);DelayMs(10); /去抖while(KeyPort!=0xfb);return Val;KeyPort=0xf7; / 检测第四行 if(KeyPort!=0xf7)Val=KeyPort&0xf0; Val+=0x07;while(KeyPort!=0xf7);DelayMs(10); /去抖while(KeyPort!=0xf7);return Val;return 0xff

10、;/*按键值处理函数,返回扫键值*/unsigned char KeyPro(void)switch(KeyScan()case 0x7e:return 0;break;/0 按下相应的键显示相对应的码值case 0x7d:return 1;break;/1case 0x7b:return 2;break;/2case 0x77:return 3;break;/3case 0xbe:return 4;break;/4case 0xbd:return 5;break;/5case 0xbb:return 6;break;/6case 0xb7:return 7;break;/7case 0xde:return 8;break;/8case 0xdd:return 9;break;/9case 0xdb:return 10;break;/acase 0xd7

温馨提示

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

评论

0/150

提交评论