(1. Connect the P3.0 - P3.7 ports in the "MCU System" area to the C1 - C4 R1 - R4 ports in the " 4X4 Column Keyboard" area using an 8 -core cable ;
(2.
Connect the
P0.0/AD0
-
P0.7/AD7
ports
in the "Single-Chip Microcomputer System" area
to any
a
-
h
ports in the "Four-Way Static Digital Display Module" area using an
8
-core cable
; requirements:
P0.0/AD0
corresponds to
a
,
P0.1/AD1
corresponds to
b
,
...
,
P0.7/AD7
corresponds to
h
.
4.
Programming content
(1.
4×4 matrix keyboard recognition processing
(2.
Each key has its row value and column value. The combination of row value and column value is the code to identify this key. The row and column lines of the matrix
communicate with the CPU through two parallel interfaces respectively. The state of each key also needs to be converted into digital quantities "0" and "1". One end of the switch (column line) is connected to V
CC
through a resistor
, and grounding is achieved by outputting the number "0" through the program. The task of the keyboard processing program is to determine whether a key is pressed, which key is pressed, and what the function of the key is; and to eliminate the jitter of the key when it is closed or opened. Among the two parallel ports, one outputs the scan code to dynamically ground the key row by row, and the other parallel port inputs the key state. The row scan value and the feedback signal together form the key code to identify the key, and the function of the key is found out through software table lookup.
5.
Flowchart
6.
Assembly 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
RIGHT
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
7.
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;
void main(void)
{
while(1)
{
P3=0xff;
P3_4=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=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;
}
}
}
}
}
Previous article:Timing counter T0 as timing application technology (I)
Next article:Dynamic digital display technology
- Popular Resources
- Popular amplifiers
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- Innolux's intelligent steer-by-wire solution makes cars smarter and safer
- 8051 MCU - Parity Check
- How to efficiently balance the sensitivity of tactile sensing interfaces
- What should I do if the servo motor shakes? What causes the servo motor to shake quickly?
- 【Brushless Motor】Analysis of three-phase BLDC motor and sharing of two popular development boards
- Midea Industrial Technology's subsidiaries Clou Electronics and Hekang New Energy jointly appeared at the Munich Battery Energy Storage Exhibition and Solar Energy Exhibition
- Guoxin Sichen | Application of ferroelectric memory PB85RS2MC in power battery management, with a capacity of 2M
- Analysis of common faults of frequency converter
- In a head-on competition with Qualcomm, what kind of cockpit products has Intel come up with?
- Dalian Rongke's all-vanadium liquid flow battery energy storage equipment industrialization project has entered the sprint stage before production
- Allegro MicroSystems Introduces Advanced Magnetic and Inductive Position Sensing Solutions at Electronica 2024
- Car key in the left hand, liveness detection radar in the right hand, UWB is imperative for cars!
- After a decade of rapid development, domestic CIS has entered the market
- Aegis Dagger Battery + Thor EM-i Super Hybrid, Geely New Energy has thrown out two "king bombs"
- A brief discussion on functional safety - fault, error, and failure
- In the smart car 2.0 cycle, these core industry chains are facing major opportunities!
- The United States and Japan are developing new batteries. CATL faces challenges? How should China's new energy battery industry respond?
- Murata launches high-precision 6-axis inertial sensor for automobiles
- Ford patents pre-charge alarm to help save costs and respond to emergencies
- New real-time microcontroller system from Texas Instruments enables smarter processing in automotive and industrial applications
- Please tell me the output voltage of the bidirectional thyristor circuit
- I encountered many problems in my study as shown in the figure (I am a hardware developer and just learned C)
- How to consider and design ESD of RF modules?
- Verilog module content
- 【AT32F421 Review】+ ADC Sampling and SPI_OLED Display
- [STM32F769Discovery development board trial] Convenient SD card reading BMP file & QSPI reading and writing & SDRAM reading and writing
- [Gizwits Gokit3 Review] + Light up an RGB light
- TPMS matching method
- Unblocked? A new round of control has begun.
- Domestic chip replacement