📄 电机控制.asm
字号:
MOV 35H,#0FH ;33H为(n)偏移量
MOV R2,#4 ;显示数字的字数
ACALL DISP2 ;调用半角字符显示
RET
DIS1: MOV 34H,#1AH ;33H为"("字偏移量
MOV 37H,#1CH ;33H为")"字偏移量
MOV R2,#6
ACALL DISP1
RET
;========================================
;字符显示子程序
DISP1: MOV A,@R0 ;送偏高位偏移量
MOV DPTR,#TAB ;置表头地址
MOVC A,@A+DPTR ;查表得到字符代码
MOV DAT,A ;送汉字码址表高位
ACALL WRD ;写入第一字节数据
MOV A,@R0 ;送偏高位偏移量
ADD A,#1 ;加1得到低位偏移量
MOVC A,@A+DPTR ;查表得到字符代码
MOV DAT,A ;送汉字码址表低位
ACALL WRD ;写入第二字节数据
INC R0 ;取下一个字符地址
DJNZ R2,DISP1 ;判断是否显示满
MOV R0,#32H ;重赋显示单元起始地址
RET
;=================================
;半宽字符显示子程序
DISP2: MOV A,@R0 ;送偏偏移量
MOV DPTR,#TAB ;置表头地址
MOVC A,@A+DPTR ;查表得到字符代码
MOV DAT,A ;送汉字码址表高位
ACALL WRD ;写入第一字节数据
INC R0 ;取下一个字符地址
DJNZ R2,DISP2 ;判断是否显示满
MOV R0,#32H ;重赋显示单元起始地址
RET
;==================================
;写指令子程序
WRI: PUSH ACC
CLR RS
SETB RW
WRI1: MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,WRI1
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;==================================
;写数据子程序
WRD: PUSH ACC
CLR RS
SETB RW
WRD1: MOV P0,#0FFH
SETB E
MOV A,P0
CLR E
JB ACC.7,WRD1
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
;==================================
WAIT: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值
;键盘扫描子程序
MOV P1,#0FFH ;P1口送高电平
CLR P1.0 ;第一行清零
MOV A,P1 ;读P1口
ANL A,#0F0H ;低位屏蔽
XRL A,#0F0H ;判断低位是否有低电平 ,即判断是否有按键按下
JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描
LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下
MOV A,P1 ;继续读P1口
ANL A,#0F0H ;判断低位是否有低电平
CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1
MOV KEYBUF,#0 ;否者判断为0号键
AJMP DK ;转DK1查表程序
NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2
MOV KEYBUF,#1 ;否者判断为1号键
AJMP DK ;转DK2查表程序
NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3
MOV KEYBUF,#2 ;否者判断为2号键
AJMP DK ;转DK3查表程序
NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H就转到NK4
AJMP QI_OR_TING
NK4: NOP
NOKEY1: MOV P1,#0FFH ;和上面相同
CLR P1.1
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
LCALL DELY10MS
MOV A,p1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY2
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK5
MOV KEYBUF,#3
AJMP DK
NK5: CJNE A,#0D0H,NK6
MOV KEYBUF,#4
AJMP DK
NK6: CJNE A,#0B0H,NK7
MOV KEYBUF,#5
AJMP DK
NK7: CJNE A,#70H,NK8
MOV KEYBUF,#6 ;否者判断为3号键
AJMP DK ;转DK4查表程序
NK8: NOP
NOKEY2: MOV P1,#0FFH
CLR P1.2
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY3
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK9
MOV KEYBUF,#7
AJMP DK
NK9: CJNE A,#0D0H,NK10
MOV KEYBUF,#8
AJMP DK
NK10: CJNE A,#0B0H,NK11
MOV KEYBUF,#9
AJMP DK
NK11: CJNE A,#70H,NK12
AJMP SHE_DING
NK12: NOP
NOKEY3: MOV P1,#0FFH
CLR P1.3
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
LCALL DELY10MS
MOV A,P1
ANL A,#0F0H
XRL A,#0F0H
JZ NOKEY4
MOV A,P1
ANL A,#0F0H
CJNE A,#0E0H,NK13
AJMP JIA_SU
NK13: CJNE A,#0D0H,NK14
AJMP JIAN_SU
NK14: CJNE A,#0B0H,NK15
AJMP ZHENG_OR_FAN
NK15: CJNE A,#70H,NK16
AJMP QING_CHU
NK16: NOP
;=======================================================
;查表求键值程序
DK: MOV A,KEYBUF ;查表程序 查对应的键号数据
MOV DPTR,#TABLE ;把表头地址放入DPTR
MOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据
DJNZ R1,DK1
MOV R1,#1
AJMP DKA
DK1: MOV 4BH,4CH
MOV 4CH,4DH
MOV 4DH,4EH
MOV 4EH,4FH
MOV 4FH,A
MOV DPTR,#SD_KAI
MOV A,SDJ
JMP @A+DPTR
DKA: MOV A,P1 ;读P1口
ANL A,#0F0H ;屏蔽高四位
XRL A,#0F0H ;地位是有低电平
JNZ DKA ;如果有低电平继续读P1口,否者向下执行,查找第二行
NOKEY4: RET
SD_KAI: AJMP DKA
AJMP SDK
SDK: MOV COM,#92H ;DD RAM 地址-----10010010,即第二行显示第三个字的地址
ACALL WRI
MOV 32H,#0AH ;32H为(:)偏移量
MOV 33H,4BH
MOV 34H,4CH
MOV 35H,4DH
MOV 36H,4EH
MOV 37H,4FH
MOV R2,#6
ACALL DISP2
AJMP DKA
;===================================
;功能按键功能设定
;启动和停止键:按奇次为启动,按偶次为停止
QI_OR_TING:
CLR P2.2 ;开电源
INC R3
MOV A,R3
CJNE A,#2,DONG ;判断按键奇偶次
MOV R3,#0
SETB P2.2 ;关电源
TING: MOV LEN,#0
MOV BI_JIAO,#0 ;关设定比较和显示
MOV COM,#90H ;DD RAM 地址-----10010000,即第二行显示单元起始地址
ACALL WRI
MOV 32H,#30H ;32H为"关"字偏移量
MOV 33H,#32H ;33H为"闭"字偏移量
ACALL DIS
MOV COM,#9BH ;DD RAM 地址-----10011011,即第四行显示第四个字的地址
ACALL WRI
MOV 32H,#28H ;32H为"停"字偏移量
MOV 33H,#2AH ;33H为"止"字偏移量
MOV R2,#2
ACALL DISP1
AJMP DKA
DONG: MOV LEN,#15 ;置高电平比例初值
MOV COM,#9BH ;DD RAM 地址-----10011011,即第四行显示第四个字的地址
ACALL WRI
MOV 32H,#2CH ;32H为"运"字偏移量
MOV 33H,#2EH ;33H为"行"字偏移量
MOV R2,#2
ACALL DISP1
AJMP DKA
;设定键:按奇次为开设定,按偶次为设定
SHE_DING:INC SDJPD ;SDJPD为设定键奇偶判值断存储单元
MOV A,SDJPD ;SDJ为设定键是否调用功能子程序偏仪量存储单元
CJNE A,#2,SD1 ;BI_JIAO设定时的是否比较调用子程序偏移量存储单元
MOV SDJPD,#00H
MOV SDJ,#0
MOV BI_JIAO,#2
MOV R1,#6
AJMP DKA
SD1: MOV SDJ,#2
MOV BI_JIAO,#0
MOV COM,#90H ;DD RAM 地址-----10010000,即第二行显示单元起始地址
ACALL WRI
MOV 32H,#14H ;32H为"设"字偏移量
MOV 33H,#16H ;33H为"定"字偏移量
MOV R2,#2
ACALL DISP1
AJMP DKA
;加速键:按下时连续加
JIA_SU: MOV A,LEN
ADD A,#1
CJNE A,#101,JIA_HUI1
MOV LEN,#100
AJMP NOKEY4
JIA_HUI1:MOV LEN,A
AJMP NOKEY4
;减速键:按下时连续减
JIAN_SU: CLR C
MOV A,LEN
SUBB A,#1
CJNE A,#0FFH,JIAN_HUI
MOV LEN,#0
AJMP NOKEY4
JIAN_HUI:MOV LEN,A
AJMP NOKEY4
;正反转键:奇次正转,偶次反转
ZHENG_OR_FAN:
CPL P2.0
AJMP DKA
QING_CHU:MOV BI_JIAO,#0
MOV SDJPD,#00H
MOV COM,#90H ;DD RAM 地址-----10010000,即第二行显示单元起始地址
ACALL WRI
MOV 32H,#30H ;32H为"关"字偏移量
MOV 33H,#32H ;33H为"闭"字偏移量
MOV R2,#2
ACALL DISP1
CLR A
MOV 33H,A
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A
MOV 4BH,A
MOV 4CH,A
MOV 4DH,A
MOV 4EH,A
MOV 4FH,A
MOV COM,#92H ;DD RAM 地址-----10010010,即第二行显示第三个字的地址
ACALL WRI
MOV 32H,#0AH ;32H为(:)偏移量
MOV R2,#6
ACALL DISP2
MOV R1,#6
MOV BI_JIAO,#00H
AJMP DKA
;==================================
;延时子程序
DELAY: MOV R7,#0FFH
DELAY4: MOV R6,#00FH
LOOP2: DJNZ R6,LOOP2
DJNZ R7,DELAY4
RET
;键盘延时程序和查表表格
DELY10ms:MOV R6,#20 ;延时10毫秒
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET
TABLE: DB 07H, 04H, 01H ;启/停 本表格是以键盘为参考 7 8 9 加速
DB 08H, 05H, 02H, 00H ; 4 5 6 减速
DB 09H, 06H, 03H ;设定 1 2 3 正反转
DB;加速 减速 正反转 清除 启/停 0 设定 清除
;==================================
;半宽字符码和字符码
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H ;(0,1,2,3,4,5,6,7,8,9)16*8半宽字符
DB 3AH,20H,2FH,69H,6DH,6EH ;(:, ,/,i,m,n)16*8半宽字符
DB 0D7H,0AAH, 0CBH,0D9H, 0C9H,0E8H, 0B6H,0A8H ;(转,速,设,定)
DB 0CFH,0F2H, 0A1H,0B2H, 0A1H,0B3H, 0A1H,0A0H ;(向,( , ), )
DB 0D5H,0FDH, 0B7H,0B4H, 0D7h,0B4h, 0CCH,0ACH ;(正,反,状,态)
DB 0CDH,0A3H, 0D6H,0B9H, 0D4h,0CBH, 0D0H,0D0H ;(停,止,运,行)
DB 0B9H,0D8H, 0B1H,0D5H ;(关,闭)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -