单片机矩阵键盘汇编语言程序
- 格式:doc
- 大小:189.50 KB
- 文档页数:9
3×4的矩阵键盘电路图及汇编语言源程序
[导读] 3×4的矩阵键盘通过并行接口芯片8255A与微机相连。
8255A的A口定义为输出口,与键盘行线相连;B口定义为输入口,与键盘列线相连。
设8255A A口地址为40H,B口地址为41H,控制寄存
3×4的矩阵键盘通过并行接口芯片8255A与微机相连。
8255A的A口定义为输出口,与键盘行线相连;B口定义为输入口,与键盘列线相连。
设8255A A口地址为40H,B口地址为41H,控制寄存器地址为43H。
MOV AL,82H
OUT 43H,AL
BEGIN:MOV AL,0
OUT 40H,AL
WAIT : IN AL,41H
AND AL,0FH
CMP AL,0FH
JZ WAIT
MOV CX,7FFH
L0: LOOP L0
ST: MOV BL,3
MOV BH,4
MOV AL,0FEH
MOV CL,0FH
MOV CH,0FFH
L1: OUT 40H,AL
ROL AL
MOV AH,AL
IN AL,41H
AND AL,CL
CMP AL,CL
JNZ L2
ADD CH,BH
MOV AL,AH
DEC BL
JNZ L1
JMP BEGIN
L2: INC CH
RCR AL
JC L2
MOV AL,CH JMP KEYTABLE。
单片机矩阵键盘汇编语言程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March51单片机4*4矩阵键盘汇编语言程序示例(原创),欢迎咨询线反转法ORG 00HLJMP MAINMAIN:MOV R0,#00HMOV R1,#00HMOV R2,#00HMOV R3,#00HMOV A,#00HAJMP KEYSCANKEYSCAN:MOV P3,#0F0HMOV A,P3ANL A,#0F0HXRL A,#0F0HJNZ DELAYDELAY:MOV R2,#05HLOOP1:MOV R3,#0FAHLOOP2:DJNZ R3,LOOP2DJNZ R2,LOOP1MOV A,P3ANL A,#0F0HMOV R0,AXRL A,#0F0HJNZ KEYSCAN1LJMP KEYSCAN KEYSCAN1:MOV A,#00H MOV P3,#0FHMOV A,P3ANL A,#0FHMOV R1,AXRL A,#0FHJNZ NUMLJMP KEYSCANNUM:MOV A,R0MOV B,R1ORL A,BMOV DPTR,#TABSJMP DISP0DISP0:CJNE A,#0EEH,DISP1 MOV A,#00HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP1:CJNE A,#0EDH,DISP2 MOV A,#01HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP2:CJNE A,#0EBH,DISP3 MOV A,#02HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP3:CJNE A,#0E7H,DISP4 MOV A,#03HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP4:CJNE A,#0DEH,DISP5 MOV A,#04HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP5:CJNE A,#0DDH,DISP6 MOV A,#05HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP6:CJNE A,#0DBH,DISP7 MOV A,#06HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP7:CJNE A,#0D7H,DISP8 MOV A,#07HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP8:CJNE A,#0BEH,DISP9 MOV A,#08HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISP9:CJNE A,#0BDH,DISPA MOV A,#09HMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPA:CJNE A,#0BBH,DISPB MOV A,#0AHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPB:CJNE A,#0B7H,DISPC MOV A,#0BHMOVC A,@A+DPTRMOV P0,ALJMP KEYSCANDISPC:CJNE A,#07EH,DISPDMOV A,#0CHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPD:CJNE A,#07DH,DISPEMOV A,#0DHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPE:CJNE A,#07BH,DISPFMOV A,#0EHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDISPF:CJNE A,#077H,KEYMOV A,#0FHMOVC A,@A+DPTRMOV P0,ALCALL DELAY1LJMP KEYSCANDELAY1:MOV R2,#0FHLOOP10:MOV R3,#0FAHLOOP20:DJNZ R3,LOOP20DJNZ R2,LOOP10RETKEY:LJMP MAINTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H END行扫描法ORG 00HLJMP MAINMAIN:LCALL KEYJUDGELCALL DISPLJMP MAIN KEYJUDGE:MOV P3,#0F0HMOV A,P3XRL A,#0F0HJNZ DELAYLJMP MAIN DELAY:MOV R4,#08H LOOP1:MOV R5,#0FAH LOOP2:DJNZ R5,LOOP2 DJNZ R4,LOOP1MOV P3,#0F0HMOV A,P3XRL A,#0F0HJZ MAINRETKEYSCAN:MOV R0,#00HMOV R1,#00HMOV R2,#0FEHMOV R3,#04H KEY:MOV P3,R2KEY0:JB ,KEY1MOV R1,#00HLJMP NUMKEY1:JB ,KEY2MOV R1,#04HLJMP NUMKEY2:JB ,KEY3MOV R1,#08HLJMP NUMKEY3:JB ,NEXTMOV R1,#0CHLJMP NUMNEXT:INC R0MOV A,R2RL AMOV R2,ADJNZ R3,KEYLJMP NUMNUM:MOV A,R0ADD A,R1MOV DPTR,#TABMOVC A,@A+DPTRMOV R6,ARETDISP:MOV P0,R6LCALL DELAY1RETDELAY1:MOV R4,#0FHLOOP10:MOV R5,#0FAHLOOP20:DJNZ R5,LOOP20DJNZ R4,LOOP10RETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H END。
51单片机4*4矩阵键盘源程序;P3口接键盘;P0口接数码管段码端控位,再将任一数码管的位码接地AD EQU 30H org 0000hLJMP MAINORG 0030HMAIN: mov p3,#0Fh ;p0-3输出1,作为输入位mov a ,p3ANL A,#0FHCJNE A,#0FH,DELAYSJMP MAINDELAY: ACALL DELAY1 ; 延时去键抖mov a ,p3ANL A,#0FHCJNE A,#0FH,HA VESJMP MAINHA VE:MOV A,#0EFH ;行扫描码NEXT:MOV B,AMOV P3,AMOV A,p3ANL A,#0FH ;检测列CJNE A,#0FH,YESMOV A,BRL ACJNE A,#0FEH,NEXTYES: orl a,#0f0h ;高四位置1CPL Amov r2,#00hMOV R2,A ;存列码MOV A,B ;取行码,CPL AORL A,R2 ;列码+行码=键植MOV P2,A ; 用P2口接发光二极管查看结果MOV AD,#00H ACALL DISPKEYVJMP MAINDISPKEYV:KEY0:CJNE A,#11H,KEY1AJMP WORD0KEY1:CJNE A,#12H,KEY2AJMP WORD1KEY2:CJNE A,#14H,KEY3AJMP WORD2KEY3:CJNE A,#18H,KEY4AJMP WORD3KEY4:CJNE A,#21H,KEY5AJMP WORD4KEY5:CJNE A,#22H,KEY6AJMP WORD5KEY6:CJNE A,#24H,KEY7AJMP WORD6KEY7:CJNE A,#28H,KEY8AJMP WORD7KEY8:CJNE A,#41H,KEY9AJMP WORD8KEY9:CJNE A,#42H,KEY10 AJMP WORD9KEY10:CJNE A,#44H,KEY11 AJMP WORD10KEY11:CJNE A,#48H,KEY12 AJMP WORD11KEY12:CJNE A,#81H,KEY13 AJMP WORD12KEY13:CJNE A,#82H,KEY14 AJMP WORD13KEY14:CJNE A,#84H,KEY15 AJMP WORD14KEY15:CJNE A,#88H,PASSAJMP WORD15 WORD0:MOV AD,#00ACALL DISPAjmp PASSWORD1:MOV AD,#01ACALL DISPAjmp PASSWORD2:MOV AD,#02ACALL DISPAjmp PASSWORD3:MOV AD,#03ACALL DISPAjmp PASSWORD4:MOV AD,#04ACALL DISPAjmp PASSWORD5:MOV AD,#05 ACALL DISPAjmp PASSWORD6:MOV AD,#06 ACALL DISPAjmp PASSWORD7:MOV AD,#07ACALL DISPAjmp PASSWORD8:MOV AD,#08 ACALL DISPAjmp PASSWORD9:MOV AD,#9ACALL DISPAjmp PASSWORD10:MOV AD,#10 ACALL DISPAjmp PASSWORD11:MOV AD,#11 ACALL DISPAjmp PASSWORD12:MOV AD,#12 ACALL DISPAjmp PASS WORD13:MOV AD,#13 ACALL DISPAjmp PASSWORD14:MOV AD,#14 ACALL DISPAjmp PASSWORD15:MOV AD,#15ACALL DISPPASS: retDISP: MOV A,ADMOV DPTR,#numtabMOVC A,@A+DPTRMOV P0,ARETnumtab: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EHDELAY1:MOV R5,#10D1: MOV R6,#250DJNZ R7, $DJNZ R5,D1RETEND。
51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。
C51矩阵键盘汇编语言源代码/************************************************************** ******************;* 描述: *;* lcd1602显示遥控键值读取器 *;* lcd1602显示遥控器接p3.2 *;* 喇叭接p1.5 继电器接p1.4 *;* 17(40h)键按下,继电器吸合。
19(04h)键按下,继电器关闭。
*;* 连接方法:使用红外功能时 J1跳线短接 **************************************************************** *****************/;-----------------------------------------------IRCOM EQU 20H ;20H-23H IR使用X EQU 26H ;LCD 地址变量IRIN EQU P3.2BEEP EQU P1.5RELAY EQU P1.4RS EQU P2.6RW EQU P2.5EN EQU P2.7;------------------------------------------------ORG 0000HJMP MAIN;------------------------------------------------MAIN:MOV SP,#40HMOV A,#00HMOV R0,#20HLOOP0: MOV @R0,A ;20H-26H清零INC R0CJNE R0,#27H,LOOP0SETB IRINCALL SET_LCDCALL MENU1LOOP1:CALL IR_INCALL IR_SHOWMOV A,22HCJNE A,#40H,LOOP2 ;K17键按下CLR RELAY ;继电器吸合LOOP2: CJNE A,#04H,LOOP3 ;K19键按下SETB RELAY ;继电器关闭LOOP3: JMP LOOP1;----------------------------------------------------- ; LCD 初始化设置;----------------------------------------------------- SET_LCD:CLR ENCALL INIT_LCD ;初始化 LCDCALL DELAY1MOV DPTR,#INFO1 ;指针指到显示信息1MOV A,#1 ;显示在第一行CALL LCD_SHOWMOV DPTR,#INFO2 ;指针指到显示信息2MOV A,#2 ;显示在第二行CALL LCD_SHOWRET;----------------------------------------------------- INIT_LCD: ;8位I/O控制 LCD 接口初始化MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#0CH ;开显示,关光标,CALL WCOMCALL DELAY1MOV A,#01H ;清除 LCD 显示屏CALL WCOMCALL DELAY1RET;---------------------------------------------------- LCD_SHOW: ;在LCD的第一行或第二行显示信息字符CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置 LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置 LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置 LCD 的第二行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置 LCD 的第二行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: CALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;--------------------------------------------------- CLR_LINE: ;清除该行 LCD 的字符MOV R0,#24CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RET;---------------------------------------------------- MENU1: ;LCD 显示工作菜单信息MOV DPTR,#MENU2MOV A,#1 ;在第一行显示信息CALL LCD_SHOWRETMENU2: DB " Red Control ",0;----------------------------------------------------- INFO1: DB " ",0 ;LCD 第一行显示信息INFO2: DB " IR-CODE: --H ",0 ;LCD 第二行显示信息;-----------------------------------------------------;----------------------------------------------------- ; 写指令、数据使能子程序;----------------------------------------------------- WCOM:MOV P0,A ;写指令使能CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲CLR RWSETB ENCALL DELAY0CLR ENRETWDATA:MOV P0,A ;写数据使能SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲CLR RWSETB ENCALL DELAY0CLR ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET;---------------------------------------------------;在 LCD 第二行显示字符;A=ASC DATA, B=LINE X POS;--------------------------------------------------- LCDP2: ;在LCD的第二行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;--------------------------------------------------- ; IR 译码子程序;--------------------------------------------------- IR_IN:MOV R0,#IRCOMI1: JNB IRIN,I2 ;等待 IR 信号出现JMP I1I2: MOV R4,#20I20: CALL DELDJNZ R4,I20JB IRIN,I1 ;确认IR信号出现I21: JB IRIN,I3 ;等 IR 变为高电平CALL DELJMP I21I3: MOV R3,#0 ;8位数清为0LL: JNB IRIN,I4 ;等 IR 变为低电平CALL DELJMP LLI4: JB IRIN,I5 ;等 IR 变为高电平CALL DELJMP I4I5: MOV R2,#0 ;0.14ms 计数L1: CALL DELJB IRIN, N1 ;等 IR 变为高电平;IR=0,检查R2中的计数值MOV A,#8CLR CSUBB A,R2 ;判断高低位;IF C=0 BIT=0MOV A,@R0RRC AMOV @R0,A ;处理完一位INC R3CJNE R3,#8,LL ;需处理完8位MOV R3,#0INC R0CJNE R0,#24H,LL ;收集到4字节了JMP OKN1: INC R2CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开OK: RET;--------------------------------------------------------------------IR_SHOW:MOV A,22HCPL A ;将22H取反后和23H比较CJNE A,23H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
单片机之矩阵键盘下面是一个stc89c52单片机下的矩阵键盘程序,P0口接键盘,显示在P2口.#include;#define uchar unsigned char#define uint unsigned intsbit key1=P3^2;sbit key2=P3^3;uchar codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义八个灯的工作状态。
uchar codewep[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void yanshi(uint t){while(--t);}void main(){uchar han,lei,key;while(1){P0=0xf0; //初始化为开关状态。
11110000han=P0; //han变量读取P0口的值。
第一次扫描键盘。
han=han&0xf0; //对han变量与0xf0与.//如果结果等于P0口初值(0xf0)说明没有键被按下. //如果结果不等于P0(0xf0)口初值,说明有键按下. if(han!=0xf0)yanshi(125*5); //延时消抖.if(han!=0xf0) //语句执行到这里说明真的有键按下.{ //例如按下S1键.则P0=1110 0000lei=P0&0xf0; //lei读取P0口的值.lei=lei|0x0f; //lei=11101111P0=lei; //P0=11101111han=P0; //han=11101110 第二次扫描键盘,//因为这里按键S1还是闭合的状态。
han=han&0x0f; //han=00001110lei=lei&0xf0; //lei=11100000key=han+lei;}switch(key){case 0xee: P2=tab[0]; break; case 0xde: P2=tab[1]; break; case 0xbe: P2=tab[2]; break; case 0x7e: P2=tab[3]; break; case 0xed: P2=tab[4]; break; case 0xdd: P2=tab[5]; break; case 0xbd: P2=tab[6]; break; case 0x7d: P2=tab[7]; break; case 0xeb: P2=tab[8]; break; case 0xdb: P2=tab[9]; break; case 0xbb: P2=tab[10]; break; case 0x7b: P2=tab[11]; break; case 0xe7: P2=tab[12]; break; case 0xd7: P2=tab[13]; break; case 0xb7: P2=tab[14]; break; case 0x77: P2=tab[15]; break; }}}。
单片机矩阵键盘的编程I/O端口输出1的端口与输出0的端口对接的时候会检验出原来的端口是0 第一个,这个是错误程序#include<reg52.h>void delay1ms(unsigned int i) //延时函数{unsigned char j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void main(){while(1){P1=0xf0; //建立初始状态,每一行赋值0,每一列赋予1unsigned chars[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0 x86,0x8e}; //数码管灯unsigned int l; //分别代表作列与行unsigned int r;if(P1!=0xf0) //检验有没有按键被按下{delay1ms(15); //避免前沿抖动,延时大约15msswitch(P1) //检验有没有键盘被按下{ //如果按下了就检验是哪一列被按下了case 0x70: //p1^7被按下l=4;case 0xB0: //p1^6被按下l=3;case 0xD0: //p1^5被按下l=2;case 0xE0: //p1^4被按下l=1;default:break;}P1=0xf; 、 //每一列赋予1,每一行赋予0switch(P1) //检验哪一行的按键被按下{case 0xE: //p1^0被按下r=1;case 0xD: //p1^2被按下r=2;case 0xB://p1^3被按下r=3;case 0x7:r=4;//p1^4被按下default:break;}//已经知道哪一个按键被按下r=r*l; //得到的数在数值上等于要显示的数目P1=s8[r] //数码管亮}delay1ms(15); //避免后延抖动}}错误的地方在于P1=0xf; 、 //每一列赋予1,每一行赋予0switch(P1) //检验哪一行的按键被按下{这是因为如果没有再次判断当P1!=0XF的时候,就可能出现没有符合case之中的情况而直接运行default这种情况。
目录1 引言 (2)2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试 (2)2.1 4×4矩阵式键盘识别显示系统概述 (2)2.2 4×4矩阵式键盘原理 (3)2.3 4×4矩阵式键盘控制LED显示方法 (3)2.4 电路设计及电路图 (3)2.5 4×4矩阵式键盘软件编程 (6)2.6 4×4矩阵式键盘软件仿真调试分析 (9)3 结论 (10)4参考文献 (10)1 引言随着现代科技日新月异的发展,作为新兴产业,单片机的应用越来越广。
单片机以其体积小、重量轻、功能强大、功耗低等特点而备受青睐。
键盘作为一种最为普遍的输入工具在单片机项目应用上显得尤为重要。
用MCS51系列的单片机并行口P1接4×4矩阵键盘,以P1.0-P1.3 作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的0-F序号。
2 4×4矩阵键盘控制LED工作原理及软硬件设计、仿真调试2.1 4×4矩阵式键盘识别显示系统概述矩阵式键盘模式以4个端口连接控制4*4个按键,实时在LED数码管上显示按键信息。
显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4*4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
最常见的键盘布局如图1所示。
一般由16个按键组成,在单片机中正好可以用一个P 口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。
2.2 4×4矩阵式键盘原理在占用相同的I/O端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intucharsmg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1} ;uchar smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78} ;//有一篇74HC573必须为高电平//*************************8//12M频率下大约50US延时//**************************void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--) ;}void delay_50ms(uint t){uchar j;for(;t>0;t--)for(j=6245;j>0;j--);}/*这个程序可以不用松手检测,因为我们程序首选判断键是否按下然后发现按下后我们延时5MS,然后再检测。
确实是按下啦。
我们再执行在第二个循环假如我们继续检测,那么消耗时间10MS这个短时间中我们的按键已经松手啦。
不会在执行后面的。
*/void main(){uchar key_l,key_h;uchar key;while(1){P3=0xf0; //首先给P3口赋值key_l=P3; //从p3口读一个数据到key_lkey_l=key_l&0xf0;if(key_l!=0xf0) //如果不等于的话,说明有按键按下去{delay_50us(100);//稍微延时一下if(key_l!=0xf0){key_l=P3&0xf0;// 11100000 再读一次P3的值然后和0xf0相与key_l=key_l|0x0f; // 11101111P3=key_l; //在把key_l的值送给P3口//此时P3口的值为11101111,而正在此时我们把键按下啦因此按下的键为11101110与11101111// 相与还是11101110;key_h=P3; //再读一次P3口,键还是按下,可以得到行的值。
计算机原理实验室实验报告课程名称:姓名学号班级成绩设备名称及软件环境实验名称矩阵键盘实验日期一.实验内容掌握4×4矩阵式键盘程序识别原理及4×4矩阵式键盘按键的设计方法。
二.理论分析或算法分析用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。
4×4矩阵式键盘识别电路原理图:键盘中对应按键的序号排列:电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。
(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。
三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)1、4×4矩阵键盘识别处理。
2、每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
3、程序流程图:4、汇编源程序:;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100H START: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1MOV COUNT,#0LJMP DKK1: CJNE A,#0DH,K2MOV COUNT,#4LJMP DKK2: CJNE A,#0BH,K3MOV COUNT,#12 K4: NOPLJMP DKSW1: MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8MOV COUNT,#13 K8: NOPLJMP DKSW2: MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KAMOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KBMOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ SW4LCALL DELAY10MS JZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KD MOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KEMOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KFMOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KGMOV COUNT,#15 KG: NOPLJMP DKSW4: LJMP PANDUANDK: RET;;;;;;;;;;显示程序;;;;;;;;;;XIANSHI: MOV A,COUNTMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};void main(void){ unsigned char i,j,k,key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有,显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)五.结论报告提交日期(注意:内容写不下时允许表格添加新行。