📄 oled.asm
字号:
LCALL NOPLOOP
CLR OLED_RW
LCALL NOPLOOP
CLR OLED_CS
LCALL NOPLOOP
MOV OLED_DATA,A
LCALL NOPLOOP
SETB OLED_RW
LCALL NOPLOOP
SETB OLED_CS
LCALL NOPLOOP
RET
;*************************************
WRITE_DATA:
MOV SFRPAGE,#0Fh
SETB OLED_DC
LCALL NOPLOOP
SETB OLED_EN
LCALL NOPLOOP
CLR OLED_RW
LCALL NOPLOOP
CLR OLED_CS
LCALL NOPLOOP
MOV OLED_DATA,A
LCALL NOPLOOP
SETB OLED_RW
LCALL NOPLOOP
SETB OLED_CS
LCALL NOPLOOP
RET
;**************************************
NOPLOOP:
NOP
// NOP
// NOP
// NOP
// NOP
// NOP
// NOP
// NOP
RET
;***************调试区*****************
;**************************************
;********初始化************************
INIT:
MOV WDTCN,#0deh ;// disable watchdog timer
MOV WDTCN,#0adh ;
MOV SFRPAGE,#0Fh
MOV XBR2,#040H
RET
;********端口初始化子程序*******
PORTINIT:
MOV SFRPAGE,#0Fh
MOV P0MDOUT,#0FFH ;设置P0端口个管脚为漏极输出方式
MOV P1MDOUT,#0FFH ;设置管脚1的输出方式P1.6为推挽方式
MOV P2MDOUT,#0FFH ;设置P2端口个管脚为推挽方式
MOV P3MDOUT,#0FFH ;设置P3端口个管脚为推挽方式
RET
;**************************************
;时钟配置子程序:
;子程序名称:CLOCK
;程序功能:设置系统的时钟在外部晶振模下工作
;调用程序:
CLOCK:
MOV SFRPAGE,#0Fh
MOV OSCXCN, #067h ; enable external crystal选择外部振荡器频率10-30,外读晶体振荡模式
CLR A ; wait at least 1ms
DJNZ ACC, $ ; wait ~512us
DJNZ ACC, $ ; wait ~512us
DJNZ ACC, $
OSC_WAIT: ; poll for XTLVLD-->1
MOV A, OSCXCN
JNB ACC.7,OSC_WAIT ;当oscxcn为1时表明系统外部晶振以稳定可靠工作
MOV CLKSEL,#01H
;//Turn on the PLL and increase the system clock by a factor of M/N = 2
;通过PLL锁项环增大系统工作频率
;// MOV SFRPAGE,CONFIG_PAGE; ;保存CONFIG_PAGE
MOV PLL0CN,#04H ;设置PLL的时钟源为外部晶振 // Set internal osc. as PLL source:
RET
;********清除内部RAM 20H--5FH********
;用到0区R0,R5
CLRRAM:
MOV R0,#20H
MOV R5,#40H
CLR1: MOV @R0,#00H
INC R0
DJNZ R5,CLR1
RET
;********清除内部RAM 20H--5FH********
CLRHIGHRAM:
MOV R0,#80H
MOV A,#00H
MOV R5,#24
CLRHIGH1:
MOV @R0,A
INC R0
DJNZ R5,CLRHIGH1
RET
;********单字节BCD码转换成压缩BCD码********
DISBCD:
MOV R0,#30H
MOV R4,#06H
DISB3:MOV A,@R0
CJNE A,#0BH,DISB4
MOV @R0,#00H
INC R0
DJNZ R4,DISB3
DISB4:MOV R4,#05H
MOV R0,#36H
MOV R1,#36H
MOV A,35H
CJNE A,#0AH,DISB2
;有小数
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,31H
MOV 31H,#00H
JMP DISB1
DISB2:;无小数
MOV 32H,33H
MOV 33H,34H
MOV 34H,35H
MOV 35H,36H
MOV 36H,#00H
DISB1:MOV A,@R0
SWAP A
DEC R0
XCHD A,@R0
SWAP A
MOV @R1,A
DEC R0
DEC R1
DJNZ R4,DISB1
RET
;********单字节角度BCD码转换成压缩BCD码********
;功能:单字节BCD码转换成压缩BCD码
;入口:30H~3
;出口:
ANGBCD:
MOV R0,#30H
MOV R4,#08H
ANGB3:MOV A,@R0
CJNE A,#0BH,ANGB4
MOV @R0,#00H
INC R0
DJNZ R4,ANGB3
ANGB4:
MOV R0,#35H
MOV R1,#35H
MOV A,35H
CJNE A,#0AH,NEXT1
MOV 35H,34H
MOV 34H,33H
MOV 33H,32H
MOV 32H,#00H
JMP ANGB1
NEXT1:
MOV A,36H
CJNE A,#0AH,NEXT2
MOV 36H,37H
MOV 37H,#00H
MOV 32H,#00H
JMP ANGB1
NEXT2:
MOV 33H,35H
MOV 34H,36H
MOV 35H,37H
MOV 36H,#00H
MOV 37H,#00H
MOV 32H,#00H
ANGB1:
MOV R4,#08H
MOV R0,#37H
MOV R1,#37H
ANGB0:
MOV A,@R0
SWAP A
DEC R0
XCHD A,@R0
SWAP A
MOV @R1,A
DEC R0
DEC R1
DJNZ R4,ANGB0
RET
;**************************************
;压缩BCD码转换为非压缩BCD码子程序
YSBCDTBCD:
MOV A,35H ;第X点的脉冲数/**STAR**/
SWAP A
ANL A,#0FH
MOV 32H,A
MOV A,35H
ANL A,#0FH
MOV 33H,A
MOV A,36H
SWAP A
ANL A,#0FH
MOV 34H,A
MOV A,36H
ANL A,#0FH
MOV 35H,A
MOV A,37H
SWAP A
ANL A,#0FH
MOV 36H,A
MOV A,37H
ANL A,#0FH
MOV 37H,A ;第X点的脉冲数/**OVER**/
RET
;******************************
;某点的下限或上限的值读到RAM区中子程序
;子程序名称:XRAMTORAM
;程序功能:某点的下限或上限有高到低读到RAM中46H~4AH中
;使用积存器及RAM:R0 R2 A C XRAMADDL(23H) XRAMADDH(24H) 46H~45H
;入口:
;出口:XRAM中的数据读到RAM中46H~4AH中
;调用程序:
XRAMTORAM:
MOV R0,#4AH
MOV R2,#05H
XRAMTORAMLOOP:
MOV DPL,XRAMADDL
MOV DPH,XRAMADDH
MOVX A,@DPTR
MOV @R0,A
DEC R0
CLR C
MOV A,XRAMADDL
ADD A,#01H
MOV XRAMADDL,A
MOV A,XRAMADDH
ADDC A,#00H
MOV XRAMADDH,A
DJNZ R2,XRAMTORAMLOOP
RET
;**********************************************
;数据格式转换子程序
;**********************************************
;********十进制转二进制********
;压缩BCD码的十进制转换为二进制子程序******
;十进制数由高到低依次存入35H-37H,转换后的二进制数由到低高存入38H-39H
;十进制转换为二进制(二进制在在内部存储器中以十六进制存贮)
;影响资源:R0、R1、R2、R3、R4、R6、R7、A、B、CY、PSW、内RAM35H~37H、38H~39H
DEC_BIN:
NIDTB: ;调用十进制转换为2进制子程序
MOV R0,#35H
MOV R1,#38H
MOV R6,#38H
MOV R7,#03h
MOV R3,#03H
CLR A
DTB1:
MOV @R1,A
INC R1
DJNZ R3,DTB1
MOV R3,#03H
DTB2:
LCALL DTB3
MOV A,@R0
ANL A,#0F0H
SWAP A
LCALL DTB4
LCALL DTB3
MOV A,@R0
ANL A,#0FH
LCALL DTB4
INC R0
DJNZ R3,DTB2
MOV A,49H ;二进制数高子节和低字节交换
XCH A,4AH
MOV 49H,A
RET
DTB3:
MOV A,R7
MOV R4,A
MOV A,R6
MOV R1,A
CLR C
MOV R2,#00H
DTB5:
MOV A,@R1
MOV B,#0AH
PUSH PSW
MUL AB
POP PSW
ADDC A,R2
MOV @R1,A
MOV R2,B
INC R1
DJNZ R4,DTB5
RET
DTB4:
MOV R5,A
MOV A,R6
MOV R1,A
MOV A,R7
MOV R4,A
MOV A,R5
ADD A,@R1
MOV @R1,A
INC R1
DEC R4
MOV A,R4
JNZ DTB6
SJMP DTB7
DTB6:
MOV A,@R1
ADDC A,#00H
MOV @R1,A
INC R1
DJNZ R4,DTB6
DTB7:
MOV 4BH,4CH
RET
;************************************
;三字节二进制数转换为四个字节十进制数子程序:
;三字节二进制数由高到低依次存放在40H~42H中,
;转化后的十进制数由高到低依次存放在35H~38H中,
;影响资源:R0、R1、R2、R3、R5、R6、R7、CY、PSW
NIBTD:
MOV R0,#42H
MOV R1,#37H
MOV R7,#03H
NOP
MOV A,R0
MOV R5,A
MOV A,R1
MOV R6,A
MOV A,R7
INC A
MOV R3,A
CLR A
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#00H
MOV 37H,#00H
NBD0:
MOV @R1,A
DEC R1
DJNZ R3,NBD0
MOV A,R7
MOV B,#08H
MUL AB
MOV R3,A
NBD4:
MOV A,R5
MOV R0,A
MOV A,R7
MOV R2,A
CLR C
NBD1:
MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R2,NBD1
MOV A,R6
MOV R1,A
MOV A,R7
MOV R2,A
INC R2
NBD3:
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DEC R1
DJNZ R2,NBD3
DJNZ R3,NBD4
// MOV A,34H
// MOV 34H,37H
// MOV 37H,A
// MOV A,35H
// MOV 35H,36H
// MOV 36H,A
RET
;**********************************************
;延时子程序
;**********************************************
;********NOP延时子程序********
;用到1区寄存器
WAITNOP:
SETB RS0
MOV R6,#0FFH
WNOP1:NOP
NOP
DJNZ R6,WNOP1
CLR RS0
RET
;********NOP延时子程序********
WAIT3S:
SETB RS0
MOV R6,#060
WAIT3SLOOP:
LCALL WAIT50MINS
DJNZ R6,WAIT3SLOOP
CLR RS0
RET
;********NOP延时子程序********
WAIT150ms:
SETB RS0
MOV R5,#010H ;#01AH
MOV R3,#0FFH
MOV R4,#0FFH
W150m2:
MOV R4,#0FFH
W150m1:
NOP
NOP
DJNZ R4,W150m1
DJNZ R3,W150m2
MOV R3,#0FFH
DJNZ R5,W150m2
CLR RS0
RET
;********NOP延时子程序********
WAIT100ms:
LCALL WAIT50ms
LCALL WAIT50ms
RET
;********NOP延时子程序********
WAIT50ms:
SETB RS0
MOV R3,#0FFH
MOV R4,#0FFH
W50m2:
MOV R4,#0FFH
W50m1:
NOP
NOP
DJNZ R4,W50m1
DJNZ R3,W50m2
CLR RS0
RET
;********NOP延时子程序********
WAIT50MINS:
// SETB RS0
MOV R3,#0FFH
MOV R4,#0FFH
W50MINS2:
MOV R4,#0FFH
W50MINS1:
NOP
NOP
DJNZ R4,W50MINS1
DJNZ R3,W50MINS2
// CLR RS0
RET
;********NOP延时子程序********
NOP25:
SETB RS0
MOV R3,#0FAH
NOP251:
NOP
NOP
DJNZ R3,NOP251
CLR RS0
RET
;********延时1毫秒*******
WAIT1ms:
SETB RS0
MOV R3,#0AH
W1m2:
MOV R4,#0FFH
W1m1:
NOP
NOP
DJNZ R4,W1m1
DJNZ R3,W1m2
CLR RS0
RET
;********延时100微秒*******
WAIT100us:
SETB RS0
MOV R3,#01H
W100u2:
MOV R4,#0FFH
W100u1:
NOP
NOP
DJNZ R4,W100u1
DJNZ R3,W100u2
CLR RS0
RET
;********延时Xms*********
WAITXms:
SETB RS0
MOV R6,#01H
WAITX1:
LCALL WAIT150ms
SETB RS0
DJNZ R6,WAITX1
CLR RS0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -