?? zidongsj.txt
字號:
A8255 EQU 0FF7CH ;A口位選碼 0/1/2/3鍵盤掃描
B8255 EQU 0FF7DH ;B口段位碼
C8255 EQU 0FF7EH ;C口輸入 0/1/2/3鍵盤掃描
D8255 EQU 0FF7FH ;控制口
JIANZHI EQU 21H ;GETKEY獲得的鍵值存儲空間
SAOM1 EQU 22H ;掃描1
SAOM2 EQU 23H ;掃描2
BIJIAO EQU 24H ;判斷當前位置與設定值得大小
TOP BIT 00H ;是否上升到頂端
BOTTOM BIT 01H ;是否下降到底端
UPING BIT 02H ;上升狀態
DOWNING BIT 03H ;下降狀態
MTD EQU 77H ;C51中發往24C02數據存儲單元首址(用于存儲24C02內存儲單元首址)
;不論往24C02寫數據還是讀數據都應該先向24C02寫入一個24C02內存儲單元首址的字節
MRD EQU 78H ;C51中接收24C02數據存儲單元首址
NUMBYT EQU 70H ;讀寫24C02字節個數
SLA EQU 10H ;24C02中讀寫存儲單元首址
CUNZUS EQU 33H ;存儲組數
SLAW EQU 0A0H ;24C02寫地址
SLAR EQU 0A1H ;24C02讀地址
VSDA EQU P1.6 ;串行傳輸數據線
VSCL EQU P1.7 ;串行傳輸時鐘線
;78h,79h,7ah實時顯示國旗位置
;7dh,7eh,7fh顯示輸入的要到達的位置
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 0013H
LJMP INTEX1 ;外部中斷1,負脈沖時計圈數
MAIN: MOV SP,#60H
MOV A,#89H
MOV DPTR,#D8255
MOVX @DPTR,A
;LCALL DIS8SHAN
LCALL CLEARMEN
MOV MTD,#10H
LCALL RDE2PROM
MOV 43H,78H
MOV 42H,79H
MOV 41H,7AH
WAIT: LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0AH,KEYB
JB TOP,WAIT
LCALL UP ; 調上升子程序
SJMP WAIT
KEYB: CJNE A,#0BH,KEYC
JB BOTTOM,WAIT
LCALL DOWN ;調下降子程序
SJMP WAIT
KEYC: CJNE A,#0CH,KEYD
LCALL BANQI ;調半旗程序
SJMP WAIT
KEYD: CJNE A,#0DH,KEYF
LCALL AUTO ;調自動程序
SJMP WAIT
KEYF: CJNE A,#0FH,WAIT ;F鍵復位
AJMP MAIN
CLEARMEN:MOV A,#00H
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV 24H,A
MOV 25H,A
MOV 26H,A
MOV 27H,A
MOV 28H,A
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 60H,#00H
MOV 61H,#00H
MOV 62H,#00H
MOV 7BH,#12H
MOV 7CH,#12H
MOV 7DH,#12H
MOV 7EH,#12H
MOV 7FH,#12H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
SETB ET0
SETB EX1
SETB IT1
SETB EA
RET
;-----------------------------
; 上升子程序
;-----------------------------
UP:
SETB UPING ;上升過程
ULOP: LCALL ZTIAO
; CLR P1.1
; LCALL DIS
LCALL MUSIC
MOV A,78H
CJNE A,#00H,ULOP
MOV A,79H
CJNE A,#07H,ULOP
MOV A,7AH
CJNE A,#05H,ULOP
SETB TOP;上升到最高點,置標志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制動
CLR P1.0
LCALL DL1
;SETB P1.1
SETB P1.0
RET
;------------------------
; 下降子程序
;------------------------
DOWN:
SETB DOWNING ;下降過程
MOV P1,#0FFH
DLOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,#00H,DLOP
MOV A,79H
CJNE A,#00H,DLOP
MOV A,7AH
CJNE A,#00H,DLOP
SETB BOTTOM ;到最低點,置標志位
CLR TOP
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制動
CLR P1.1
LCALL DL1
MOV P1,#0FFH ;停止
RET
;----------------------
; 半旗子程序
;----------------------
BANQI: CLR P1.3
LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0AH,BQLOPD
LCALL UP
SETB DOWNING ;下降過程
BDLOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,#00H,BDLOP
MOV A,79H
CJNE A,#00H,BDLOP
MOV A,7AH
CJNE A,#06H,BDLOP
SETB BOTTOM ;到最低點,置標志位
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制動
CLR P1.1
LCALL DL1
MOV P1,#0FFH
SJMP BANQI
BQLOPD: CJNE A,#0BH,BANQI
SETB UPING ;上升過程
BULOP: CLR P1.1
LCALL DIS
MOV A,78H
CJNE A,#00H,BULOP
MOV A,79H
CJNE A,#01H,BULOP
MOV A,7AH
CJNE A,#00H,BULOP
SETB TOP ;上升到最高點,置標志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制動
CLR P1.0
LCALL DL1
MOV P1,#0FFH ;停止
LCALL DOWN
RET
;--------------------------------
;自動子程序
;--------------------------------
AUTO: LCALL GETKEY
MOV 7DH,JIANZHI
LCALL GETKEY
MOV 7EH,JIANZHI
LCALL GETKEY
MOV 7FH,JIANZHI
LCALL GETKEY
MOV A,JIANZHI
CJNE A,#0EH,BACK
LCALL CMP
LCALL DIS
MOV A,26H
CJNE A,#01H,EXT0
LCALL ZHENG
JMP EXT2
EXT0: CJNE A,#02H,EXT2
LCALL FAN
JMP EXT2
EXT2: MOV P1,#0FFH
RET
BACK: MOV 7DH,#00H
MOV 7EH,#00H
MOV 7FH,#00H
JMP AUTO
RET
CMP: MOV A,78H
SUBB A,7DH
JC QEXT
MOV A,78H
CJNE A,7DH,NEXT1
MOV A,79H
SUBB A,7EH
JC QEXT
MOV A,79H
CJNE A,7EH,NEXT1
MOV A,7AH
SUBB A,7FH
JC QEXT
MOV A,7AH
CJNE A,7FH,NEXT1
MOV 26H,#00H
SJMP QE
QEXT: MOV 26H,#01H
SJMP QE
NEXT1: MOV 26H,#02H
QE: RET
ZHENG: SETB UPING ;上升過程
UOP: CLR P1.1
LCALL DIS
MOV A,78H
CJNE A,7DH,UOP
MOV A,79H
CJNE A,7EH,UOP
MOV A,7AH
CJNE A,7FH,UOP
SETB TOP;上升到最高點,置標志位
CLR BOTTOM
CLR UPING
CLR DOWNING
SETB P1.1 ;反向制動
CLR P1.0
LCALL DL1
MOV P1,#0FFH ;停止
RET
FAN: SETB DOWNING ;下降過程
MOV P1,#0FFH
DOP: CLR P1.0
LCALL DIS
MOV A,78H
CJNE A,7DH,DOP
MOV A,79H
CJNE A,7EH,DOP
MOV A,7AH
CJNE A,7FH,DOP
SETB BOTTOM ;到最低點,置標志位
CLR TOP
CLR DOWNING
CLR UPING
SETB P1.0 ;反向制動
CLR P1.1
LCALL DL1
MOV P1,#0FFH ;停止
RET
TINGZHI:SETB P1.1
SETB P1.0
LCALL DELAY
RET
;------------------------------
;外部中斷1,將高度存在78-7AH中
;------------------------------
INTEX1: PUSH ACC
PUSH PSW
CLR EX1
INC 40H
LLLU: MOV A,40H
CJNE A,#01H,LLL ;數脈沖,滿1厘米
MOV 40H,#00H
JNB UPING,LLLD
INC 41H
MOV A,41H
CJNE A,#0AH,LLL
MOV 41H,#00H
INC 42H
MOV A,42H
CJNE A,#0AH,LLL
MOV 42H,#00H
INC 43H
MOV A,43H
CJNE A,#0AH,LLL
MOV 43H,#00H
LLLD: JNB DOWNING,LLL
DEC 41H
MOV A,41H
CJNE A,#0FFH,LLL
MOV 41H,#09H
DEC 42H
MOV A,42H
CJNE A,#0FFH,LLL
MOV 42H,#09H
DEC 43H
MOV A,43H
CJNE A,#0FFH,LLL
MOV 41H,#00H ;減至負數,賦0
MOV 42H,#00H
MOV 43H,#00H
LLL: MOV 7AH,41H
MOV 79H,42H
MOV 78H,43H
SETB EX1
POP PSW
POP ACC
RETI
NOP
NOP
NOP
INTT0: INC 25H ;中斷服務,中斷計數器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
;-------------------------------------------------------------------------
GETKEY: ;最終鍵值存在21H(JIANZHI)中(0---F)
MOV A,#89H
MOV DPTR,#D8255
MOVX @DPTR,A
MOV SAOM1,#016H
YX1: MOV SAOM2,#04FH
KEY1: ACALL KS1 ;掃描有無鍵按下
JNZ LK2 ;有轉LK2
;---------------------------------------
ACALL DIS ;調顯示程序
;---------------------------------------
DJNZ SAOM2,KEY1 ;SM2(23H)為控制掃描次數
DJNZ SAOM1,YX1 ;SM1(22H)為控制掃描次數
SJMP KEY1 ;無鍵始終掃描
;---------------------------------------
LK2: MOV R2,#0FEH ;有鍵行掃描
MOV R7,#00H
LK4: MOV DPTR,#A8255 ;A口地址
MOV A,R2
MOVX @DPTR,A
MOV DPTR,#C8255 ;C口地址
MOVX A,@DPTR ;讀C口
JB ACC.0,LONE ;不是A.0轉移
MOV A,#00H
AJMP LKP
LONE: JB ACC.1,LTWO ;不是A.1轉移
MOV A,#01H
AJMP LKP
LTWO: JB ACC.2,LTHR ;不是A.2轉移
MOV A,#02H
AJMP LKP
LTHR: JB ACC.3,NEXT ;不是A.3轉移
MOV A,#03H
LKP: ADD A,R7
PUSH ACC
;---------------------------------------
LK3: ACALL DIS ;是否還按鍵/是一直調顯示程序
ACALL KS1
JNZ LK3
;---------------------------------------
POP ACC
MOV R0,#JIANZHI ;鍵值存在JIANZHI(21H)中
MOV @R0,A
RET
NEXT: INC R7
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -