提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这学期学的51单片机汇编,没事写了个OLED的程序,有些是照着一些c的例程写的。会有错误,还请批评指正。
一、代码
SCL BIT P1.0 ;引脚定义
SDA BIT P1.1
ORG 00H
JMP START ;跳转到主函数
ORG 100H
START:
MOV SP,#30H ;设置堆栈指针
ACALL INIT ;初始化OLED
MAIN:
; MOV A,#01H
; ACALL TRANS
; RL A ;恢复寄存器A的数据
;显示白屏
MOV A,#0FFH
ACALL FILL
;设置字符串显示
MOV R1,#10 ;字符串列起始位置,单位:像素
MOV R0,#2H ;字符串行起始位置,单位:行(共0-7,8行)
MOV R2,#48 ;字符串长度,单位:像素
MOV DPTR,#PIC ;传入图像地址
ACALL SHOW
MOV R1,#0 ;字符串列起始位置,单位:像素
MOV R0,#3H ;字符串行起始位置,单位:行(共0-7,8行)
MOV R2,#48 ;字符串长度,单位:像素
MOV DPTR,#PIC1 ;传入图像地址
ACALL SHOW_CH
MOV R1,#0 ;字符串列起始位置,单位:像素
MOV R0,#5H ;字符串行起始位置,单位:行(共0-7,8行)
MOV R3,#'0' ;要显示的字符
MOV DPTR,#TAB ;传入图像地址
ACALL SHOW_CHAR
;暂停程序
JMP $
INIT:
;Write_IIC_Command(0xAE); //display off
MOV A,#0AEH
ACALL TRANS_CMD
;Write_IIC_Command(0x20); //Set Memory Addressing Mode
MOV A,#20H
ACALL TRANS_CMD
;Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
MOV A,#10H
ACALL TRANS_CMD
;Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
MOV A,#0B0H
ACALL TRANS_CMD
;Write_IIC_Command(0xc8); //Set COM Output Scan Direction
MOV A,#0C8H
ACALL TRANS_CMD
;Write_IIC_Command(0x00);//---set low column address
MOV A,#00H
ACALL TRANS_CMD
;Write_IIC_Command(0x10);//---set high column address
MOV A,#10H
ACALL TRANS_CMD
;Write_IIC_Command(0x40);//--set start line address
MOV A,#40H
ACALL TRANS_CMD
;Write_IIC_Command(0x81);//--set contrast control register
MOV A,#81H
ACALL TRANS_CMD
;Write_IIC_Command(0xdf);
MOV A,#0DFH
ACALL TRANS_CMD
;Write_IIC_Command(0xa1);//--set segment re-map 0 to 127
MOV A,#0A1H
ACALL TRANS_CMD
;Write_IIC_Command(0xa6);//--set normal display
MOV A,#0A6H
ACALL TRANS_CMD
;Write_IIC_Command(0xa8);//--set multiplex ratio(1 to 64)
MOV A,#0A8H
ACALL TRANS_CMD
;Write_IIC_Command(0x3F);//
MOV A,#3FH
ACALL TRANS_CMD
;Write_IIC_Command(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content
MOV A,#0A4H
ACALL TRANS_CMD
;Write_IIC_Command(0xd3);//-set display offset
MOV A,#0D3H
ACALL TRANS_CMD
;Write_IIC_Command(0x00);//-not offset
MOV A,#00H
ACALL TRANS_CMD
;Write_IIC_Command(0xd5);//--set display clock divide ratio/oscillator frequency
MOV A,#0D5H
ACALL TRANS_CMD
;Write_IIC_Command(0xf0);//--set divide ratio
MOV A,#0F0H
ACALL TRANS_CMD
;Write_IIC_Command(0xd9);//--set pre-charge period
MOV A,#0D9H
ACALL TRANS_CMD
;Write_IIC_Command(0x22); //
MOV A,#22H
ACALL TRANS_CMD
;Write_IIC_Command(0xda);//--set com pins hardware configuration
MOV A,#0DAH
ACALL TRANS_CMD
;Write_IIC_Command(0x12);
MOV A,#12H
ACALL TRANS_CMD
;Write_IIC_Command(0xdb);//--set vcomh
MOV A,#0DBH
ACALL TRANS_CMD
;Write_IIC_Command(0x20);//0x20,0.77xVcc
MOV A,#20H
ACALL TRANS_CMD
;Write_IIC_Command(0x8d);//--set DC-DC enable
MOV A,#8DH
ACALL TRANS_CMD
;Write_IIC_Command(0x14);//
MOV A,#14H
ACALL TRANS_CMD
;Write_IIC_Command(0xaf);//--turn on oled panel
MOV A,#0AFH
ACALL TRANS_CMD
RET
;开始传输
START_TRANS:
SETB SCL
SETB SDA
CLR SDA
CLR SCL
RET
;结束传输
CLOSE_TRANS:
CLR SCL
CLR SDA
SETB SCL
SETB SDA
CLR SDA
CLR SCL
RET
;传输,影响R0,ACC寄存器,将ACC的数据按位传输
TRANS:
MOV R0,#8H
TRA1:
RLC A
MOV SDA,C
SETB SCL
CLR SCL
DJNZ R0,TRA1
SETB SDA
SETB SCL
CLR SCL
RET
;传输指令,将ACC的数据作为指令传出
TRANS_CMD:
PUSH ACC
ACALL START_TRANS
MOV A,#78H
ACALL TRANS
MOV A,#00H
ACALL TRANS
POP ACC
ACALL TRANS
ACALL CLOSE_TRANS
RET
;传输数据,将ACC的数据作为数据传出
TRANS_DATA:
PUSH ACC
ACALL START_TRANS
MOV A,#78H
ACALL TRANS
MOV A,#40H
ACALL TRANS
POP ACC
ACALL TRANS
ACALL CLOSE_TRANS
RET
;将ACC的数据刷屏,影响ACC,R0,R1,R2寄存器
FILL:
PUSH ACC
MOV A,#8H
FILL1:
MOV R0,#0B0H
DEC A
MOV R2,A
ADD A,R0
ACALL TRANS_CMD
MOV A,#0H
ACALL TRANS_CMD
MOV A,#10H
ACALL TRANS_CMD
MOV R1,#128
FILL2:
POP ACC
PUSH ACC
ACALL TRANS_DATA
DJNZ R1,FILL2
MOV A,R2
JNZ FILL1
DEC SP
RET
;将指定的图像显示到指定位置,R0:指定行,R1:指定列,R2:图像长度,DPTR:图像位置
SHOW:
DEC R0
MOV A,#0B0H
ADD A,R0
ACALL TRANS_CMD
MOV A,R1
ANL A,#0FH
ACALL TRANS_CMD
MOV A,R1
ANL A,#0F0H
SWAP A
ADD A,#10H
ACALL TRANS_CMD
SHOW1:
CLR A
MOVC A,@A+DPTR
ACALL TRANS_DATA
INC DPTR
DJNZ R2,SHOW1
RET
;将指定的字符显示到指定位置,R0:指定行,R1:指定列,R2:图像长度,R3:字符,DPTR:字表起始位置
SHOW_CHAR:
DEC R0
MOV A,#0B0H
ADD A,R0
ACALL TRANS_CMD
MOV A,R1
ANL A,#0FH
ACALL TRANS_CMD
MOV A,R1
ANL A,#0F0H
SWAP A
ADD A,#10H
ACALL TRANS_CMD
MOV A,R3
SUBB A,#48
JZ SHOW_CHAR3
MOV R3,A
SHOW_CHAR1:
MOV A,DPL
ADDC A,#8
MOV DPL,A
JNC SHOW_CHAR2
INC DPH
SHOW_CHAR2:
DJNZ R3,SHOW_CHAR1
SHOW_CHAR3:
MOV R2,#8
SHOW_CHAR4:
CLR A
MOVC A,@A+DPTR
ACALL TRANS_DATA
INC DPTR
DJNZ R2,SHOW_CHAR4
RET
;将指定的中文显示到指定位置R0:指定行,R1:指定列,R2:字符长度,DPTR:字表起始位置
SHOW_CH:
MOV A,R0
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R2
PUSH ACC
ACALL SHOW
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
INC R0
ACALL SHOW
RET
;图像
PIC:
DB 00H,00H,4CH,92H,92H,64H,00H,00H;"S",0
DB 00H,00H,0FEH,10H,28H,0C6H,00H,00H;"K",1
DB 00H,06H,08H,0F0H,08H,06H,00H,00H;"Y",2
DB 00H,00H,0FEH,80H,80H,80H,00H,00H;"L",3
DB 00H,00H,0FCH,22H,22H,0FCH,00H,00H;"A",4
DB 00H,00H,0FEH,32H,52H,8CH,00H,00H;"R",5
PIC1:
;上半部分
DB 00H,00H,0F8H,49H,4AH,4CH,48H,0F8H,48H,4CH,4AH,49H,0F8H,00H,00H,00H;"单",0
DB 00H,00H,00H,0FEH,20H,20H,20H,20H,20H,3FH,20H,20H,20H,20H,00H,00H;"片",1
DB 10H,10H,0D0H,0FFH,90H,10H,00H,0FEH,02H,02H,02H,0FEH,00H,00H,00H,00H;"机",2
;下半部分
DB 10H,10H,13H,12H,12H,12H,12H,0FFH,12H,12H,12H,12H,13H,10H,10H,00H;"单",0
DB 00H,80H,60H,1FH,02H,02H,02H,02H,02H,02H,0FEH,00H,00H,00H,00H,00H;"片",1
DB 04H,03H,00H,0FFH,00H,83H,60H,1FH,00H,00H,00H,3FH,40H,40H,78H,00H;"机",2
TAB:
DB 00H,00H,7CH,82H,82H,7CH,00H,00H;"0",0
DB 00H,00H,84H,0FEH,80H,00H,00H,00H;"1",1
DB 00H,00H,0C4H,0A2H,92H,8CH,00H,00H;"2",2
DB 00H,00H,44H,92H,92H,6CH,00H,00H;"3",3
DB 00H,00H,70H,4CH,0FEH,40H,00H,00H;"4",4
DB 00H,00H,9EH,92H,92H,62H,00H,00H;"5",5
DB 00H,00H,7CH,92H,92H,64H,00H,00H;"6",6
DB 00H,00H,06H,0E2H,12H,0EH,00H,00H;"7",7
DB 00H,00H,6CH,92H,92H,6CH,00H,00H;"8",8
DB 00H,00H,4CH,92H,92H,7CH,00H,00H;"9",9
END
二、取字模
用的是pctolcd2002,配置如下:
生成出来还要改下格式。
汉字为16x16,需要分为上半部分和下半部分。
三、相关文件获取
没发过文章,不知道怎么上传附件,所以放到资源绑定里了(应该一样吧?)。