单片机:矩阵键盘实现列扫描,数码管输出0~F

    科技2025-08-31  8

    列扫描法类似行扫描法:话不多说,如下! 矩阵键盘如下图:

    列扫描涉及到与运算:与运算符号为& ,计算规则是:有0全为0,全1才为1 如:1111 00001011 0000进行与运算 1111 0000 1011 0000 ----------- 运算结果: 1011 0000 行扫描法:假设按下的是3号键 第1步:识别键盘有无键按下 第2步,识别出哪个按键被按下。采用逐列扫描法,在某一时刻只让1条列线处于低电平,其余所有列线处于高电平。 当第1列为低电平,其余各列为高电平时,因为是3号键被按下, 第1行的行线仍处于高电平;当第2列为低电平,其余各列为高电平时, 第1行的行线仍处于高电平;直到让第4列为低电平,其余各列为高电平时, 此时第1行的行线电平变为低电平,据此,可判断第1行第4列交叉点处的按键,即3号键被按下。 #include <reg52.h> typedef unsigned char u8; #define KEY_PRESS P1 //控制P1的口 unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char KeyScan();//列扫描函数,返回相应的键值 unsigned char KeyPro(); //根据列扫描函数返回的键值,确定对应的按键,并返回0-15 即0-F unsigned char Value; //保存键值 void delay(int ms) //延迟函数 { u8 i; while(ms--) { for(i=0; i<110; i++); } } void main() { while(1) { delay(10); P0 = smg[KeyPro()];//输出选中的按键对应的键值 } } unsigned char KeyScan() { KEY_PRESS=0xf0; //令低四位(列)为0,高四位(行)为1,即1111 0000,若有按键按下,则高四位的其中一位为0 if(KEY_PRESS!=0xf0)//判断是否有按键按下 { delay(10); //消抖 KEY_PRESS=0xf7; //扫描第一列 if(KEY_PRESS!=0xf7) { Value=KEY_PRESS&0xf7;//进行与运算:有0全为0,全1才为1 return Value; } KEY_PRESS=0xfb; //扫描第二列 if(KEY_PRESS!=0xfb) { Value=KEY_PRESS&0xfb; return Value; } KEY_PRESS=0xfd; //扫描第三列 if(KEY_PRESS!=0xfd) { Value=KEY_PRESS&0xfd; return Value; } KEY_PRESS=0xfe; //扫描第四列 if(KEY_PRESS!=0xfe) { Value=KEY_PRESS&0xfe; return Value; } } return Value; } unsigned char KeyPro() { switch(KeyScan()) { case 0x77:return 0;break;//0 case 0x7b:return 1;break;//1 case 0x7d:return 2;break;//2 case 0x7e:return 3;break;//3 case 0xb7:return 4;break;//4 case 0xbb:return 5;break;//5 case 0xbd:return 6;break;//6 case 0xbe:return 7;break;//7 case 0xd7:return 8;break;//8 case 0xdb:return 9;break;//9 case 0xdd:return 10;break;//a case 0xde:return 11;break;//b case 0xe7:return 12;break;//c case 0xeb:return 13;break;//d case 0xed:return 14;break;//e case 0xee:return 15;break;//f } }

    不对之处望见谅,并指出错误 ( ̄︶ ̄)↗ 

    Processed: 0.013, SQL: 8