📄 tiaoshi3.asm
字号:
KeyValue EQU 30H ;显示键值存储变量
DisplayCode EQU 31H ;显示码存贮变量
ROW EQU 32H ;行代码存贮变量
Column EQU 33H ;列代码存贮变量
ScanCount EQU 34H ;扫描圈数存贮变量
ScanCode EQU 35H ;扫描码存贮变量
DisplayBuffer EQU 36H ;以此开始的连续四个单元用以存放显示码
KeyvaluBuffer EQU 40H ;以此开始的连续四个单元用以存放键值
QIANWEI EQU 44H ;显示数值千位存贮变量
BAIWEI EQU 45H ;显示数值百位存贮变量
SHIWEI EQU 46H ;显示数值十位存贮变量
GEWEI EQU 47H ;显示数值个位存贮变量
ORG 0
SJMP Start
Start:
MOV SP,#5FH ;初始化程序
MOV DisplayCode,#00H ;设定初始不显示
MOV ScanCode,#0EFH ;设定扫描顺序
MOV ScanCount,#5
MOV P2,#00H
MOV R2,#00H
MOV R3,#19H
MOV R6,#19H
MOV R1,#4 ;显示码缓存区清零
MOV R0,#DisplayBuffer
DisplayLoop:
MOV @R0,#00H
INC R0
DJNZ R1,DisplayLoop
MOV R1,#4 ;键值缓存区清零
MOV R0,#KeyvaluBuffer
Keyvaluloop:
MOV @R0,#00H
INC R0
DJNZ R1,Keyvaluloop
Main: ;扫描程序开始,采用逐行查询扫描的方式
MOV A,ScanCode
RR A
ORL A,#0F0H
MOV ScanCode,A
MOV P2,#00H
MOV P3,A
MOV A,P3
MOV R5,A
XRL A,ScanCode
JZ NotKey ;若未检测到按键按下,则继续扫描下一行
AJMP HaveKey ;若检测到按键按下,则跳至相应程序执行
NotKey:
DJNZ ScanCount,KELO ;记录扫描圈数,一轮扫描完成后重新置入初值
MOV ScanCount,#5
MOV ScanCode,#0EFH
KELO: PUSH ScanCode ;将主程序当前扫描行代码压入堆栈
DECI: MOV R0,#35H ;循环显示缓存区内的数值
MOV R4,#04H
MOV ScanCode,#0FFH
CLR C
LIU: INC R0
MOV P2,@R0
MOV A,ScanCode
RLC A
MOV ScanCode,A
MOV P3,A
AJMP Delay1
PEN: DJNZ R4,LIU
FIJ: DJNZ R3,DECI
MOV R3,#19H
DJNZ R6,FIJ
MOV R6,#19H
POP ScanCode ;释放主程序当前扫描行代码
AJMP Main ;跳至主程序继续执行扫描
CLEA: ;清除显示缓存区内数据
MOV R2,#00H
MOV R0,#DisplayBuffer
MOV R1,#4
DELSHOW:
MOV @R0,#00H
INC R0
DJNZ R1,DELSHOW
MOV R0,#KeyvaluBuffer
MOV R1,#4
DELKEY: ;清除键值缓存区内数据
MOV @R0,#00H
INC R0
DJNZ R1,DELKEY
AJMP NotKey
HaveKey:
AJMP FindKeyValue
LOOP: MOV A,KeyValue
AJMP Decode
SHOW:
MOV A,DisplayCode
XRL A,#77H
JZ MOTORCICLE
MOV A,DisplayCode
XRL A,#7CH
JZ CLEA
MOV DisplayBuffer,DisplayBuffer+1
MOV KeyvaluBuffer,KeyvaluBuffer+1
MOV DisplayBuffer+1,DisplayBuffer+2
MOV KeyvaluBuffer+1,KeyvaluBuffer+2
MOV DisplayBuffer+2,DisplayBuffer+3
MOV KeyvaluBuffer+2,KeyvaluBuffer+3
MOV DisplayBuffer+3,DisplayCode
MOV KeyvaluBuffer+3,Keyvalue
PET: INC R2 ;小数点显示
CJNE R2,#2,NotKey
MOV A,DisplayCode
ADD A,#80H
MOV DisplayBuffer+3,A
AJMP NotKey
MOTORCICLE:
MOV TMOD ,#00000001B
WAIT: JNB P1.4,LEFTTURN
JNB P1.5,RIGHTTURN
AJMP WAIT
LEFTTURN: MOV QIANWEI,KeyvaluBuffer ;电机左转驱动程序
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0FFH
MOV TL0,#0A0H
SETB TR0
PULSE1: JNB TF0,$
CLR TF0
CPL P1.0
MOV TH0,#0FFH
MOV TL0,#0A0H
MOV A,GEWEI
JZ TELI4
DJNZ GEWEI,PULSE1
TELI4: MOV GEWEI,#9
MOV A,SHIWEI
JZ TELI1
DJNZ SHIWEI,PULSE1
TELI1: MOV SHIWEI,#9
MOV A,BAIWEI
JZ TELI2
DJNZ BAIWEI,PULSE1
TELI2: MOV BAIWEI,#9
MOV A,QIANWEI
JZ TELI3
DJNZ QIANWEI,PULSE1
CLR TR0
TELI3: AJMP Notkey
RIGHTTURN: CPL P1.1 ;电机右转驱动程序
MOV QIANWEI,KeyvaluBuffer
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0FFH
MOV TL0,#0A0H
SETB TR0
PULSE2: JNB TF0,$
CLR TF0
CPL P1.0
MOV TH0,#0FFH
MOV TL0,#0A0H
MOV A,GEWEI
JZ COMU1
DJNZ GEWEI,PULSE2
COMU1: MOV GEWEI,#9
MOV A,SHIWEI
JZ COMU2
DJNZ SHIWEI,PULSE2
COMU2: MOV SHIWEI,#9
MOV A,BAIWEI
JZ COMU3
DJNZ BAIWEI,PULSE2
COMU3: MOV BAIWEI,#9
MOV A,QIANWEI
JZ COMU4
DJNZ QIANWEI,PULSE2
CPL P1.1
CLR TR0
COMU4: AJMP Notkey
FindKeyValue: ;计算扫描到的按键键值
MOV A,R5
FindRow:
SWAP A
ANL A,#0FH
MOV Row,#0
NextRow:
RRC A
JNC FindColumn
INC Row
JMP NextRow
FindColumn:
MOV A,R5
ANL A,#0FH
MOV Column,#0
NextColumn:
RRC A
JNC CalculateKeyValue
INC Column
JMP NextColumn
CalculateKeyValue:
MOV A,Column
MOV B,#4
MUL AB
ADD A,Row
MOV KeyValue,A
AJMP LOOP
Decode: ;将计算出的键值进行译码
MOV DPTR,#DisplayCodeTable
MOVC A,@A+DPTR
MOV DisplayCode,A
AJMP SHOW
DisplayCodeTable:
DB 3FH ; 显示数字“0”
DB 06H ; 显示数字“1”
DB 5BH ; 显示数字“2”
DB 4FH ; 显示数字“3”
DB 66H ; 显示数字“4”
DB 6DH ; 显示数字“5”
DB 7DH ; 显示数字“6”
DB 07H ; 显示数字“7”
DB 7FH ; 显示数字“8”
DB 6FH ; 显示数字“9”
DB 77H
DB 7CH
DB 39H
DB 5EH
DB 79H
DB 71H
DB 00H
Delay1:
MOV R7,#2
DJNZ R7,$
AJMP PEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -