郭天祥老师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口。

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

51单片机--矩阵键盘仿真

51单片机--矩阵键盘仿真

51单片机--矩阵键盘仿真矩阵键盘实验该实验采用proteus 7.4 sp3进行的仿真,仿真原理图如下图所示,该实验是4×4矩阵键盘实验,每按一个键最后一个数码管显示,原先显示的数左移一位,六位都显示后从新从第一个开始显示。

键盘输入值如下图键盘上标注。

输入0、1、2时的显示结果:有输入5、6、7后的显示结果:/********************************************************************** * 程序名; 矩阵键盘实验* 功能:数码管通过动态扫描显示键盘输入的数字,输入一个数,数码管上* 显示的数左移一位,达到六位后从第一个开始显示.* 编程者:ZPZ* 编程时间:2009/8/11**********************************************************************/ #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charbit flag=0;uchar temp,i,m,s=0,s1,s2,s3,s4,s5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void display(uchar a);void delay(uint z);void keyscan();void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d);/****************** 主函数*******************/ void main(){while(1){keyscan();if(flag==0){P1=0xff;P0=0xff;}if(flag==1){display(m);}}}/****************** 显示函数*******************/ void display(uchar a){if(s==1){P1=0x20;P0=table[a];s1=table[a];delay(1);}if(s==2){P1=0x10;P0=s1;delay(1);P1=0x20;P0=table[a];s2=table[a];delay(1);} if(s==3){P1=0x08;P0=s1;delay(1);P1=0x10;P0=s2;delay(1);P1=0x20;P0=table[a];s3=table[a];delay(1);} if(s==4){P1=0x04;P0=s1;delay(1);P1=0x08;P0=s2;delay(1);P1=0x10;P0=s3;delay(1);P1=0x20;P0=table[a];s4=table[a];delay(1);} if(s==5){P1=0x02;P0=s1;delay(1);P1=0x04;P0=s2;delay(1);P1=0x08;P0=s3;delay(1);P1=0x10;P0=s4;delay(1);P1=0x20;P0=table[a];s5=table[a];delay(1);} if(s==6){P1=0x01;P0=s1;delay(1);P1=0x02;P0=s2;delay(1);P1=0x04;P0=s3;delay(1);P1=0x08;P0=s4;delay(1);P1=0x10;P0=s5;delay(1);P1=0x20;P0=table[a];delay(1);}if(s>6){s=1;}}/****************** 延时子函数*******************/ void delay(uint z){uint j,k;for(j=z;j>0;j--)for(k=120;k>0;k--);}/****************** 键扫描函数*******************/ void keyscan(){P3=0xff;keyin(0xfe,0,1,2,3);keyin(0xfd,4,5,6,7);keyin(0xfb,8,9,10,11);keyin(0xf7,12,13,14,15);}/****************** 键输入函数*******************/void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d){P3=zhi;temp=P3;temp=P3&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=P3&0xf0;if(temp!=0xf0){temp=P3;temp=P3&0xf0;switch(temp){case(0xe0):m=a;break;case(0xd0):m=b;break;case(0xb0):m=c;break;case(0x70):m=d;break;default:break;}flag=1;delay(200);s++;if(s>6)s=1;}delay(10);}}。

51单片机4×4矩阵式键盘识别汇编程序

51单片机4×4矩阵式键盘识别汇编程序

;******************************************************;*标题: 51单片机4×4矩阵式键盘识别汇编程序;*******************************************************; 0 1 2 3 ---P20; 4 5 6 7 ---P21; 8 9 10 11 ---P22; 12 13 14 15 ---P23; | | | |; P24 P25 P26 P27;******************************************************************ORG 0000hAJMP MAINORG 0030hMAIN:MOV DPTR,#TAB ;将表头放入DPTRLCALL KEY;调用键盘扫描程序MOVC A,@A+DPTR ;查表后将键值送入ACCMOV P0,A;将Acc值送入P0口CLR P1.3 ;开显示LJMP MAIN ;返回调用子程序反复循环显示;----------------------------------------------------------------------KEY:LCALL KS ;调用检测按键子程序JNZ K1 ;有键按下继续LCALL DELAY2 ;无键按下调用延时去抖动程序AJMP KEY;返回继续检测有无按键按下K1:LCALL DELAY2LCALL DELAY2 ;有键按下继续延时去抖动LCALL KS ;再一次调用检测按键程序JNZ K2 ;确认有按下进行下一步AJMP KEY;无键按下返回继续检测K2:MOV R2,#0EFH ;将扫描值送入R2暂存MOV R4,#00H ;将第一列的列值00H送入R4暂存,R4用于存放列值。

