?? 電機控制.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 + -