📄 tiaoshi7.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 ;显示数值个位存贮变量
LSCOUNT1 EQU 48H ;步进电机1左转点动计数
RSCOUNT1 EQU 49H ;步进电机1右转点动计数
LSCOUNT2 EQU 4AH ;步进电机2左转点动计数
RSCOUNT2 EQU 4BH ;步进电机2右转点动计数
ORG 0
SJMP Start
Start:
MOV SP,#5FH ;初始化程序
MOV DisplayCode,#00H ;设定初始不显示
MOV ScanCode,#0EFH ;设定扫描顺序
MOV ScanCount,#5
MOV P2,#00H
MOV R2,#02H
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:
MOV LSCOUNT1,#00H
MOV RSCOUNT1,#00H
MOV LSCOUNT2,#00H
MOV RSCOUNT2,#00H
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,#02H ;清除显示缓存区内数据
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 MOTORCICLE1
MOV A,DisplayCode
XRL A,#7CH
JZ CLEA
MOV A,DisplayCode
XRL A,#39H
JZ DIANDONG
MOV A,DisplayCode
XRL A,#5EH
JNZ YUMEN
AJMP MOTORCICLE2
YUMEN: 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: DEC R2
;INC R2
MOV A,R2
JZ JACKY
AJMP Notkey ;小数点显示
;CJNE R2,#02H,Notkey
JACKY: MOV A,DisplayCode
ADD A,#80H
MOV DisplayBuffer+3,A
AJMP NotKey
DIANDONG: JNB P1.4,PANDIN1
JNB P1.5,PANDIN2
JNB P1.6,PANDIN3
JNB P1.7,PANDIN4
AJMP DIANDONG
PANDIN1: INC RSCOUNT1
AJMP RIGHTTURN1
PANDIN2: INC LSCOUNT1
AJMP LEFTTURN1
PANDIN3: INC LSCOUNT2
AJMP LEFTTURN2
PANDIN4: INC RSCOUNT2
AJMP RIGHTTURN2
MOTORCICLE1:
MOV TMOD ,#00000001B
LEFTTURN1: MOV QIANWEI,KeyvaluBuffer ;电机1左转驱动程序
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0F0H
MOV TL0,#0FFH
SETB TR0
PULSE1: MOV A,GEWEI
JZ TELI4
JNB TF0,$
CLR TF0
CPL P1.0
MOV TH0,#0F0H
MOV TL0,#0FFH
DEC GEWEI
AJMP PULSE1
TELI4: MOV GEWEI,#9
MOV A,SHIWEI
JZ TELI1
DEC SHIWEI
AJMP PULSE1
TELI1: MOV SHIWEI,#9
MOV A,BAIWEI
JZ TELI2
DEC BAIWEI
AJMP PULSE1
TELI2: MOV BAIWEI,#9
MOV A,QIANWEI
JNZ FENXI1
MOV A,LSCOUNT1
CJNE A,#01H, RIGHTTURN1
CLR TR0
AJMP Notkey
FENXI1: DEC QIANWEI
AJMP PULSE1
NOP
NOP
NOP
RIGHTTURN1: CPL P1.1 ;电机1右转驱动程序
MOV QIANWEI,KeyvaluBuffer
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0F0H
MOV TL0,#0FFH
SETB TR0
PULSE2: MOV A,GEWEI
JZ COMU1
JNB TF0,$
CLR TF0
CPL P1.0
MOV TH0,#0F0H
MOV TL0,#0FFH
DEC GEWEI
AJMP PULSE2
COMU1: MOV GEWEI,#9
MOV A,SHIWEI
JZ COMU2
DEC SHIWEI
AJMP PULSE2
COMU2: MOV SHIWEI,#9
MOV A,BAIWEI
JZ COMU3
DEC BAIWEI
AJMP PULSE2
COMU3: MOV BAIWEI,#9
MOV A,QIANWEI
JNZ FENXI2
MOV A,RSCOUNT1
CJNE A,#00H,FAINT
CPL P1.1
AJMP MOTORCICLE1
FAINT: CPL P1.1
CLR TR0
AJMP Notkey
FENXI2: DEC QIANWEI
AJMP PULSE2
MOTORCICLE2:
MOV TMOD ,#00000001B
LEFTTURN2: MOV QIANWEI,KeyvaluBuffer ;电机2左转驱动程序
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0F0H
MOV TL0,#0FFH
SETB TR0
WAVE1: MOV A,GEWEI
JZ HAI4
JNB TF0,$
CLR TF0
CPL P1.2
MOV TH0,#0F0H
MOV TL0,#0FFH
DEC GEWEI
AJMP WAVE1
HAI4: MOV GEWEI,#9
MOV A,SHIWEI
JZ HAI1
DEC SHIWEI
AJMP WAVE1
HAI1: MOV SHIWEI,#9
MOV A,BAIWEI
JZ HAI2
DEC BAIWEI
AJMP WAVE1
HAI2: MOV BAIWEI,#9
MOV A,QIANWEI
JNZ FENXI3
MOV A,LSCOUNT2
CJNE A,#01H, RIGHTTURN2
CLR TR0
AJMP Notkey
FENXI3: DEC QIANWEI
AJMP WAVE1
NOP
NOP
NOP
RIGHTTURN2: CPL P1.3 ;电机2右转驱动程序
MOV QIANWEI,KeyvaluBuffer
MOV BAIWEI,KeyvaluBuffer+1
MOV SHIWEI,KeyvaluBuffer+2
MOV GEWEI,KeyvaluBuffer+3
MOV TH0,#0F0H
MOV TL0,#0FFH
SETB TR0
WAVE2: MOV A,GEWEI
JZ JUN1
JNB TF0,$
CLR TF0
CPL P1.2
MOV TH0,#0F0H
MOV TL0,#0FFH
DEC GEWEI
AJMP WAVE2
JUN1: MOV GEWEI,#9
MOV A,SHIWEI
JZ JUN2
DEC SHIWEI
AJMP WAVE2
JUN2: MOV SHIWEI,#9
MOV A,BAIWEI
JZ JUN3
DEC BAIWEI
AJMP WAVE2
JUN3: MOV BAIWEI,#9
MOV A,QIANWEI
JNZ FENXI4
MOV A,RSCOUNT2
CJNE A,#00H,CHENG
CPL P1.3
AJMP MOTORCICLE2
CHENG: CPL P1.3
CLR TR0
AJMP Notkey
FENXI4: DEC QIANWEI
AJMP WAVE2
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 + -