51单片机矩阵键盘显示汇编版

合集下载

51单片机矩形键盘控制数码管显示0-F,以及LED灯的亮灭

51单片机矩形键盘控制数码管显示0-F,以及LED灯的亮灭

51单片机矩形键盘控制数码管显示0-F,以及LED灯的亮灭仿真视频51单片机矩形键盘控制数码管显示0-F,以及LED灯的亮灭的仿真视频电路图总图部分图1部分图2部分图3元件清单(有多余)C语言程序#include <reg51.h>#define uint unsigned int #define uchar unsigned char//共阳数码管编码表&LED灯uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};//函数声明void delay(uint time); //延时函数void display(uchar k); //数码管显示0-F以及LED灯的亮灭uchar getKey();//读取键盘的数值//主程序void main(){ uchar keyValue; while(1){ keyValue = getKey(); //读取键盘值 display(keyValue); //数码管显示&LED亮灭}}void delay(uint time){ uint i,j; for(i = 0; i<time; ++i) for(j = 0; j<110; ++j);}void display(uchar k){ P0 = table[k]; P1 = table[k];}uchar getKey(){ uchar x , y ; uchar result; // 计算行数X的值 P2 = 0x0f; // 从P2口输出,写P2口 if (P2 != 0x0f)// 从P2口输入,P2口 { // 读出的不是0x0f说明有按键被按下 delay(20); // 判断在哪一行 switch (P2) { case 0x0e: x = 0; break; case 0x0d: x = 1; break; case 0x0b: x = 2; break; case 0x07: x = 3; break; default: break; } delay(10); // 计算列数y的值P2 = 0xf0; if (P2 != 0xf0) { delay(20); switch (P2) { case 0xe0:y = 0; break; case 0xd0: y = 1; break; case 0xb0: y = 2; break; case 0x70: y = 3; break; default: break; } // 计算出结果,确定数码管显示的数字以及字母与LED的亮灭 } } result = x * 4 + y; return result;}#单片机##C语言##电工电子#。

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

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

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单片机之 按键 的 C语言与汇编的编程

