📄 dc motor1.asm
字号:
;4*4行列键盘及8位LED数码管程序,LED采用2片164译码,占用3个I/O口,键盘采用线扫描法。
;IT0用于控制脉冲频率;IT1用于控制占空比
;TH0,TL0:(65535-X)*2*10(-6)=T (12MHz) 默认为f=20Hz ,T=50ms ,TH0=0x9e,TL0=0x57
;共分了10个挡,由0~9十个数字键控制,默认占空比为10%,即高电平时间为50ms/10=5ms,TH1=0xf6,TL1=0x3b
LED EQU 30H ;30H~37H为显存
KEY EQU 38H ;KEY为键号
DANG EQU 39H ;
R_NH EQU 3AH ;
R_NL EQU 3BH
SPEED EQU 32H
R_E EQU 20H.0 ;
ORG 0000H
LJMP START
ORG 000BH
AJMP IT0R
ORG 001BH
AJMP IT1R
IT0R:
CLR TR0
MOV TH0,#9EH
MOV TL0,#57H
SETB P2.3
SETB TR0
SETB TR1
RETI
IT1R:
CLR TR1
MOV TH1,R_NH
MOV TL1,R_NL
CLR P2.3
RETI
START: ; 程序初始化
MOV SP,#60H
CLR R_E
CLR P2.0
CLR P2.1
CLR P2.3
MOV R0,#LED ;使8个LED处于全灭状态(无数据)
MOV R1,#8
MOV A,#0FFH
START1:
MOV @R0,A
INC R0
DJNZ R1,START1
MOV R_NH,#0F6H
MOV R_NL,#3BH
MOV TMOD,#11H
MOV TH0,#9EH
MOV TL0,#57H
MOV TH1,#0F6H
MOV TL1,#3BH
MOV DANG,#1
MOV 32H,#0
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV 36H,#0
SETB ET0
SETB ET1
SETB EA
MAIN:
MOV P1,#0F0H ;键盘初始化
ACALL CHECK ;检测是否有键按下
JNZ WAIT_KEY ;若有键,则进行去抖处理
ACALL DISP ;调用显示子程序
SJMP MAIN
WAIT_KEY:
ACALL DISP ;去抖处理
ACALL DELAY
CLR A
ACALL CHECK
JNZ FINDKEY ;若有键按下,则转入计算键号
SJMP MAIN ;
CHECK:
MOV A,P1 ;按键检测
CPL A
ANL A,#0F0H
SWAP A
RET
FINDKEY: ;计算键号
MOV R0,#00H
CLR C
CR1:
RRC A
INC R0
JNC CR1
DEC R0 ;得出第几行
MOV A,R0
MOV B,#04
MUL AB
MOV R1,A ;得出行号
MOV P1,#0FEH ;利用线扫描法求列号
ACALL CHECK
JNZ K1
MOV P1,#0FDH
ACALL CHECK
JNZ K2
MOV P1,#0FBH
ACALL CHECK
JNZ K3
MOV P1,#0F7H
ACALL CHECK
JNZ K4
AJMP MAIN
K1:
MOV A,#00H ;计算列号
AJMP KEND
K2:
MOV A,#01H
AJMP KEND
K3:
MOV A,#02H
AJMP KEND
K4:
MOV A,#03H
KEND:
ADD A,R1
MOV KEY,A ;得出键号,放入KEY
ACALL INIT_KEY
K15: ;根据键号转入对应的处理程序
CJNE A,#15,K14
AJMP FUN15
K14:
CJNE A,#14,K13
AJMP FUN14
K13:
CJNE A,#13,K12
AJMP FUN13
K12:
CJNE A,#12,K11
AJMP FUN12
K11:
CJNE A,#11,K10
AJMP FUN11
K10:
CJNE A,#10,K09
AJMP FUN10
K09:
CJNE A,#9,K08
AJMP FUN9
K08: ACALL KEY_NUM
AJMP WAIT_KEY_UP
FUN15:
NOP
AJMP WAIT_KEY_UP
FUN14:
NOP
AJMP WAIT_KEY_UP
FUN13:
DEC R_NL
MOV A,R_NL
CJNE A,#0FFH,A1
DEC R_NH
A1:MOV A,R_NH
CJNE A,#0,A2
MOV A,R_NL
CJNE A,#0,A2
CLR TR0
CLR TR1
CLR P2.3
CLR R_E
A2:ACALL GETSPEED
AJMP WAIT_KEY_UP
FUN12:
INC R_NL
MOV A,R_NL
CJNE A,#0,B1
INC R_NH
B1:MOV A,R_NH
CJNE A,#9EH,B2
MOV A,R_NL
CJNE A,#57H,B2
MOV R_NH,#9EH
MOV R_NL,#57H
B2:ACALL GETSPEED
AJMP WAIT_KEY_UP
FUN11:
NOP
AJMP WAIT_KEY_UP
FUN10:
JB R_E,C1
SETB TR0
SETB TR1
SETB R_E
MOV A,DANG
CJNE A,#0AH,C2
MOV DANG,#1
C2:ACALL GETSPEED
AJMP WAIT_KEY_UP
C1:CLR R_E
CLR TR1
CLR TR0
CLR P2.3
MOV LED,#0FH
MOV SPEED,#0
MOV SPEED+1,#0
MOV SPEED+2,#0
MOV SPEED+3,#0
MOV SPEED+4,#0
AJMP WAIT_KEY_UP
FUN9:
CLR TR1
CLR TR0
SETB R_E
SETB P2.3
MOV DANG,#0AH
MOV SPEED,#0FH
MOV SPEED+1,#0FH
MOV SPEED+2,#0FH
MOV SPEED+3,#0FH
MOV SPEED+4,#0FH
AJMP WAIT_KEY_UP
KEY_NUM:
MOV A,KEY
MOV DANG,A
INC DANG
PUSH A
MOV DPTR,#SPEEDH
MOVC A,@A+DPTR
MOV R_NH,A
POP A
MOV DPTR,#SPEEDL
MOVC A,@A+DPTR
MOV R_NL,A
ACALL GETSPEED
AJMP WAIT_KEY_UP
INIT_KEY:
RET
WAIT_KEY_UP: ;等待键起
ACALL DISP
ACALL CHECK ;不断调用DISP,直到键起
JZ COMBACK
SJMP WAIT_KEY_UP
COMBACK:AJMP MAIN
DISP1:
MOV LED,#0FH
AJMP DIS
DISP:
JNB R_E,DISP1
MOV LED,DANG ;显示子程序
DIS:MOV R1,#00H
MOV R2,#08H
MOV R5,#7FH
LOOP:MOV R0,#LED ;动态显示LED
MOV A,R0
ADD A,R1
MOV R0,A
MOV A,@R0
ACALL SENDDATA
MOV A,R5
RR A
MOV R5,A
INC R1
ACALL DELAY
DJNZ R2,LOOP
CLR P2.2
SETB P2.2
RET
DELAY:MOV R6,#10H ;延时
DELAY1:
MOV R7,#1FH
DJNZ R7,$
DJNZ R6,DELAY1
RET
SENDDATA:
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
CJNE R1,#03,S1
ORL A,#80H
S1:MOV B,R5
SENDDATA1:
MOV R3,#08
SEND1:RRC A
MOV P2.2,C
PUSH A
MOV A,B
RRC A
MOV P2.1,C
MOV B,A
POP A
CPL P2.0
CPL P2.0
DJNZ R3,SEND1
RET
GETSPEED:
CLR C
MOV R7,R_NL
MOV R6,R_NH
MOV A,#0FFH
SUBB A,R6
MOV R6,A
MOV A,#0FFH
SUBB A,R7
MOV R7,A
MOV B,#2
MUL AB
MOV R7,A
MOV A,R6
PUSH B
MOV B,#2
MUL AB
POP B
ADD A,B
MOV R6,A
CLR C
MOV B,#16
CLR A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H
HB3:
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A
DJNZ R2,HB3
MOV A,R5
ANL A,#0FH
MOV SPEED+4,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV SPEED+3,A
MOV A,R4
ANL A,#0FH
MOV SPEED+2,A
MOV A,R4
ANL A,#0F0H
SWAP A
MOV SPEED+1,A
MOV SPEED,R3
RET
LEDCODE:
DB 3FH
DB 06H,5BH,4FH
DB 66H,6DH
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H
SPEEDH:
DB 0F6H,0ECH,0E2H,0D8H,0CFH,0C5H,0BBH,0B1H,0A8H,9EH
SPEEDL:
DB 3BH,77H,0B3H,0EFH,2BH,67H,0A3H,0DFH,1BH,57H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -