51单片机矩阵键盘扫描程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

/*-----------------------------------------------名称:矩阵键盘依次输入控制使用行列逐级扫描论坛:编写:shifang日期:2009.5修改:无内容:如计算器输入数据形式相同从右至左使用行列扫描方法------------------------------------------------*/#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换#defineKeyPortP1sbitLATCH1=P2^2;//定义锁存使能端口段锁存sbitLATCH2=P2^3;//位锁存unsignedcharcodedofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~Funsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsignedcharTempData[8];//存储显示值的全局变量voidDelayUs2x(unsignedchart);//us级延时函数声明voidDelayMs(unsignedchart);//ms级延时voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数unsignedcharKeyScan(void);//键盘扫描unsignedcharKeyPro(void);voidInit_Timer0(void);//定时器初始化/*------------------------------------------------主函数------------------------------------------------*/voidmain(void){unsignedcharnum,i,j;unsignedchartemp[8];Init_Timer0();while(1)//主循环{num=KeyPro();if(num!=0xff){if(i8){temp[i]=dofly_DuanMa[num];for(j=0;j=i;j++)TempData[7-i+j]=temp[j];}i++;if(i==9)//多出一个按键输入为了清屏原本应该为8{i=0;for(j=0;j8;j++)//清屏TempData[j]=0;}}//Display(0,8);//显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5uS------------------------------------------------*/voidDelayUs2x(unsignedchart){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsignedchart){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。Num表示需要显示的位数,如需要显示99两位数值则该值输入2------------------------------------------------*/voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;DataPort=0;//清空数据,防止有交替重影LATCH1=1;//段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响//TH0=0x00;//给定初值//TL0=0x00;EA=1;//总中断打开ET0=1;//定时器中断打开TR0=1;//定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/voidTimer0_isr(void)interrupt1{TH0=(65536-2000)/256;//重新赋值2msTL0=(65536-2000)%256;Display(0,8);//调用数码管扫描}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsignedcharKeyScan(void)//键盘扫描函数,使用行列逐级扫描法{unsignedcharVal;KeyPort=0xf0;//高四位置高,低四位拉低if(KeyPort!=0xf0)//表示有按键按下{DelayMs(10);//去抖if(KeyPort!=0xf0){//表示有按键按下KeyPort=0xfe;//检测第一行if(KeyPort!=0xfe){Val=KeyPort&0xf0;Val+=0x0e;while(KeyPort!=0xfe);DelayMs(10);//去抖while(KeyPort!=0xfe);returnVal;}KeyPort=0xfd;//检测第二行if(KeyPort!=0xfd){Val=KeyPort&0xf0;Val+=0x0d;while(KeyPort!=0xfd);DelayMs(10);//去抖while(KeyPort!=0xfd);returnVal;}KeyPort=0xfb;//检测第三行if(KeyPort!=0xfb){Val=KeyPort&0xf0;Val+=0x0b;while(KeyPort!=0xfb);DelayMs(10);//去抖while(KeyPort!=0xfb);returnVal;}KeyPort=0xf7;//检测第四行if(KeyPort!=0xf7){Val=KeyPort&0xf0;Val+=0x07;while(KeyPort!=0xf7);DelayMs(10);//去抖while(KeyPort!=0xf7);returnVal;}}}return0xff;}/*------------------------------------------------按键值处理函数,返回扫键值------------------------------------------------*/unsignedcharKeyPro(void){switch(KeyScan()){case0x7e:return0;break;//0按下相应的键显示相对应的码值case0x7d:return1;break;//1case0x7b:return2;break;//2case0x77:return3;break;//3case0xbe:return4;break;//4case0xbd:return5;break;//5case0xbb:return6;break;//6case0xb7:return7;break;//7case0xde:return8;break;//8case0xdd:return9;break;//9case0xdb:return10;break;//acase0xd7:return11;break;//bcase0xee:return12;break;//ccase0xed:return13;break;//dcase0xeb:return14;break;//ecase0xe7:return15;break;//fdefault:return0xff;break;}}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功