我的51单片机之 按键 的 C语言与汇编的编程
void main() {
P1=0xFF; P3=0xFF; while(1) {
if(KINT0==0) {
LD1=0; } if(KINT1==0) {
LD2=0; } if(KT0==0) {
LD3=0; } if(KT1==0) {
LD4=0; } if(KA2==0) {
LD5=0;
} if(KA1==0) {
KINT0 EQU P3.2; KINT1 EQU P3.3; KT0 EQU P3.4; KT1 EQU P3.5; KA2 EQU P3.6; KA1 EQU P3.7; LD1 EQU P1.0; LD2 EQU P1.1; LD3 EQU P1.2; LD4 EQU P1.3; LD5 EQU P1.4; LD6 EQU P1.5;
LD6=0; } } }
四、独立按键汇编程序: ;**************************************************************** ;每个独立铵键用一只指示灯指示;按复位键可熄灭,made by luqichao ;**************************************************************** ORG 0000H AJMP MAIN ORG 0030H
//字形码:0--f 及小数点
unsigned char code AscLed[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//
{ 0 , 1, 2 , 3 , 4 , 5, 6, 7, 8, 9 }
void main() {
start: LED2=0; //亮数码管 P3=0xFF; KH1=0; if(KL1==0){LEDCODE=AscLed[1];goto start;};//k1 if(KL2==0){LEDCODE=AscLed[2];goto start;};//k2 if(KL3==0){LEDCODE=AscLed[5];goto start;};//k5 KH2=0; if(KL1==0){LEDCODE=AscLed[3];goto start;};//k3 if(KL2==0){LEDCODE=AscLed[4];goto start;};//k4 if(KL3==0){LEDCODE=AscLed[6];goto start;};//k6 KH3=0; if(KL1==0){LEDCODE=AscLed[7];goto start;};//k7 if(KL2==0){LEDCODE=AscLed[8];goto start;};//k8 if(KL3==0){LEDCODE=AscLed[9];goto start;};//k9

单片机实验报告——矩阵键盘数码管显示

单片机实验报告——矩阵键盘数码管显示

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。

按其它键没有结果。

二、实验目的1、学习独立式按键的查询识别方法。

2、非编码矩阵键盘的行反转法识别方法。

3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

5、掌握利用Keil51软件对程序进行编译。

6、会根据实际功能,正确选择单片机功能接线,编制正确程序。

对实验结果能做出分析和解释,能写出符合规格的实验报告。

三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。

2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。

3、识别键的闭合,通常采用行扫描法和行反转法。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。

行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。

然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。

这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。

由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

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。

机电单片机课程设计--4乘4矩阵键盘-汇编语言

机电单片机课程设计--4乘4矩阵键盘-汇编语言

目录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端口的情况下,行列式键盘的接法会比独立式接法允许的按键数量多。

51单片机矩阵键盘

51单片机矩阵键盘




JC NEXT5 NEXT6: MOV A,P1 ANL A,#0FH CJNE A,#0FH,NEXT6 MOV R0,#0FFH RET <2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转 法”。 首先让P1口高四位为1,低四位为0,。若有按键按下,则高 四位中会有一个1翻转为0,低四位不会变,此时即可确定被 按下的键的行位置。 然后让P1口高四位为0,低四位为1,。若有按键按下,则低 四位中会有一个1翻转为0,高四位不会变,此时即可确定被 按下的键的列位置。 最后将上述两者进行或运算即可确定被按下的键的位置。
K0
P10
K4
0 4 8 C
P14
K1
1 5 9 D
P15
K2
2 6 A E
P16
K3
3 7 B F
P17
K5
K6
K7
P11 P12 P13
K8
K9
K10
K11
89C52
E A/VP X1 X2 RE SE T RD WR
K12
K13
K14
K15
数码管前三位显示一个跑表,从000到 999之间以1%秒速度运行,当按下一个独 立键盘时跑表停止,松开手后跑表继续运 行。(用定时器设计表)。 在上题的基础上,用另外三个独立键盘实 现按下第一个时计时停止,按下第二个时 计时开始,按下第三个是计数值清零从头 开始。 按下16个矩阵键盘依次在数码管上显示116的平方。如按下第一个显示1,第二个 显示4...

键盘扫描程序: 从以上分析得到键盘扫描程序的流程图所示。程序如下 SCAN: MOV P1,#0FH MOV A,P1 ANL A,#0FH CJNE A,#0FH,NEXT1 SJMP NEXT3 NEXT1: ACALL D20MS MOV A,#0EFH NEX,P1 ANL A,#0FH CJNE A,#0FH,KCODE; MOV A,R1

51单片机矩阵键盘带去抖释放检测汇编

51单片机矩阵键盘带去抖释放检测汇编

ORG 0000HLJMP MAINORG 0100HMAIN: ACALL KEYSCAN ;调用子函数MOV A,30H ;从30H单元取相应的数值MOV DPTR,#TABLEMOVC A,@A+DPTRMOV P2,AACALL DELAY20MSSJMP MAINMOV P1,#0FH ;线反转法MOV A,P1ANL A,#0FHMOV B,AMOV P1,#0F0HMOV A,P1ANL A,#0F0HORL A,BMOV 30H,ACJNE A,#0FFH, MASKVIB ;有键按下转去抖动RETMASKVIB: ACALL DELAY20MSMOV P1,#0FH ;再次检测MOV A,P1ANL A,#0FHMOV B,AMOV P1,#0F0HMOV A,P1ANL A,#0F0HORL A,BCJNE A,30H, QUITKEY;比较两次扫描键值RELEASE: MOV P1,#0FFH ;释放检测MOV A,P1CJNE A,#0FFH, RELEASE ;等待释放KEYPRO: MOV B,30H ;键值处理程序MOV DPTR,#KEYV ALUEMOV R7,#0FFHKEY1: INC R7MOV A,R7MOVC A,@A+DPTRCJNE A,B,KEY2MOV A, R7MOV 30H,A;键码保存SETB 20H ;键值有效标志位RETKEY2: CJNE A,#00H,KEY1 ;扫描键值结束标志QUITKEY: RET ;键扫描无效退出DELAY20MS: ;延时20MS子程序,使用40,41,42单元MOV 40H,#20 ;NEXT1: MOV 41H,#20NEXT2: MOV 42H,#248DJNZ 42H,$DJNZ 41H,NEXT2DJNZ 40H,NEXT1RETKEYV ALUE: DB 77H,7BH,7DH,7EH ;键码表DB 0B7H,0BBH,0BDH,0BEHDB 0D7H,0DBH,0DDH,0DEHDB 0E7H,0EBH,0EDH,0EEHDB 00HTABLE: DB 0C0H,0F9H,0A4H,0B0H ;共阳数码管编码表DB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHEND矩阵键盘扫描子程序,使用P1口。

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