这是单片机4X4的键盘识别程序,请帮我解释,最好每句执行操作和原理都有,特别是case 0X0e; key=7的原因 谁能给我讲讲单片机4X4矩阵键盘的编程步骤?(最好有例程注解...

\u5355\u7247\u673a4*4\u952e\u76d8\u626b\u63cf\u7a0b\u5e8f

// \u4f60\u8981\u770b\u5f97\u61c2\u4ee3\u7801\u9996\u5148\u4f60\u8981\u4e86\u89e3\u6309\u952e\u626b\u63cf\u7684\u539f\u7406// k_input\u662fPx 8\u4e2aIO \uff08x=0/1/2/3\uff09uchar keys(){ uchar i,j,k_in,k_out=0xfe,jm; k_input=0x0f // \u6b65\u9aa41\uff1aPx7~Px4\u4e3a\u4f4e\uff0cPx3~Px0\u4e3a\u9ad8 if(k_input!=0x0f) // \u6b65\u9aa42\uff1a\u662f\u5426\u6709\u6309\u952e\u6309\u4e0b\uff0c\u5982\u679c\u6709\uff0cPx\u7684\u503c\u5c06\u53d1\u751f\u53d8\u5316 yanshi(10); // \u8f6f\u4ef6\u6d88\u9664\u6296\u52a8 else return 16; // \u5982\u679c\u6ca1\u6709\uff0c\u8fd4\u56de\u7a7a\u952e\u503c for( jm=0; jm>4)&j) // \u5982\u679c\u6709\u6309\u952e\u6309\u4e0b\uff0c\u8fd4\u56de\u88ab\u6309\u4e0b\u7684\u6309\u952e\u503c return (jm*4+i); j=_crol_(j,1); // \u5982\u679c\u6ca1\u6709\u6309\u952e\u6309\u4e0b\uff0c\u4f9d\u6b21\u626b\u63cf\u8fd9\u4e00\u5217\u7684\u5176\u4ed6\u6309\u952e } k_out=crol_(k_out,1); // \u6b65\u9aa45\uff1a\u79fb\u4f4d\uff0c\u4f9d\u6b21\u626b\u63cf\u53e6\u4e00\u5217\uff0c\u76f4\u5230\u68c0\u6d4b\u5230\u6309\u952e\u6309\u4e0b } return 16; // \u5982\u679c\u6ca1\u6709\u626b\u63cf\u5230\u6309\u952e\uff0c\u8ba4\u4e3a\u662f\u8bef\u89e6\u53d1\uff0c\u8fd4\u56de\u7a7a\u952e\u503c}

4*4\u7684\u952e\u76d8
\u5148\u8bf4\u4e0b\uff0c\u4e00\u4e2a\u952e\u76d8\u5427\uff0c\u5ef6\u65f6\u53bb\u6296\u52a8\uff0c\u5c31\u662f\u8bf4\uff0c\u6309\u952e\u6309\u4e0b\u7684\u65f6\u5019\u662f\u4f4e\u7535\u5e73\uff0c\u90a3\u4e48\u5728\u7b4910-20ms\u786e\u5b9a\u662f\u4e0d\u662f\u6309\u4e0b\u4e86\u6309\u952e\uff0c\u6309\u4e0b\u4e4b\u540e\u4e00\u822c\u90fd\u662f\u5148\u7b49\u6309\u952e\u91ca\u653e\uff0c\u91ca\u653e\u53ea\u6709\u6267\u884c\u7a0b\u5e8f\uff0c\u8fd9\u6837\u5c31\u80fd\u786e\u4fdd\u4e0b\u6b21\u6309\u952e\u7684\u65f6\u5019\u8ddf\u672c\u6b21\u6309\u952e\u7684\u64cd\u4f5c\u4e0d\u4f1a\u5e72\u6270\u4e86
/*----------------------------------------------- \u529f\u80fd\uff1a\u6309\u4e00\u6b21\u6309\u952e\uff0cled\u70b9\u4eae\uff0c\u518d\u6309\u4e00\u6b21\u7184\u706d\uff0c\u4ee5\u6b64\u5faa\u73af------------------------------------------------*/#include //\u5305\u542b\u5934\u6587\u4ef6\uff0c\u4e00\u822c\u60c5\u51b5\u4e0d\u9700\u8981\u6539\u52a8\uff0c\u5934\u6587\u4ef6\u5305\u542b\u7279\u6b8a\u529f\u80fd\u5bc4\u5b58\u5668\u7684\u5b9a\u4e49sbit KEY=P3^2; //\u5b9a\u4e49\u6309\u952e\u8f93\u5165\u7aef\u53e3sbit LED=P0^0; //\u5b9a\u4e49led\u8f93\u51fa\u7aef\u53e3void DelayUs2x(unsigned char t);//\u51fd\u6570\u58f0\u660e void DelayMs(unsigned char t);/*------------------------------------------------ \u4e3b\u51fd\u6570------------------------------------------------*/void main (void){ KEY=1; //\u6309\u952e\u8f93\u5165\u7aef\u53e3\u7535\u5e73\u7f6e\u9ad8while (1) //\u4e3b\u5faa\u73af { if(!KEY) //\u5982\u679c\u68c0\u6d4b\u5230\u4f4e\u7535\u5e73\uff0c\u8bf4\u660e\u6309\u952e\u6309\u4e0b { DelayMs(10); //\u5ef6\u65f6\u53bb\u6296\uff0c\u4e00\u822c10-20ms if(!KEY) //\u518d\u6b21\u786e\u8ba4\u6309\u952e\u662f\u5426\u6309\u4e0b\uff0c\u6ca1\u6709\u6309\u4e0b\u5219\u9000\u51fa { while(!KEY);//\u5982\u679c\u786e\u8ba4\u6309\u4e0b\u6309\u952e\u7b49\u5f85\u6309\u952e\u91ca\u653e\uff0c\u6ca1\u6709\u91ca\u653e\u5219\u4e00\u76f4\u7b49\u5f85 { LED=!LED;//\u91ca\u653e\u5219\u6267\u884c\u9700\u8981\u7684\u7a0b\u5e8f } } } //\u4e3b\u5faa\u73af\u4e2d\u6dfb\u52a0\u5176\u4ed6\u9700\u8981\u4e00\u76f4\u5de5\u4f5c\u7684\u7a0b\u5e8f }}/*------------------------------------------------ uS\u5ef6\u65f6\u51fd\u6570\uff0c\u542b\u6709\u8f93\u5165\u53c2\u6570 unsigned char t\uff0c\u65e0\u8fd4\u56de\u503c unsigned char \u662f\u5b9a\u4e49\u65e0\u7b26\u53f7\u5b57\u7b26\u53d8\u91cf\uff0c\u5176\u503c\u7684\u8303\u56f4\u662f 0~255 \u8fd9\u91cc\u4f7f\u7528\u6676\u632f12M\uff0c\u7cbe\u786e\u5ef6\u65f6\u8bf7\u4f7f\u7528\u6c47\u7f16,\u5927\u81f4\u5ef6\u65f6 \u957f\u5ea6\u5982\u4e0b T=tx2+5 uS ------------------------------------------------*/void DelayUs2x(unsigned char t){ while(--t);}/*------------------------------------------------ mS\u5ef6\u65f6\u51fd\u6570\uff0c\u542b\u6709\u8f93\u5165\u53c2\u6570 unsigned char t\uff0c\u65e0\u8fd4\u56de\u503c unsigned char \u662f\u5b9a\u4e49\u65e0\u7b26\u53f7\u5b57\u7b26\u53d8\u91cf\uff0c\u5176\u503c\u7684\u8303\u56f4\u662f 0~255 \u8fd9\u91cc\u4f7f\u7528\u6676\u632f12M\uff0c\u7cbe\u786e\u5ef6\u65f6\u8bf7\u4f7f\u7528\u6c47\u7f16------------------------------------------------*/void DelayMs(unsigned char t){ while(t--) { //\u5927\u81f4\u5ef6\u65f61mS DelayUs2x(245); DelayUs2x(245); }}\u81f3\u4e8e4*4\u7684\u952e\u76d8\u7684\u8bdd\uff0c\u90a3\u5c31\u8981\u5148\u786e\u5b9a\u6309\u952e\u5230\u5e95\u662f\u54ea\u4e00\u4e2a\uff0c\u4e3e\u4e2a\u4f8b\u5b50\u554a\uff0c\u6bd4\u5982\u8bf4\u4f60\u5148\u7ed91\u4e2a\u5217\u7684\u6309\u952e\u7ed9\u4e2a\u4f4e\u7535\u5e73\uff0c\u7136\u540e\u53bb\u68c0\u6d4b\uff0c\u7b2c\u4e00\u5217\u7684\u56db\u4e2a\u6309\u952e\uff0c\u662f\u4e0d\u662f\u6309\u4e0b\u4e86\uff0c\u5982\u679c\u7b2c\u4e00\u4e2a\u6309\u4e0b\u4e86\uff0c\u5ef6\u65f6\u53bb\u6296\u52a8\uff0c\u7136\u540e\u518d\u786e\u5b9a\u662f\u5426\u6309\u4e0b\uff0c\u7136\u540e\u6267\u884c\uff0c\u64cd\u4f5c\uff0c
\u540c\u6837\uff0c\u5c31\u80fd\u786e\u5b9a16\u4e2a\u952e \u4e86
#includesbit a=P1^0;sbit b=P1^1;sbit c=P1^2;sbit d=P1^3;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void main(){unsigned int t=1000;P2=0x00; while(1){ P1=0xef; while(P1!=0xef) { while(t--);t=1000; while(P1!=0xef) { switch(P1) { case 0xee: P0=table[0];break; case 0xed: P0=table[1];break; case 0xeb: P0=table[2];break; case 0xe7: P0=table[3];break; } while(P1!=0xef); } } P1=0xdf; while(P1!=0xdf) { while(t--);t=1000; while(P1!=0xdf) { switch(P1) { case 0xde: P0=table[4];break; case 0xdd: P0=table[5];break; case 0xdb: P0=table[6];break; case 0xd7: P0=table[7];break; } while(P1!=0xdf); } } P1=0xbf; while(P1!=0xbf) { while(t--);t=1000; while(P1!=0xbf) { switch(P1) { case 0xbe: P0=table[0];break; case 0xbd: P0=table[1];break; case 0xbb: P0=table[2];break; case 0xb7: P0=table[3];break; } while(P1!=0xbf); } }P1=0x7f; while(P1!=0x7f) { while(t--);t=1000; while(P1!=0x7f) { switch(P1) { case 0x7e: P0=table[4];break; case 0x7d: P0=table[5];break; case 0x7b: P0=table[6];break; case 0x77: P0=table[7];break; } while(P1!=0x7f); } } } }\u81ea\u5df1\u5199\u7684\uff0c\u600e\u4e48\u770b\u7740\u4e71\u4e03\u516b\u7cdf\u7684\uff0c\u4f60\u81ea\u5df1\u7406\u4e00\u4e0b\u5c31\u660e\u767d\u4e86

temp等于0x0e时,键值key等于7 : 这个键值是你自己定义的,就是起一个标志位的作用,然后用程序判断键值,当键值等于7时,该进行什么动作,这就相当于当你那个按键按下时执行什么动作

写单片机C程序 一定要活用标志位
还有你好像都大四了,怎么这样普通的矩阵键盘程序还看不懂,该好好学习呀 兄弟

I和J 只是一个变量 用来决定延时时间的长短 延时是为了消除按键的抖动
毕竟机械按键存在抖动(按下去并不是电平直接就跳变并稳定下来了)
延时是软件消抖 增强系统的稳定性

你这个程序写的真够麻烦的,4*4的矩阵键盘哪用这么复杂啊。
我写个给你吧,我这个程序是检测按键,然后通过运算直接输出0-15的值。
原理就是通过检测按键处于第几行和第几列来计算,输出=列+行*4,例如 第0行,第三个按键就是0*4+3=3输出就是3;第二行,第0个按键就是 2*4+0=8输出就是八了,按照矩阵键盘排列方式是从做到右,从上到下,依次为0-3、4-7,8-11,12-15。

sfr keyIO=0x90;//定义键盘IO口为P1
unsigned char keyboad(){
unsigned char a,key,x,y;
unsigned int i;
keyIO=0xf0;
a=keyIO;
if(a==0xf0){
return 0xff;}
a=keyIO;
i=0;
for(y=~(a|0x0f);y!=0x10;y=y>>1){
i++;}
y=i;
keyIO=0x0f;
a=keyIO;
i=0;
for(x=~(a|0xf0);x!=0x01;x=x>>1){
i++;}
x=i;
key=4*x+y;
for(i=0;i<50000;i++){ //按键灵敏度调节
if(keyIO==0x0f)break;
}
keyIO=0xff;
return key;
}

没有按键按下的时候,返回的是0xff

你问的问题很纠结呢,case 0x0e:
key=7;
break;
这句话的意思不就是temp的值为0x0e的时候把7赋值给key然后跳出这个循环。

内容太多了,你就说哪些你不会吧,减少下工作量吧。

/***********************************************************/
#define LCD XBYTE[0xffff] // 定义LCD显示的数组,这边用0xffff浪费
// 只要32就可以了
#define uint unsigned int // 宏定义“短表示”,方便书写
#define uchar unsigned char // 同上

void lcd_mwc(uchar i) // 这个函数是用来写命令的:如启动液晶
// 锁定液晶等,可以查看液晶控制字就知道
// 0xb8和0x40是什么命令了,估计是启动
/*********************************************/
// 属于函数void lcd_clear(void) 要查看液晶的规格书
uchar i; // 定义液晶每页的地址个数,用来清0
uchar page; // 定义液晶的Page地址(page=0xb8;page<0xc0;page++) // 循环清零
/*********************************************/
uchar i; // 定义传送数据的个数
for (i=16;i<32;i++) lcd_mwd(*(hz+i)); // lcd_mwd函数的作用是通过给LCD
// 数组初始化地址,然后根据地址
// 递增将数组QING[32]等的对应地
// 数据传送到液晶数据口;这边是
// 循环传送后面16个数据

for (i=0;i<16;i++) lcd_mwd(*(hz+i)); // 同上,传送前面的16个数据
/*****************************************************************/
从你的程序上看,液晶应该由上下两块显示Page组成,然后上面的Page显示4个汉字的上半段,下面显示4个汉字的下半段,所以有8个Page,和你的void lcd_clear(void) 函数也就对应了。

void dispm_hz_down(uchar code * hz)


  • 鍗曠墖鏈 4x4閿洏c绋嬪簭
    绛旓細=== 鎶 if(P1!=k) 璇ュ仛 if(P1!==k) 鍏朵粬鐨勬病鐪嬩簡 === 闃佷笅浣犵敤鐨勪粈涔堣瑷鍟婏紵鎴戠紪璇戜簡锛屾病鎶ラ敊鍟婏紵浣犺鐨勪笉鑳界敤鎸囩殑鏄粈涔堬紵
  • ...4*4閿洏杈撳叆,骞剁敤p0鍙e拰p2鍙f帶鍒舵暟鐮佺鏄剧ず杈撳叆閿 鍗曠墖鏈...
    绛旓細void main() //涓绋嬪簭 { uchar i,P2_LED,P1_LED;uchar KeyNo=-1; //鎸夐敭搴忓彿锛-1琛ㄧず鏃犳寜閿 while(1){ KeyNo=Keys_Scan(); //鎵弿閿洏鑾峰彇鎸夐敭搴忓彿KeyNo if(KeyNo!=-1){ P2_LED=0xff;P1_LED=0xff;for(i=0;i<=KeyNo;i++) //閿艰秺澶э紝鐐逛寒鐨凩ED瓒婂 { if(i<8)...
  • 鎳 绠鍗曠殑鍗曠墖鏈虹殑杩 鎬
    绛旓細锛2锛 鎶娾鍗曠墖鏈绯荤粺鈥濆尯鍩熶腑鐨凱0.0/AD0锛峆0.7/AD7绔彛鐢8鑺帓绾胯繛鎺ュ埌鈥滃洓璺潤鎬佹暟鐮佹樉绀烘ā鍧椻濆尯鍩熶腑鐨勪换涓涓猘锛峢绔彛涓婏紱瑕佹眰锛歅0.0/AD0瀵瑰簲鐫a锛孭0.1/AD1瀵瑰簲鐫b锛屸︹︼紝P0.7/AD7瀵瑰簲鐫h銆4锛 绋嬪簭璁捐鍐呭 锛1锛 4脳4鐭╅樀閿洏璇嗗埆澶勭悊 锛2锛 姣忎釜鎸夐敭鏈夊畠鐨勮鍊煎拰鍒楀 ...
  • 51鍗曠墖鏈4*4閿洏鍙婁袱涓竷娈垫樉绀哄櫒鍑芥暟,瑕佹眰瀹炵幇鍔犲噺涔橀櫎
    绛旓細鍦≒roteus杞欢涓惌寤轰簡涓涓熀浜51鍗曠墖鏈虹殑4*4閿洏鍜屼袱涓叡闃虫瀬涓冩鏄剧ず鍣ㄧ殑璁$畻鍣ㄧ數璺紝瀹炵幇浜嗗熀鏈殑鍔犲噺涔橀櫎鍔熻兘銆傝鐢佃矾浣跨敤浜嗚蒋浠跺唴缃殑4X4鐭╅樀閿洏鍏冧欢锛屾瀬澶у湴绠鍖栦簡缂栫▼鍜岀數璺璁$殑澶嶆潅鎬с備互涓嬩负璇ヨ绠楀櫒鐨勪豢鐪熺數璺浘銆
  • 姹傜敱51鍗曠墖鏈鎺у埗4x4閿洏杈撳叆,4涓暟鐮佺(閲囩敤鍔ㄦ佹壂鎻)鏄剧ず C璇█缂...
    绛旓細鍙互杩欐牱鍐欙紝鍏堣绠楁寜浜嗗嚑涓嬩簡锛屾寜涓嬭嫢灏忎簬4娆★紝璁╁洓涓閫夌鍓嶅嚑涓瀵奸氾紝鎸変笅鏁拌秴杩囨垨绛変簬4娆′綘灏卞彲浠ョ敤鎵睆鐨勬柟寮忔潵鏄剧ず灏卞ソ浜嗐傛瘮濡傜涓涓嬫寜鐨勬槸8浣犲氨鍙互璁剧疆if鍜宔lse璇彞缁勫悎鍟婏紒鍏堟湁涓暟缁刣[]={0xf7;0xfb;0xfd;0xfe}//娈甸夛紝鎸変簡鍑犱笅璁句负鍙橀噺uint a//鏃犵鍙峰瓧绗﹀瀷锛宨f锛坅<4...
  • 鍗曠墖鏈鐭╁舰閿洏鎵弿绋嬪簭閭i噷鍑洪棶棰樹簡?
    绛旓細杩欐槸鐢ㄧ殑4x4鏃犳簮閿洏锛孭1鍙d緷娆0x0f鍜0xf0锛屾牴鎹搴旇緭鍏ユ儏鍐靛垽鏂寜閿紝鏂规硶鍙銆備笅闈㈡槸淇敼鍚鐨勭▼搴锛/* 杩欐槸鐢ㄧ殑4x4鏃犳簮閿洏锛孭1鍙d緷娆0x0f鍜0xf0锛屾牴鎹搴旇緭鍏ユ儏鍐靛垽鏂寜閿紝鏂规硶鍙銆 */unsigned char dis_buf;void keyscan(void){unsigned char b,M,temp;P1=0x0f;delay(10);if(P1!...
  • ...鏈夋病鏈塎CS51鏈虹殑澶栭儴涓柇娉4X4閿洏鎵弿姹囩紪璇█绋嬪簭
    绛旓細杩欎釜鏄鎴戜互鍓嶅仛鐨勬壂鎻忔硶锛岀數璺鍥炬墍绀猴紝绋嬪簭闄勪笂銆侽RG 00H LJMP MAIN ORG 30H MAIN: LCALL LOOP1 LCALL DELAY LCALL LOOP1 LCALL LOOP2 LCALL LOOP3 LJMP MAIN LOOP1: MOV P2,#0F0H;鍒ゆ柇鏈夐敭鎸変笅锛烳OV A,P2 MOV B,A MOV P2,#0FH MOV A,P2 ORL A,B MOV 30H...
  • 浣跨敤鍗曠墖鏈虹殑P1鍙f墿灞4*4閿洏鐭╅樀,瀹炵幇鍦ㄩ敭鐩樹笂姣忔寜涓涓暟瀛楅敭鐢ㄩ潤鎬...
    绛旓細P1.0~P1.3涓哄垪绾匡紝P1.4~P1.7涓鸿绾匡紱鍒楃嚎鍜岃绾跨殑浜ゅ弶鐐规帴鎸夐敭銆傚厛鍦ㄥ垪绾夸笂渚濇杈撳嚭1锛岀劧鍚庡啀鍦ㄨ绾夸笂璇诲彇锛涘彲鏍规嵁琛岀嚎鐨勮緭鍏ュ拰鍒楃嚎鐨勮緭鍑烘潵鍒ゅ畾鏄摢涓寜閿寜涓嬨傚叿浣撶殑鏄剧ず閮ㄥ垎锛屽簲璇ュ緢绠鍗曞惂銆
  • ...鐨勫洓浣嶈绠楀櫒鐨绋嬪簭鍥惧拰鐢佃矾鍥,浠跨湡鍥俱4X4閿洏銆傝兘璁$畻鍔犲噺涔橀櫎...
    绛旓細ORG 0000H LJMP START ORG 1000H START:MOV R0,#0 MOV R1,#0 MOV R5,#0 MOV 30H,#0 MOV 31H,#0 MOV R2,#0 MOV R3,#0 MOV R4,#0 ACALL DISP ACALL KEY AJMP START D00:CJNE R0,#0,Y0 MOV A,30H MOV B,#10 MUL AB MOV 30H,#0 ADD A,30H MOV 30H,A JMP FK Y0:...
  • 51鍗曠墖鏈4*4閿洏鍙婁袱涓竷娈垫樉绀哄櫒鍑芥暟,瑕佹眰瀹炵幇鍔犲噺涔橀櫎
    绛旓細51鍗曠墖鏈4*4閿洏鍙婁袱涓叡闃虫暟鐮佺锛岀粍鎴愪竴涓畝瀹滅殑璁$畻鍣紝瀹炵幇鍔犲噺涔橀櫎杩愮畻銆俻roteus 杞欢涓湁涓涓4X4鐨鐭╅樀閿紝灏辨槸涓撻棬涓鸿绠楀櫒璁捐鐨勶紝浣跨敤寰堟柟渚裤備豢鐪熷浘濡備笅鎵绀恒
  • 扩展阅读:电脑键盘图解一览表 ... 电脑键盘各个按键图解 ... 键盘功能一览表 ... 电脑108键盘全图高清图 ... 4x4矩阵键盘教程 ... 电脑新手基本常识 ... 单片机4x4矩阵键盘两位 ... 50个常用元器件图片 ... 单片机键盘程序流程图 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网