K3:MOV P2,R2 ;将R2的值送入P1口L6:JB P2.0,L1 ;P1.0等于1跳转到L1MOV A,#00H ;将第一行的行值00H送入ACCAJMP LK ;跳转到键值处理程序JB P2.1,L2 ;P1.1等于1跳转到L2MOV A,#04H ;将第二行的行值送入ACCAJMP LK ;跳转到键值理程序进行键值处理L2:JB P2.2,L3 ;P1.2等于1跳转到L3MOV A,#08H ;将第三行的行值送入ACCAJMP LK ;跳转到键值处理程序L3:JB P2.3,NEXT ;P1.3等于1跳转到NEXT处MOV A,#0cH ;将第四行的行值送入ACCLK:ADD A,R4 ;行值与列值相加后的键值送入APUSH ACC ;将A中的值送入堆栈暂存K4:LCALL DELAY2 ;调用延时去抖动程序LCALL KS ;调用按键检测程序JNZ K4 ;按键没有松开继续返回检测POP ACC ;将堆栈的值送入ACCRETNEXT:INC R4 ;将列值加一MOV A,R2 ;将R2的值送入AJNB ACC.7,KEY;扫描完成跳至KEY处进行下一回合的扫描RL A;扫描未完成将A中的值右移一位进行下一列的扫描MOV R2,A;将ACC的值送入R2暂存AJMP K3 ;跳转到K3继续KS:MOV P2,#0FH ;将P1口高四位置0低四位值1MOV A,P2 ;读P1口XRL A,#0FH ;将A中的值与A中的值相异或RET ;子程序返回DELAY2: ;40ms延时去抖动子程序8*FA*2=40ms MOV R5,#08HL7:MOV R6,#0FAHL8:DJNZ R6,L8DJNZ R5,L7RETDB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 088H;ADB 083H;bDB 0C6H;CDB 0A1H;dDB 086H;EDB 08EH;F END。

51单片机矩阵按键程序

51单片机矩阵按键程序

51单片机矩阵按键程序下述为程序:#include <reg51.h>#define Keyvalue P1 //按下的键的代号#define Digvalue P0 //用宏定义来定义一下数码管的发送屈始数据端口typedef unsigned int ut;typedef unsigned char uc;ut k;sbit LSA=P2^2; //定义三八译码器泪亲的三个输入端口sbit LSB=P2^3;sbit LSC=P2^4;utsmgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //从0~15的十六进制编码void delay(ut i) //延时函数{ while(i) i--;}void anjian( //检测按键是否按下,若按键按下则给k附上按下的键的序号{ uta; Keyvalue=0x0f; if(Keyvalue!=0x0f) { delay(1000); if(Keyvalue!=0x0f) { Key value=0x0f; switch(Keyvalue) { case(0x07):k=0;break; case(0x0b):k=1;break ; case(0x0d):k=2;break; case(0x0e):k=3;break; } Keyvalue=0xf0; switch(Keyv alue) { case(0x70):k=k;break; case(0xb0):k=k+4;break; case(0xd0):k=k+8;br eak; case(0xe0):k=k+12;break; } } 劣蚊各} while((a<50)&&(Keyvalue!=0x0f)) { delay(1000); a++; }}voidmain({ LSA=0; //让第一个数码管显示数字 LSB=0; LSC=0; while(1) { anjian(; Digvalue=smgduan[k]; //显示数字 }}。

