工商企业网,网站建设seo优化的好处,网站设计要考虑的因素,有关网站建设的外文参考文献eg1#xff1a; 单片机键盘的分类
键盘分为编码键盘和非编码键盘#xff0c;键盘上闭合键的识别由专用的硬件编码器实现#xff0c;并产生键编码号或键值得称为编码键盘#xff0c;如计算机键盘#xff0c;而靠软件来识别的称为非编码键盘#xff0c;在单片机组成的各种…eg1 单片机键盘的分类
键盘分为编码键盘和非编码键盘键盘上闭合键的识别由专用的硬件编码器实现并产生键编码号或键值得称为编码键盘如计算机键盘而靠软件来识别的称为非编码键盘在单片机组成的各种系统中使用最多的就是非编码键盘也有使用到编码键盘的非编码键盘又称为独立式和矩阵式键盘。
单片机键盘根据按键的结构和工作原理的不同可以分为以下几类
矩阵键盘Matrix Keyboard 矩阵键盘是最常见的单片机键盘之一。它使用一种矩阵排列的按键结构通过行和列的交叉点来确定按下的按键。一般通过行列扫描的方式来检测按键的按下和释放。 独立按键Individual Key 独立按键是指每一个按键都有独立的引脚连接到单片机。每个按键都使用一个独立的IO引脚通过读取引脚的电平状态来检测按键的按下和释放。独立按键一般用于需要较少按键的应用场景。 脉冲编码开关Encoder Switch 脉冲编码开关也被称为旋转编码开关用于检测旋转操作。它通常由两个触点组成通过检测两个触点的状态变化来确定旋转方向和步数。脉冲编码开关常用于旋转编码器、音量调节器等应用场景。 矩阵键盘和独立按键结合 在某些情况下矩阵键盘和独立按键可能会结合使用。例如一些常用的功能按键使用独立按键而数字键盘使用矩阵键盘的方式来连接到单片机。
单片机键盘电路设计图 test1点击第一个按钮时点亮第一个led管
#include REGX52.H
#include INTRINS.H
sbit d1 P1^0;
sbit keyboard01 P3^0;void main(){P3 0xff; // 1111 1111while(1){if(keyboard01 0){d1 0;}else{d1 1;}}
}单片机的按键在闭合和断开时触点会出现抖动现象 独立键盘的检测与消抖
eg2: 点击独立按键的同时led亮灭同时晶体管统计次数当数字为9时归0
#include REGX52.H
#include INTRINS.H
sbit d1 P1^0;
sbit dula P2^6;
sbit wela P2^7;
sbit keyboard01 P3^0;
// 宏定义
#define uint unsigned int
#define uchar unsigned char
uchar num;
uint code table[] {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};void delay(uint z){uint x,y;for(x z; x 0; x --){for(y 110; y 0; y--){}}}void main(){wela 1;P0 0xfe;wela 0;P3 0xff; // 1111 1111while(1){if(keyboard01 0){delay(10);if(keyboard01 0){d1 0;num ;if(num 10){num 0;}}// 判断加上松手检测while(!keyboard01);delay(10);while(!keyboard01);}else{d1 1; dula 1;P0 table[num];dula 0;}}
}eg3:矩阵键盘 以下的矩阵表示第二行的第一个按键按下去其它的16进制依次类推 10110111 − − − − 11101101 0 x e d 10110111 ---- 1110 1101 0xed 10110111−−−−111011010xed
eg4:51片机矩阵代码实现每按一个按键就会显示一个不同的数
#include REGX52.H
#include INTRINS.H
sbit d1 P1^0;
sbit dula P2^6;
sbit wela P2^7;
sbit keyboard01 P3^0;
// 宏定义
#define uint unsigned int
#define uchar unsigned char
uchar num,temp,num1;
uint code table[] {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};// 函数声明
uchar keyboardScan();void delay(uint z){uint x,y;for(x z; x 0; x --){for(y 110; y 0; y--){}}}void main(){// 让所有的数码管都显示num 17;dula 1;P0 0;dula 0;wela 1;P0 0xc0;wela 0;//0xfe 的值是0111 1111 --- 1111 1110 while(1){num1 keyboardScan();dula 1;P0 table[num1-1]; dula 0;}}// 键盘扫描函数
uchar keyboardScan(){// 检测键盘P3 0xfe;temp P3;// 1111 1110 1111 0000 1111 0000// 0xf0 表示的值是0000 1111--- 1111 0000temp temp0xf0; // c语言中的switchcase语句while(temp ! 0xf0){delay(5);temp P3;temp temp0xf0;while(temp ! 0xf0){temp P3;switch(temp){case 0xee: // 0111 -- 1110num 1;break; case 0xde: //1011 -- 1101num 2; break; case 0xbe: // 1011num 3;break;case 0x7e: // 0111num 4;break;}while(temp ! 0xf0){temp P3;temp temp0xf0;}// 函数的参数可以作为子函数进行调用/*dula 1;0 table[num -1];dula 0; */}}// 检测第二行------------------------------------------------------// 检测键盘P3 0xfd;temp P3;// 1111 1110 1111 0000 1111 0000// 0xf0 表示的值是0000 1111--- 1111 0000temp temp0xf0; // c语言中的switchcase语句while(temp ! 0xf0){delay(5);temp P3;temp temp0xf0;while(temp ! 0xf0){temp P3;switch(temp){case 0xed: // 0111 -- 1110num 5;break; case 0xdd: //1011 -- 1101num 6; break; case 0xbd: // 1011num 7;break;case 0x7d: // 0111num 8;break;}while(temp ! 0xf0){temp P3;temp temp0xf0;}// 函数的参数可以作为子函数进行调用/*dula 1;0 table[num -1];dula 0; */}}// 检测第三行-------------------------------------------|---------------|-----------------|----------------|// 检测键盘P3 0xfb;temp P3;// 1111 1110 1111 0000 1111 0000// 0xf0 表示的值是0000 1111--- 1111 0000temp temp0xf0; // c语言中的switchcase语句while(temp ! 0xf0){delay(5);temp P3;temp temp0xf0;while(temp ! 0xf0){temp P3;switch(temp){case 0xeb: // 0111 -- 1110num 9;break; case 0xdb: //1011 -- 1101num 10; break; case 0xbb: // 1011num 11;break;case 0x7b: // 0111num 12;break;}while(temp ! 0xf0){temp P3;temp temp0xf0;}// 函数的参数可以作为子函数进行调用/*dula 1;0 table[num -1];dula 0; */}}// 检测第四行--------|---------------|--------------------|---------------------------|-----------------------|------------- // 检测键盘P3 0xf7;temp P3;// 1111 1110 1111 0000 1111 0000// 0xf0 表示的值是0000 1111--- 1111 0000temp temp0xf0; // c语言中的switchcase语句while(temp ! 0xf0){delay(5);temp P3;temp temp0xf0;while(temp ! 0xf0){temp P3;switch(temp){case 0xe7: // 0111 -- 1110num 13;break; case 0xd7: //1011 -- 1101num 14; break; case 0xb7: // 1011num 15;break;case 0x77: // 0111num 16;break;}// 松手检测代码while(temp ! 0xf0){temp P3;temp temp0xf0;}// 函数的参数可以作为子函数进行调用/*dula 1;0 table[num -1];dula 0; */}}return num;}代码的截图-----------需要后期优化
51单片机点击某个keyboard后的显示结果