您好,欢迎访问三七文档
任务八键盘接口扩展任务分析:实现键盘接口扩展硬件独立式键盘与行列式键盘的结构和原理软件独立式键盘查询原理行列式键盘列扫描查询原理编译、下载、调试软件:keil、Proteus按键及键盘键盘:由若干个按键组成的开关矩阵,是实现人机对话或人机通信的常用工具。根据按键的识别方式分:由硬件识别键的闭合—编码键盘由软件识别键的闭合—未编码键盘按键开关:机械弹性开关,机械开关在闭合及断开瞬间均伴随有一连串的抖动,时间一般为5~10ms。按键及键盘键按下闭合稳定前沿抖动后沿抖动释放稳定键释放按键时的抖动消除键抖动可用硬件和软件两种方法硬件消抖:RS触发器软件消抖:延时5~10ms左右再检测Vcc(+5V)Vcc(+5V)AB输出RS触发器消抖电路键盘扫描控制方式程序控制方式:键盘处理程序固定在主程序的某个程序段。特点:对CPU工作影响小应考虑键盘处理程序运行间隔周期不能太长,否则影响对键盘输入响应的及时性。定时控制扫描方式:利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。特点:采用定时/计数器定时控制扫描间隔。定时时间不能太长,否则影响对键盘输入响应的及时性。中断控制方式:利用外部中断源,响应键盘输入信号。特点:能及时处理键盘输入,又能提高CPU运行效率要占用一个中断资源。K0K1K2独立式未编码键盘接口独立式键盘:各按键相互独立地接通一条输入数据线。查询方式:输入线平时为高电平;若有任意键按下时,输入线为低电平。优点:电路、编程简单缺点:按键较多时,占用较多I/O口线。•例、用查询方式编写独立式按键程序•#includereg51.h•sbitK0=P1^0;//定义按键所连I/O口•sbitK1=P1^1;•sbitK2=P1^2;•//延时子程序:由Delay参数决定延时时间•voidmDelay(unsignedintDelay)•{•unsignedinti;•for(;Delay0;Delay--)•{for(i=0;i114;i++);•}•}•//按键扫描子程序,判断按键是否按下,如果按下并处理•voidkeyscan(void)•{if(!K0)//K0按键是否按下•{mDelay(5);//延时消抖•if(!K0)•{...;//K0按键确实按下,进行处理•while(!K0);//等待K0按键释放•}•}•if(!K1)//K1按键是否按下•{mDelay(5);//延时消抖•if(!K1)•{...;//K1按键确实按下,进行处理•while(!K1);//等待K1按键释放•}•}•if(!K2)//K2按键是否按下•{mDelay(5);//延时消抖•if(!K2)•{...;//K2按键确实按下,进行处理•while(!K2);//等待K2按键释放•}•}•}•voidmain(void)•{•while(1)•{•P1=0xff;//设置P1为输入方式•keyscan();•}•}行列式未编码键盘原理未编码4*4行列式键盘K0K1K2K3K4K5K6K7K8K9K10K11K12K13K14K15A8A9A10A11A12A13A14A15行列式键盘列扫描查询原理行列式键盘线反转法扫描查询原理先判别按键所在的行:由P2口输出列扫描字0x0F,然后读行线状态到变量temp1中。如果有按键按下,则行输入不全为1,即不等于0x0F;如果无按键按下,则行输入全为1,即等于0x0F。再判别按键所在的列:由P2口输出行扫描字0xF0,然后读列线状态到变量temp2中。将temp1和temp2的状态相或得到按键的编码,从而知道按键的值。•#includereg52.h•//延时子程序:由Delay参数决定延时时间•voidmDelay(unsignedintDelay)•{unsignedinti;•for(;Delay0;Delay--)•{for(i=0;i114;i++){;}•}•}•//按键扫描子程序,有键按下,返回键值00-15;无键按下,返回0xff。•unsignedcharMatrix_key(void)•{•unsignedcharkey,temp1,temp2;•key=0xff;//初始化键值•P2=0x0f;//输出列扫描字•if((P2&0x0F)!=0x0f)//读行线状态,判断是否有键按下•{•mDelay(10);//延时消抖•P2=0x0f;//输出列扫描字•temp1=P2&0x0f;//读行线状态到temp1中•if(temp1!=0x0f)//有键按下•{P2=0xf0;//输出行扫描字•temp2=P2&0xf0;//读列线状态到temp2中•switch(temp1|temp2)•{case0xee:key=0;break;•case0xde:key=1;break;•case0xbe:key=2;break;•case0x7e:key=3;break;•case0xed:key=4;break;•case0xdd:key=5;break;•case0xbd:key=6;break;•case0x7d:key=7;break;•case0xeb:key=8;break;•case0xdb:key=9;break;•case0xbb:key=10;break;•case0x7b:key=11;break;•case0xe7:key=12;break;•case0xd7:key=13;break;•case0xb7:key=14;break;•case0x77:key=15;break;•default:key=0xff;break;}}}•else{;}•return(key);//返回键值•}voidmain(void){unsignedcharkey_value;while(1){key_value=Matrix_key();//调用按键识别子程序switch(key_value)//根据按键分支{case0:P0=0xfe;break;//0号按键,LED1点亮case1:P0=0xfd;break;//1号按键,LED2点亮case2:P0=0xfb;break;//2号按键,LED3点亮case3:P0=0xf7;break;//3号按键,LED4点亮case4:P0=0xef;break;//4号按键,LED5点亮case5:P0=0xdf;break;//5号按键,LED6点亮case6:P0=0xbf;break;//6号按键,LED7点亮case7:P0=0x7f;break;//7号按键,LED8点亮default:break;//无效按键}}}实验内容硬件连接•K3—K0连接P1.3—P1.0•LED3---LED0连接P1.7---P1.4•LED数码管的8根段码线----P0•LED数码管的2根位码线----P2.1—P2.0实验内容•对独立式按键进行编程,实现:按K0,D0点亮;按K1,D1点亮;按K2,D2点亮;按K3,D3点亮。•对独立式按键进行编程,实现:每按一次K0,使得4个LED按照二进制数递增的顺序显示。•对独立式按键进行编程,实现:按K0,数码管显示00;按K1,数码管显示01;按K2,数码管显示02;按K3,数码管显示03。•#includereg51.h//实验3程序•#includeintrins.h•unsignedcharcodedis_tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};•unsignedchardatadis_data,bit_data;•sbitK0=P1^0;//定义按键所连I/O口•sbitK1=P1^1;•sbitK2=P1^2;•sbitK3=P1^3;•unsignedcharj;•//延时子程序:由Delay参数决定延时时间•voidmDelay(unsignedintDelay)•{•unsignedinti;•for(;Delay0;Delay--)•{•for(i=0;i114;i++);•}•}•voiddisplay()•{•bit_data=0xfe;•P2=0xff;•P3=dis_tab[j%10];•P2=bit_data;•mDelay(5);•bit_data=_crol_(bit_data,1);•P2=0xff;•P3=dis_tab[j/10];•P2=bit_data;•mDelay(5);••}voidkeyscan(void)•{if(!K0)//K0按键是否按下•{mDelay(5);//延时消抖•if(!K0)•{j=0;//K0按键确实按下,置键号0•while(1)•{display();•if(K0){P2=0xff;break;}//等待K0按键释放•}••}•}•if(!K1)//K1按键是否按下•{mDelay(5);//延时消抖•if(!K1)•{j=1;//K1按键确实按下,置键号1•while(1)•{display();•if(K1){P2=0xff;break;}//等待K1按键释放•}•}•}•if(!K2)//K2按键是否按下•{mDelay(5);//延时消抖•if(!K2)•{j=2;//K2按键确实按下,置键号2•while(1)•{display();•if(K2){P2=0xff;break;}//等待K2按键释放•}•}•}•if(!K3)//K3按键是否按下•{mDelay(5);//延时消抖•if(!K3)•{j=3;//K3按键确实按下,置键号3•while(1)•{display();•if(K3){P2=0xff;break;}//等待K3按键释放•}•}•}•}•voidmain(void)•{j=0;•while(1)•{•P1=0xff;//设置P1为输入方式•keyscan();••}•}
本文标题:任务八 键盘接口
链接地址:https://www.777doc.com/doc-3313968 .html