51单片机矩阵键盘的编程

51单片机矩阵键盘的编程

51单片机矩阵键盘的编程C51 单片机上的外设键盘键是使用的矩阵方式扩展的,但是硬件仿真时必须把蜂民器的开关打开触使行扫描的74HC53 的E 端接地为输出型,否则测死了也没反应,我还以为是我的程序有问题呢,后来才找到的。

其原理74HC138 译码器在输出端Y1 与WR(P3)都处于低电平通过或非门,转化成行扫描的74HC53 的片选端打开写入数据,在输出端的高4 位通过移位方式输出到外设键盘中。

然后给WR 一个高电平来给74HC53 一个低电平使得输入无效进行锁存操作。

然后通过RD(P3)与Y2 共同输出低电平通过或非门加上个非门把低电平送到列扫描的74HC53 的片选端E 上,在读取数据前必须先将要获取的高4 位进行置1,然后读取高4 位数据,通过RD 送出高电平进行锁住输出,防止74HC53 同时输入输出导致芯片烧毁。

然后根据获得的unsigned char 进行移位比对操作来获得是哪一列,然后在通过运算得到第几个按键被按下。

这是最简单的矩阵方式扩展键盘的代码流程,上述是我理解的流程,测试已没问题。

#includereg52.h#includeabsacc.hvoid my_delay10nms(unsigned int n){unsigned i,j;while(n --){for(i = 128;i 0;i --)for(j = 10;j 0;j --);}}sbit LED_BIT = P1;vo i dmain(void){unsigned char Key_h;unsigned char Key_Val;unsigned char Key_r;unsigned char Last_key;unsigned char Key_Temp;while(1){Key_Val=0;for(Key_h=4;Key_h8;Key_h++){P2=0x88;P0=(1Key_h);P3=~(16);P3|=(16);P2=0x90;P3=~(17); //读P0|=0xf0;Key_Temp=P00xf0; // P3|=(17); // 防止芯片烧坏if(Key_Temp) {for(Key_r=4;Key_r8;Key_r++){if(Key_Temp(1Key_r)){Key_Val=(Key_h-。

郭天祥单片机C语言---课后答案

郭天祥单片机C语言---课后答案

郭天祥十天学通单片机TX-1C单片机实验板所有课作业+答案,特别整理,供单片机爱好与学习者使用讲次内容细节第一讲学单片机预备知识、如何点亮一个发光管单片机能做什么,基本电子知识,如何用TX-1C单片机学习板学习单片机,C51知识简介,如何申请免费芯片样品。

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

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

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

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

(本节由学生自己设计电路)第十二讲使用Protell99绘制电路图全过程Protell99软件使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工第十三讲Altium designer 6.5绘制电路图全过程最顶级电路板设计软件Altium Designer使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工lesson1对照TX-1C单片机学习板原理图写程序用位操作和总线操作两种方法完成以下题目1.熟练建立KEIL工程2.点亮第一个发光管.3.点亮最后一个发光管4.点亮1、3、5、75.点亮二、四、五、六6.尝试让第一个发光管闪烁7.尝试设计出流水灯程序=========================================================== ===========================================================lesson2第一个发光管以间隔200ms闪烁8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

51单片机矩阵按键

51单片机矩阵按键
矩阵按键实验
1.矩阵按键的由来 2.矩阵按键扫描原理 3.矩阵按键怎么变成独立按键 4.编写矩阵按键控制程序
1. 矩阵按键由来
2. 矩阵按键扫描原理
方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩 阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候, 说明有按键按下,然后通过接收到的数据是哪一位为0来判断 是哪一个按键被按下。
3. 矩阵按键怎么变们可以通过高四位全部输出低电平,低四位
输出高电平。当接收到的数据,低四位不全为高电平时,说 明有按键按下,然后通过接收的数据值,判断是哪一列有按 键按下,然后再反过来,高四位输出高电平,低四位输出低 电平,然后根据接收到的高四位的值判断是那一行有按键按 下,这样就能够确定是哪一个按键按下了。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档