?? zidongsj.txt
字號:
INC R7
INC R7
INC R7
MOV A,R2
JNB ACC.3,KND
RL A
MOV R2,A
AJMP LK4
KND: AJMP KEY1 ;無鍵按下一直掃描
;---------------------------------------
;---------------------------------------
KS1: MOV DPTR,#A8255 ;鍵盤全掃描
MOV A,#00H
MOVX @DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR
CPL A
ANL A,#0FFH
NOP
NOP
RET
;----------------------------------
DIS8SHAN: ;開機自檢 8閃現3次
MOV R0,#03
LP2: MOV 78H,#08H
MOV 79H,#08H
MOV 7AH,#08H
MOV 7bH,#08H
MOV 7CH,#08H
MOV 7DH,#08H
MOV 7EH,#08H
MOV 7FH,#08H
LCALL DIS
LCALL DIS
LCALL DIS
LCALL DIS
LCALL DISLED
DJNZ R0,LP2
RET
;-------------------------------------------------------------
DIS: SETB RS1 ;顯示子程序
CLR RS0
MOV R0,#78H
DS0: MOV R3, #0FEH
MOV A,R3
DS1:
MOV DPTR,#0FF7CH
MOVX @DPTR,A
INC DPTR
MOV A,@R0
ADD A,#1FH
MOVC A,@A+PC
MOVX @DPTR,A
NOP
NOP
ACALL DL1
;NOP
;NOP
INC R0
MOV A,R3
NOP
JNB ACC.7,LD1
NOP
RL A
MOV R3,A
;NOP
;NOP
AJMP DS1
;NOP
;NOP
AJMP MAIN
LD1: CLR RS1
MOV MTD,#10H
LCALL WRE2PROM
RET
NOP
NOP
AJMP MAIN
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH ;0,1,2,3,4,5,6,7,8
DB 6FH,77H,7CH,39H,5EH,79H,71H,1EH,31H,00H,3EH ;9,A,B,C,D,E,F,J,R,滅,U
DL1: MOV R7,#04H
DL: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R7,DL
NOP
NOP
RET
NOP
NOP
LJMP MAIN
DISLED:MOV 78H,#12H ;8位滅顯
MOV 79H,#12H
MOV 7AH,#12H
MOV 7bH,#12H
MOV 7CH,#12H
MOV 7DH,#12H
MOV 7EH,#12H
MOV 7FH,#12H
LCALL DIS
LCALL DELAY
RET
DELAY: MOV R1,#03H ;延時子程序
DELAY2:
PUSH 0 ;保存現場
PUSH 1
MOV 0,#0H
DELAY1:
MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢復現場
POP 0
DJNZ R1,DELAY2
RET
;---------------------------------------
;I2C總線使用軟件包
;---------------------------------------
WRE2PROM:
PUSH DPH
PUSH DPL
PUSH ACC
MOV SLA,#SLAW
MOV NUMBYT,#04H
LCALL WRNBYT
POP ACC
POP DPL
POP DPH
RET;---------------------------------------
RDE2PROM:
PUSH DPH
PUSH DPL
PUSH ACC
MOV SLA,#SLAW
MOV NUMBYT,#1
LCALL WRNBYT
MOV SLA,#SLAR
MOV NUMBYT,#3
LCALL RDNBYT
POP ACC
POP DPL
POP DPH
RET
STA: SETB VSDA ;啟動
SETB VSCL
NOP
NOP
CLR VSDA
NOP
NOP
CLR VSCL
RET
;----------------------------------------
STOP: CLR VSDA ;停止
SETB VSCL
NOP
NOP
SETB VSDA
NOP
NOP
CLR VSDA
CLR VSCL
RET
;----------------------------------------
MACK: CLR VSDA ;發送應答位
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
;----------------------------------------
MNACK: SETB VSDA ;發送非應答位
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
;-----------------------------------------
CACK: ;應答位檢查 正確F0為0 否則為1
SETB VSDA ;置VSDA為輸入方式
SETB VSCL ;置VSDA為數據有效
CLR F0 ;預設F0=0
MOV C,VSDA ;輸入VSDA引腳狀態
JNC CEND ;檢查VSDA引腳狀態,正常應答轉CEND,且F0為0
SETB F0 ;無正常應答,F0為1
CEND: CLR VSCL ;子程序結束使VSCL為0
RET
;----------------------------------------
WRBYT: ;寫一個字節
MOV R0,#08H ;8位數據長度送R0
WLP: RLC A ;發送數據左移 發送位進C
JC WR1 ;判斷發送1 0 發送1進WR1
AJMP WRO ;發送0進WR0
WLP1: DJNZ R0,WLP ;8位發送完?未完轉WLP
RET ;8位發送結束
WR1: SETB VSDA ;發送1程序段
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WRO: CLR VSDA ;發送0程序段
SETB VSCL
NOP
NOP
CLR VSCL
AJMP WLP1
;----------------------------------------
RDBYT: ;讀一個字節
MOV R0,#08H ;8位數據長度送R0
RLP: SETB VSDA ;置VSDA為輸入方式
SETB VSCL ;置VSDA為數據有效
MOV C,VSDA ;讀入VSDA狀態
MOV A,R2 ;讀入0程序段 由C拼裝入R2中
RLC A
MOV R2,A
CLR VSCL ;使VSCL為零 可繼續接收數據位
DJNZ R0,RLP ;8位讀完否 未讀完轉RLP
RET
;-----------------------------------------
;寫N個字節數據 MTD:發送數據緩沖區首址 SLA:寫入24C02的緩沖區首址 NUMBYT:發送數據個數
;-----------------------------------------
WRNBYT:
MOV R3,NUMBYT
LCALL STA ;啟動I2C總線
MOV A,SLA ;發送SLA字節
LCALL WRBYT
LCALL CACK ;檢查應答位
JB F0,WRNBYT ;若非應答位,則重發
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
LCALL STOP
RET
;---------------------------------------
;讀N個字節子程序 MRD:接受數據緩沖區首址 SLA:讀入24C02的緩沖區首址 NUMBYT:發送數據個數
;---------------------------------------
RDNBYT: ;讀N個字節子程序
MOV R3,NUMBYT
LCALL STA ;啟動I2C總線
MOV A,SLA ;發送尋址字節
LCALL WRBYT
LCALL CACK ;檢查應答位
JB F0,RDNBYT ;非正常應答時重新開始
RDN: MOV R1,#MRD ;接受數據緩沖區首址入R1
RDN1: LCALL RDBYT ;讀入一個字節進接受數據緩沖區
MOV @R1,A
DJNZ R3,ACK ;N個字節讀完否 未完轉ACK
LCALL MNACK ;N個字節讀完 發送非應答位/A
LCALL STOP ;發送停止信號
RET ;子程序結束
ACK: LCALL MACK ;發送應答位
INC R1 ;指向下一個接受數據緩沖區單元
SJMP RDN1 ;轉向下一個字節數據
;----------------------------------------
;I2C總線程序包結束
;----------------------------------------
MUSIC:
PUSH ACC
PUSH B
SETB RS0
CLR RS1
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 25H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
CJNE A,#00h,con
LJMP ED1
CON:MOV R7,A
SETB TR0 ;啟動計數
MUSIC2:
NOP
CPL P3.2
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,25H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
MOV 25H,#00H ;等于,則取下一代碼
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
NOP
DAT:
db 40h,22h,30h,42h,30h,22h,30h,22h,30h,12h,40h,22h,39h,12h,37h,12h
db 30h,42h,30h,62h,26h,22h,30h,22h,2bh,12h,26h,12h,20h,42h,20h,42h
db 26h,22h,26h,12h,30h,22h,26h,12h,20h,22h,26h,12h,2bh,42h,2bh,82h
db 1ch,42h,20h,42h,2bh,42h,26h,42h,20h,22h,26h,42h,20h,22h,26h,22h
db 2bh,12h,26h,12h,30h,42h,26h,82h,40h,22h,39h,12h,30h,22h,30h,22h
db 26h,22h,26h,12h,20h,22h,20h,22h,2bh,22h,2bh,12h,2bh,12h,39h,42h
db 2bh,42h,40h,22h,30h,42h,30h,22h,26h,42h,26h,22h,20h,82h,30h,22h
db 26h,12h,20h,22h,20h,22h,1ch,40h,20h,40h,26h,22h,30h,12h,20h,22h
db 20h,22h,20h,22h,26h,42h,30h,42h,40h,42h,30h,42h,26h,22h,30h,12h
db 20h,22h,20h,22h,20h,22h,26h,42h,30h,42h,40h,42h,30h,42h,40h,42h
db 30h,42h,40h,42h,30h,42h,30h,82h,00h
ED1:
POP B
POP ACC
CLR RS0
RET
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
;------------------------------------
;正轉調速程序
ZTIAO:
MOV SPEEDH,#2FH
MOV SPEEDL,#35H
XHUAN0: CLR P1.1
SETB P1.0
LCALL DIS
MOV A,SPEEDH
DEC A
MOV 60H,A
CJNE A,#00H,XHUAN0
XHUAN1: SETB P1.1
SETB P1.0
LCALL DIS
MOV A,SPEEDL
DEC A
MOV 61H,A
CJNE 61H,#00H,XHUAN1
RET
;反轉調速程序
FTIAO:
MOV SPEEDH,#2FH
MOV SPEEDL,#35H
XHAN3: CLR P1.0
SETB P1.1
LCALL DIS
MOV A,SPEEDH
DEC A
MOV 60H,A
CJNE A,#00H,XHUN3
XHUAN4: SETB P1.1
SETB P1.0
LCALL DIS
MOV A,SPEEDL
DEC A
MOV 61H,A
CJNE 61H,#00H,XHUAN4
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -