郭天祥老师51单片机中矩阵键盘显示程序

合集下载

郭天祥51单片机授课视频内容

郭天祥51单片机授课视频内容

郭天祥51单片机授课视频内容 讲次内容细节第一讲学单片机预备知识、如何点亮一个发光管单片机能做什么,基本电子知识,如何用TX-1C单片机学习板学习单片机,C51知识简介,如何申请免费芯片样品。

点亮一个发光管,第二讲流水灯设计、蜂鸣器发声、继电器控制简单延时程序、子程序调用、带参数子程序设计、流水灯同时蜂鸣器响、如何驱动蜂鸣器,及如何驱动继电器,集电极开路的概念及应用。

第三讲数码管显示的原理、数码管的静态显示共阳、共阴数码管显示原理、定时器工作方式介绍、重点讲述工作方式2、中断概念及中断函数写法、外部中断试验、定时器中断应用第四讲数码管的动态显示原理及应用实现动态扫描概念、定时器、中断加深用单片机的定时器及中断设计一个60秒定时器第五讲独立键盘、矩阵键盘的检测原理及实现键盘用来做什么、如何键盘检测、消抖、键盘编码、带返回值函数写法及应用第六讲AD、DA的工作原理及实现、运放电路模拟电压与数字电压的关系、为什么要使用AD及DA、ADC0804的操作方法、DAC0832的操作方法第七讲串口通讯原理及操作流程串口通讯工作方式、10位数据通讯、波特率概念、如何根据波特率计算定时器初值、串口打印在调试程序中的应用。

第八讲 1602液晶最简单液晶工作原理、如何开始对一个没有任何概念的芯片开始单片机的操作第九讲IIC总线AT24C02芯片工作原理IIC总线工作原理、目前非常通用的一种通信机制第十讲利用51单片机的定时器设计一个时钟综合运用51单片机知识设计一个可以随意调节时间、带整点闹铃的时钟。

(其中用到定时器、中断、按键、蜂鸣器、数码管或串口通信)第十一讲用DS12C887时钟芯片设计一个高精度时钟DS12C887内部带有锂电池,系统掉电情况下可自行精确走10年,并带有闹钟功能、年、月、日、时、分、秒等。

(本节由学生自己设计电路)第十二讲使用Protell99绘制电路图全过程Protell99软件使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工第十三讲Altium designer 6.5绘制电路图全过程最顶级电路板设计软件Altium Designer使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工。

51单片机44矩阵键盘源程序

51单片机44矩阵键盘源程序

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。

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)

C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)
{RI=0;
switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char

51单片机矩阵键盘程序示例

51单片机矩阵键盘程序示例

;lab5_asm;vol1.0;zqy;2012/2/18;定义初始化LED_CHABIT PSW数码管显示标志位,为1显示十位,为0显示个位;数字0-9ORG 00HJMP STARTORG 000BHJMP INT_T0转到中断服务程序,更改数码管显示ORG 0100HLED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDHDB 0FDH,87H,0FFH,0EFH,0BFHDB 86H,0DBH,0CFH,0E6H,0EDH,0FDHLED_TAB2:DB 0BFH,0BFH,0BFH,0BFH,0BFHDB 0BFH,0BFH,0BFH,0BFH,0BFHDB 86H,86H,86H,86HDB 86H,86H,86HSTART:;工作寄存器和某些数据单元的初始化MOV R0,#0;数码管显示初始化SETB LED_CHAMOVDPTR, #8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA,#OFEH位选数据,选中个位数码管,置低为选中MOVX@DPTR,脸选数据,对片外I/O 口的外设芯片访问MOVDPTR,#8200H段选地址MOVA,#OBFH段选数据,个位显示0MOVX@DPTR, A;定时器初始化MOV IE,#82H开启定时器T0中断MOV TMOD,#01H设定定时器T0为模式1MOV TH0,#0D8HMOV TL0,#0F0H装入初值,10MS 延时12MHZSETB TRC启动定时器T0KEY:;按键处理LCALL KEY_START用判断有无键按下子程序JZ KEY无键按下,重新扫描LCALL KEY_DELAY键按下,延时去抖LCALL KEY_STARTJZ KEYLCALL KEY_NEXT断哪一个键被按下LCALL DECODED® 译码LCALL KEY_EN判断按键释放LJMP KEYKEY_START:MOV DPTR, #8000H键盘地址MOV A,#0F0HMOVX @DPTR,A亍全部输出0 NOPNOPNOPMOVX A,@DPTR3 描键盘CPL A取正逻辑,1为按下ANL A,#0FHRETKEY_NEXT:MOV R1,# 0扫描行计数器MOV R2,# 0扫描列计数器MOV R3,#0FEH首行扫描字送R3 MOV DPTR, #8000HMOV A,R3MOVX @DPTR,AMOVX A,@DPTRCPL AANL A,#0FHMOV R4,#4S0123: JNZ SKEY不;为全0,有键按下; 全为0,进行下一行扫描INC R1行计数器加1MOV A,R3RL AMOV R3,AMOV DPTR,#8000HMOVX @DPTR,ANOPNOPNOPMOVX A,@DPTRCPL AANL A,#0FHDJNZ R4,S0123LJMP KEYEKEY:RETSKEY 0列号译码JBACC.0,SKEY1JBACC.1,SKEY2JBACC.2,SKEY3JBACC.3,SKEY4SKEY1:M0V A,#00存列号0 MOV R2,AAJMP EKEYSKE Y2:M0V A,#01存列号1 MOV R2,AAJMP EKEYSKEY3:M0V A,#02存列号2 MOV R2,AAJMP EKEYSKEY4: MOV A,#03存列号3 MOV R2,AAJMP EKEYDECODE:;行号在R1列号在R2;键值译码MOV A,R1MOV B,#04HMUL ABADD A,R2INC AMOV R0,ARETKEY_END:MOV DPTR,#8000H键盘地址MOVX A,@DPTR3 描键盘CPL A取正逻辑,1为按下ANL A,#0FHJNZ KEY_ENDLCALL KEY_DELAYJNZ KEY_ENDRETKEY_DELAY:MOV R5,#10HDS1:MOV R6,#0FFHDS2:NOPDJNZ R6,DS2DJNZ R5,DS1RETINT_TO:;中断服务程序,更改数码管显示MOV R7,AJB LED_CHA,DISP检查数码管显示标志位CPL LED_CHAMOVDPTR, #8200H段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA, #0FEH位选数据,选中个位数码管,置低为选中MOVX@DPTR, A位选数据,对片外I/O 口的外设芯片访问; 判断需要显示的个位数字MOV A,R0NOPMOV DPTR,#LED_TAB1NOPNOPMOVC A,@A+DPTRMOVDPTR, #82001■段选地址MOVX @DPTR,AJMP INT_EXITDISP_L:CPL LED_CHAMOVDPTR, #8200H段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA, #0FDH位选数据,选中十位数码管,置低为选中MOVX@DPTR, A位选数据,对片外I/O 口的外设芯片访问;判断需要显示的十位数字0 或1MOV A,R0NOPMOV DPTR,#LED_TAB2MOVC A,@A+DPTRMOVDPTR, #8200H段选地址MOVX @DPTR,AINT_EXIT:MOV IE,#82HMOV TH0,#0D8HMOV TLO,#OFOH装入初值,10MS延时SETB TR0MOV A,R7MOV DPTR,#8000HRETIEND12MHZ。

自己写的单片机矩阵键盘显示程序及仿真

自己写的单片机矩阵键盘显示程序及仿真

Protues 电路连接图如下所示:PS:矩阵键盘说明——4×4矩阵从左到右依次编码为1,,3,4,5,6,7,8,9,10,11,12,13,14,15,16按下某一按键,Led数码管就会显示相应的数字。

Keil C51 程序如下:有点不足望改进。

O(∩_∩)O谢谢!!!/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////#include <reg51.h>#define uchar unsigned char //宏的定义变量类型 uchar 代替 unsigned char#define uint unsigned int //宏的定义变量类型 uint 代替 unsigned intuchar dis_buf; //显示缓存uchar temp;uchar l,h,j; //定义行列void delay0(uchar x); //x*0.14MS// 此表为 LED 的字模 0 1 2 3 4 5 6 78 9uchar code LED7Code[] = {0xc0,0xf9,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};/************************************************************* * ** 延时子程序 ** **************************************************************/void delay(uchar x){ uchar j;while((x--)!=0) //CPU执行x*12次,x=10{ for(j=0;j<50;j++){;}}}/************************************************************* * * * 键扫描子程序 (4*4的矩阵) P1.4 P1.5 P1.6 P1.7为行 * * P1.0 P1.1 P1.2 P1.3为列 ** * *************************************************************/void keyscan(void){ temp=0;P1=0xF0; //高四位输入行为高电平列为低电delay(3); //延时temp=P1; //读P1口temp=temp&0xF0;//屏蔽低四位temp=~((temp>>4)|0xF0); //高四位取反无键按下取反应为0xf0if(temp==1) //0001 [1,1] 被拉低h=1;else if(temp==2) //0010[2,1] 被拉低h=2;else if(temp==4) //0100[3,1] 被拉低h=3;else if(temp==8) //1000[4,1] 被拉低h=4;dis_buf = h;dis_buf = (dis_buf<<4) & 0xf0; //行信息现存在第四位delay(10);P1=0x0F; //低四位输入列为高电平行为低电平delay(3); //延时temp=P1; //读P1口temp=temp&0x0F; //屏蔽高四位temp=~(temp|0xF0); //取反if(temp==1) //1列被拉低l=1;else if(temp==2) //2列被拉低l=2;else if(temp==4) //3列被拉低l=3;else if(temp==8) //4列被拉低l=4;l= l & 0x0f;delay(3);dis_buf= l | dis_buf;}/************************************************************** **判断键是否按下 ** **************************************************************/void keydown(void){P2=0xF0; //显示00P3=0xf0;//将高4位全部置1 低四位全部置0if(P1!=0xF0) //判断按键是否按下如果按钮按下会拉低P1其中的一个端口{keyscan(); //调用按键扫描程序}}void display( ){j=50;while(j){P2= 0x80;P0= LED7Code[0];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display1( ){j=50;while(j){P2= 0x80;P0= LED7Code[2];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display2( ){j=50;while(j){P2= 0x80;P0= LED7Code[3];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display3( ){j=50;while(j){P2= 0x80;P0= LED7Code[4];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}void display4( ){j=50;while(j){P2= 0x80;P0= LED7Code[5];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;} }void display5( ){j=50;while(j){P2= 0x80;P0= LED7Code[6];delay(50);P2=0x01;P0= LED7Code[1];delay(50);P0=0xff;j--;}}/************************************************************** ** 主程序 ** **************************************************************/ void main(){P0=0xc0;delay(20); //延时while(1){ keydown(); //调用按键判断检测程序switch( dis_buf){case 0x11 : P2=0x80; P0= LED7Code[1]; break;case 0x12 : P2=0x80; P0= LED7Code[2]; break;case 0x13 : P2=0x80; P0= LED7Code[3]; break;case 0x14 : P2=0x80; P0= LED7Code[4]; break;case 0x21 : P2=0x80; P0= LED7Code[5]; break;case 0x22 : P2=0x80; P0= LED7Code[6]; break;case 0x23 : P2=0x80; P0= LED7Code[7]; break;case 0x24 : P2=0x80; P0= LED7Code[8]; break;case 0x31 : P2=0x80; P0= LED7Code[9]; break;case 0x32 : display();break;case 0x33 : P2 = LED7Code[1]; P0= LED7Code[1]; break;case 0x34 : display1(); break;case 0x41 : display2(); break;case 0x42 : display3();; break;case 0x43 : display4();; break;case 0x44 : display5();; break;}delay(250);}}/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////(注:本资料素材和资料部分来自网络,仅供参考。

51单片机矩阵键盘程序示例

51单片机矩阵键盘程序示例

;lab5_asm;vol1.0;zqy;2012/2/18;定义初始化LED_CHABIT PSW数码管显示标志位,为1显示十位,为0显示个位;数字0-9ORG 00HJMP STARTORG 000BHJMP INT_T0转到中断服务程序,更改数码管显示ORG 0100HLED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDHDB 0FDH,87H,0FFH,0EFH,0BFHDB 86H,0DBH,0CFH,0E6H,0EDH,0FDHLED_TAB2:DB 0BFH,0BFH,0BFH,0BFH,0BFHDB 0BFH,0BFH,0BFH,0BFH,0BFHDB 86H,86H,86H,86HDB 86H,86H,86HSTART:;工作寄存器和某些数据单元的初始化MOV R0,#0;数码管显示初始化SETB LED_CHAMOVDPTR, #8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA,#OFEH位选数据,选中个位数码管,置低为选中MOVX@DPTR,脸选数据,对片外I/O 口的外设芯片访问MOVDPTR,#8200H段选地址MOVA,#OBFH段选数据,个位显示0MOVX@DPTR, A;定时器初始化MOV IE,#82H开启定时器T0中断MOV TMOD,#01H设定定时器T0为模式1MOV TH0,#0D8HMOV TL0,#0F0H装入初值,10MS 延时12MHZSETB TRC启动定时器T0KEY:;按键处理LCALL KEY_START用判断有无键按下子程序JZ KEY无键按下,重新扫描LCALL KEY_DELAY键按下,延时去抖LCALL KEY_STARTJZ KEYLCALL KEY_NEXT断哪一个键被按下LCALL DECODED® 译码LCALL KEY_EN判断按键释放LJMP KEYKEY_START:MOV DPTR, #8000H键盘地址MOV A,#0F0HMOVX @DPTR,A亍全部输出0 NOPNOPNOPMOVX A,@DPTR3 描键盘CPL A取正逻辑,1为按下ANL A,#0FHRETKEY_NEXT:MOV R1,# 0扫描行计数器MOV R2,# 0扫描列计数器MOV R3,#0FEH首行扫描字送R3 MOV DPTR, #8000HMOV A,R3MOVX @DPTR,AMOVX A,@DPTRCPL AANL A,#0FHMOV R4,#4S0123: JNZ SKEY不;为全0,有键按下; 全为0,进行下一行扫描INC R1行计数器加1MOV A,R3RL AMOV R3,AMOV DPTR,#8000HMOVX @DPTR,ANOPNOPNOPMOVX A,@DPTRCPL AANL A,#0FHDJNZ R4,S0123LJMP KEYEKEY:RETSKEY 0列号译码JBACC.0,SKEY1JBACC.1,SKEY2JBACC.2,SKEY3JBACC.3,SKEY4SKEY1:M0V A,#00存列号0 MOV R2,AAJMP EKEYSKE Y2:M0V A,#01存列号1 MOV R2,AAJMP EKEYSKEY3:M0V A,#02存列号2 MOV R2,AAJMP EKEYSKEY4: MOV A,#03存列号3 MOV R2,AAJMP EKEYDECODE:;行号在R1列号在R2;键值译码MOV A,R1MOV B,#04HMUL ABADD A,R2INC AMOV R0,ARETKEY_END:MOV DPTR,#8000H键盘地址MOVX A,@DPTR3 描键盘CPL A取正逻辑,1为按下ANL A,#0FHJNZ KEY_ENDLCALL KEY_DELAYJNZ KEY_ENDRETKEY_DELAY:MOV R5,#10HDS1:MOV R6,#0FFHDS2:NOPDJNZ R6,DS2DJNZ R5,DS1RETINT_TO:;中断服务程序,更改数码管显示MOV R7,AJB LED_CHA,DISP检查数码管显示标志位CPL LED_CHAMOVDPTR, #8200H段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA, #0FEH位选数据,选中个位数码管,置低为选中MOVX@DPTR, A位选数据,对片外I/O 口的外设芯片访问; 判断需要显示的个位数字MOV A,R0NOPMOV DPTR,#LED_TAB1NOPNOPMOVC A,@A+DPTRMOVDPTR, #82001■段选地址MOVX @DPTR,AJMP INT_EXITDISP_L:CPL LED_CHAMOVDPTR, #8200H段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H位选地址赋给DPTR高八位P2 口,选中U13锁存器MOVA, #0FDH位选数据,选中十位数码管,置低为选中MOVX@DPTR, A位选数据,对片外I/O 口的外设芯片访问;判断需要显示的十位数字0 或1MOV A,R0NOPMOV DPTR,#LED_TAB2MOVC A,@A+DPTRMOVDPTR, #8200H段选地址MOVX @DPTR,AINT_EXIT:MOV IE,#82HMOV TH0,#0D8HMOV TLO,#OFOH装入初值,10MS延时SETB TR0MOV A,R7MOV DPTR,#8000HRETIEND12MHZ。

51单片机矩阵键盘程序示例

51单片机矩阵键盘程序示例

;lab5_asm;vol1.0;zqy;2012/2/18;定义初始化LED_CHABIT PSW.5;数码管显示标志位,为1显示十位,为0显示个位;数字0-9ORG 00HJMP STARTORG 000BHJMP INT_T0;转到中断服务程序,更改数码管显示ORG 0100HLED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDHDB 0FDH,87H,0FFH,0EFH,0BFHDB 86H,0DBH,0CFH,0E6H,0EDH,0FDHLED_TAB2:DB 0BFH,0BFH,0BFH,0BFH,0BFHDB 0BFH,0BFH,0BFH,0BFH,0BFHDB 86H,86H,86H,86HDB 86H,86H,86HSTART:;工作寄存器和某些数据单元的初始化MOV R0,#0;数码管显示初始化SETB LED_CHAMOVDPTR, #8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA,#0FEH;位选数据,选中个位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问MOVDPTR,#8200H;段选地址MOVA,#0BFH;段选数据,个位显示0MOVX@DPTR, A;定时器初始化MOV IE,#82H;开启定时器T0中断MOV TMOD,#01H;设定定时器T0为模式1MOV TH0,#0D8HMOV TL0,#0F0H;装入初值,10MS延时12MHZSETB TR0 ;启动定时器T0KEY:;按键处理LCALL KEY_START;调用判断有无键按下子程序JZ KEY;无键按下,重新扫描LCALL KEY_DELAY;有键按下,延时去抖LCALL KEY_STARTJZ KEYLCALL KEY_NEXT;判断哪一个键被按下LCALL DECODE;键值译码LCALL KEY_END;判断按键释放LJMP KEYKEY_START:MOV DPTR, #8000H;键盘地址MOV A,#0F0HMOVX @DPTR,A;行全部输出0NOPNOPNOPMOVX A,@DPTR;扫描键盘CPL A;取正逻辑,1为按下ANL A,#0FHRETKEY_NEXT:MOV R1,#0;扫描行计数器MOV R2,#0;扫描列计数器MOV R3,#0FEH;首行扫描字送R3 MOV DPTR, #8000HMOV A,R3MOVX @DPTR,AMOVX A,@DPTRCPL AANL A,#0FHMOV R4,#4S0123: JNZ SKEY0;不为全0,有键按下;全为0,进行下一行扫描INC R1;行计数器加1MOV A,R3RL AMOV R3,AMOV DPTR,#8000HMOVX @DPTR,ANOPNOPNOPMOVX A,@DPTRCPL AANL A,#0FHDJNZ R4,S0123LJMP KEYEKEY:RETSKEY0:;列号译码JBACC.0,SKEY1JBACC.1,SKEY2JBACC.2,SKEY3JBACC.3,SKEY4SKEY1:MOV A,#00H;存列号0 MOV R2,AAJMP EKEYSKEY2:MOV A,#01H;存列号1 MOV R2,AAJMP EKEYSKEY3:MOV A,#02H;存列号2MOV R2,AAJMP EKEYSKEY4: MOV A,#03H;存列号3 MOV R2,AAJMP EKEYDECODE:;行号在R1,列号在R2;键值译码MOV A,R1MOV B,#04HMUL ABADD A,R2INC AMOV R0,ARETKEY_END:MOV DPTR,#8000H;键盘地址MOVX A,@DPTR;扫描键盘CPL A;取正逻辑,1为按下ANL A,#0FHJNZ KEY_ENDLCALL KEY_DELAYJNZ KEY_ENDRETKEY_DELAY:MOV R5,#10HDS1:MOV R6,#0FFHDS2:NOPDJNZ R6,DS2DJNZ R5,DS1RETINT_T0:;中断服务程序,更改数码管显示MOV R7,AJB LED_CHA,DISP_L;检查数码管显示标志位CPL LED_CHAMOVDPTR, #8200H;段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA, #0FEH;位选数据,选中个位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问;判断需要显示的个位数字MOV A,R0NOPMOV DPTR,#LED_TAB1NOPNOPMOVC A,@A+DPTRMOVDPTR, #8200H;段选地址MOVX @DPTR,AJMP INT_EXITDISP_L:CPL LED_CHAMOVDPTR, #8200H;段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA, #0FDH;位选数据,选中十位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问;判断需要显示的十位数字0或1MOV A,R0NOPMOV DPTR,#LED_TAB2MOVC A,@A+DPTRMOVDPTR, #8200H;段选地址MOVX @DPTR,AINT_EXIT:MOV IE,#82HMOV TH0,#0D8HMOV TL0,#0F0H;装入初值,10MS延时SETB TR0MOV A,R7MOV DPTR,#8000HRETIEND12MHZ。

试述51系列单片机矩阵键盘编程

试述51系列单片机矩阵键盘编程

试述51系列单片机矩阵键盘编程摘要在单片机系统中,常常使用键盘向单片机输入信息。

键盘由一组常开的按键组成,当按键闭合时就会向单片机系统输入一个电平信息。

每个按键都被赋予了一个键码,单片机根据此代码执行任务。

在单片机系统按键数量较多时,为了减少I/O口的使用通常使用矩阵键盘。

关键词单片机;键盘;矩阵键盘;I/O口1 矩阵键盘的结构矩阵键盘的按键排成矩阵,一般是4×4矩阵,即4行4列,行和列的交叉点接一个常开的独立按键,按键被闭合时就接通行线和列线。

8个I/O口产生16个交叉点16个按键,按键数量比独立按键多了一倍,9个I/O口产生20个按键,I/O口越多产生的按键数量越多,效果越明显。

可以在键盘扫描程序中对每个按键进行编号,如第一行按键从左到右对应0、1、2、3,第二行按键从左到右对应4、5、6、7,第三行按键从左到右对应8、9、A、B,第四行按键左到右对应C、D、E、F,每按一次键让数码管显示该按键所代表的编号。

2 矩阵键盘的工作原理矩阵键盘结构比独立键盘复杂,识别难度也比独立按键大很多。

矩阵键盘的工作方式有程序扫描方式、定时扫描方式、中断扫描方式3种。

本文只讨论程序扫描方式。

程序扫描方式是CPU主动调用扫描子函数,响应键盘的输入要求。

在子函数里有以下步骤:1)判断键盘中有无按键闭合;2)延时去抖消除干扰;3)检测是否确实有按键闭合,确定闭合键的编号;4)等待闭合键的释放。

整个步骤中确定闭合键的编号是关键所在,常用的判断方法有逐行扫描法和反转扫描法。

3 硬件仿真4×4矩阵键盘无需外接电源,电位变化完全由编程来决定。

通过软件延时来消抖动,去干扰。

4×4矩阵键盘4行4列交叉,每个按键位于交叉点上对应的行列号唯一,共16个按键。

4×4矩阵键盘8个I/O口接P1口,7SEG-MPX2-AN-GREEN7段共阳极数码管通过上拉电阻接P0口。

键盘中每闭合一个按键让数码管显示对应的编号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档