单片机 4x4矩阵键盘

一.设初始值【P3=0xf0】,当S11被按压的时候,P3值变为【0xd0】

#include<reg52.h> sbit du=P2^6; sbit we=P2^7; void delay(unsigned int x) { unsigned char i; while(x--) { for(i=0;i120;i++); } } unsigned char leddata[]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //?? 0x00 //??? }; unsigned char array[8]={ 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; uchar KeyScan() { uchar cord_l,cord_h; //声明列线和行线的值的存储变量 P3 = 0xf0; //1111 0000 if( (P3 & 0xf0) != 0xf0) { delay(5); if( (P3 & 0xf0)!= 0xf0)// 判断是否有按键按下 { cord_l=P3 & 0xf0; //存储列线值 P3=cord_l | 0x0f; cord_h = P3 & 0xf0; while( (P3 & 0xf0)!= 0xf0) //松手检测 return (cord_l +cord_h); //返回键值码 } } void KeyPro() { switch(KeyScan()) { //第一行键 case 0xee: P0 = leddata[0]; break; case 0xde: P0 = leddata[1]; break; case 0xbe: P0 = leddata[2]; break; case 0x7e; P0= leddata[3]; break; //第二行键 case 0xed: P0 = leddata[4]; break; case 0xdd; P0= leddata[5]; break; case 0xbd; P0= leddata[6]; break; case 0x7d; P0= leddata[7]; break; //第三行键 case 0xeb; P0= leddata[8]; break; case 0xdb; P0= leddata[9]; break; case 0xbb; P0= leddata[10]; break; case 0x7b; P0= leddata[11]; break; //第四行键 case 0xe7; P0= leddata[12]; break; case 0xd7; P0= leddata[13]; break; case 0xb7; P0= leddata[15]; break; case 0x77; P0= leddata[16]; break; } } void main() { we =1;//打开位选段 P0=0;//数码管全显示 we=0; du=1; while(1) { P1= KeyScan(); } } }
二.当S11被按下的值存储为L=0xd0(确定一列)
一个二次元的生物

浙公网安备 33010602011771号