MCU drives 4X4 matrix keyboard input program

Publisher:玄幻剑客Latest update time:2012-12-05 Source: 51heiKeywords:MCU Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

Use the parallel port P1 of AT89S51 microcontroller to connect to a 4×4 matrix keyboard, use P1.0-P1.3 as input lines, and P1.4-P1.7 as output lines; display the "0-F" sequence of each key on the digital tube to realize keyboard input recognition.

I will provide you with two versions of 4X4 ​​matrix keyboard input program, C and assembly. For example, the assembly language source program:

KEYBUF    EQU 30H
ORG 00H
START:      MOV KEYBUF,#2
WAIT:
MOV P3,#0FFH
CLR P3.4
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1:        CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2:        CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1
NK3:        CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1
NK4:        NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A

DK1A:       MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
NOKEY1:
MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5:        CJNE A,#0DH,NK6
MOV KEYBUF,#5
LJMP DK2
NK6:        CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7:        CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8:        NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A

DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH XRL
A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A

DK3A:       MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
NOKEY3:
MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4
NK13:       CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4
NK14:       CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4
NK15:       CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4
NK16:       NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A

DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABFLEH, DB 06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END

[page]

C language source program:

#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;

//My program has no comments, but it is very simple. If you don't understand, go to the 51 section of the MCU forum for solutions http://www.51hei.com The C program and the assembly program above achieve the same function. Beginners can get familiar with the use of the two languages ​​by comparing them.
void main(void)
{
while(1)
{ P3 =
0xff; temp & 0x0f; switch (temp ) { case 0x0e: key = 7 ; break; case 0x0d: key= 8; break; case 0x0b: key=9; break ; case 0x07: key= 10; break ; } temp= P3 ; P1_0=~P1_0; P0 = table[key]; temp = temp & 0x0f; while(temp!=0x0f) { temp =P3; temp= temp & 0x0f ; } } }






































P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
}
}

P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=1;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
}
}

P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
}
}
}
}

Keywords:MCU Reference address:MCU drives 4X4 matrix keyboard input program

Previous article:Single chip one-button multi-function key recognition technology
Next article:Microcontroller drives buzzer C51 program

Recommended ReadingLatest update time:2024-11-16 15:01

Single chip RGB color light gradient colorful light no flicker source program
/*Colored lights auto cycle: 1, gradient*/ #include reg52.h #define uchar unsigned char #define uint unsigned int #define dengji 1 //LED change level adjustment sfr P5=0xC8; //xxxx,1111 port 5 uint shudu=30; //LED gradient speed adjustment sbit B1=P3^3; sbit R1=P5^4; sbit G1=P5^5; uchar cishu; uchar num; //timer c
[Microcontroller]
Commonly used address latch chips in single-chip microcomputer systems: 74LS373 74hc373
The commonly used address latch chip 74LS373 and coms' 74hc373 in the single-chip microcomputer system are 8D flip-flops with three-state buffer outputs. The pin diagram, structural schematic diagram, and circuit connection diagram are as follows: 74LS373 pin diagram internal structure schematic diagram circuit con
[Microcontroller]
Commonly used address latch chips in single-chip microcomputer systems: 74LS373 74hc373
Design of electronic clock based on single chip microcomputer
#include reg51.h #define uchar unsigned char   #define uint  unsigned int   uchar sec = 6, min = 6, hou = 6, a = 0, b = 0, c = 0;   fly num = 0, cmd = 0;   uint time = 0;   uint flag = 0; sbit P30 = P3^0;   sbit P35 = P3^5;   sbit P32 = P3^2;   sbit P33 = P3^3;       uchar code tab ={0xc0, 0xf9, 0xa4, 0xb0, 0x99,
[Microcontroller]
Common Problems with PIC Microcontrollers
    1. How to choose the crystal in the PIC microcontroller oscillation circuit?    For a high-reliability system design, the choice of crystal is very important, especially for systems with sleep wake-up (often using low voltage for low power consumption). This is because the low supply voltage reduces the excitatio
[Microcontroller]
Design of Artillery Weather Instrument Based on MSP430F149 Single Chip Microcomputer
Aiming at the problems of the simple comprehensive meteorological observation instrument currently used, such as poor real-time performance, insufficient accuracy, long operation time and inability to directly calculate the correction of firing conditions and ground wind, this paper proposes to design an artillery m
[Microcontroller]
Design of Artillery Weather Instrument Based on MSP430F149 Single Chip Microcomputer
Design of a high-power lead-acid battery charger controlled by P89LPC93X single-chip microcomputer
With the enhancement of global environmental awareness, various vehicles using lead-acid batteries are constantly entering people's field of vision. However, there are many kinds of chargers for lead-acid batteries in the world. These chargers often cause lead-acid batteries to be overcharged or undercharged, result
[Microcontroller]
Design of a high-power lead-acid battery charger controlled by P89LPC93X single-chip microcomputer
Design of small resistance tester based on C8051F005 single chip microcomputer
In the process of circuit testing, it is often encountered that there is a large error between the experimental data and the theoretical value due to the neglect of the influence of some small resistances, thus affecting the test effect. For example, copper resistance often exists in inductors and transformers
[Microcontroller]
Design of small resistance tester based on C8051F005 single chip microcomputer
51 MCU ADC0804 analog-to-digital conversion learning
Schematic diagram of the connection between the digital-to-analog converter ADC0804 and the microcontroller: This is the circuit schematic diagram of the connection between ADC0804 and the microcontroller on the TX-1C experiment board. The left one is ADC0804, the right one is 74HC573 latch, th
[Microcontroller]
51 MCU ADC0804 analog-to-digital conversion learning
Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号