📄 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
DJNZ R3,WRDA
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 + -