📄 so12864.s
字号:
.module so12864.c
.area text(rom, con, rel)
.dbfile F:\avr\mega128\lcd12864\so12864.c
.dbfunc e Init_LCD _Init_LCD fV
.even
_Init_LCD::
.dbline -1
.dbline 7
; #include "so12864.h"
;
; /*************************************************/
; //Init LCD
; /*************************************************/
; void Init_LCD(void)
; {
.dbline 9
; //Make the CS AO RST pin as output
; DDR_SPI_CTL = (1 << LCD_AO_TRIS) | (1 << LCD_RST_TRIS) | (1 << LCD_CS_TRIS);
ldi R24,7
out 0x11,R24
.dbline 11
;
; DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); //设置MOSI,SCK,SS 为OUTPUT,其它为INPUT
ldi R24,6
out 0x17,R24
.dbline 12
; SPCR = (1<<SPE)|(1<<MSTR); //SPI使能,主机方式,设置SCK为fosc/4,上升沿,MSB First
ldi R24,80
out 0xd,R24
.dbline 16
;
; /* 一定要先重启LCD,再设置SPI,否则通讯不成功 */
;
; LCD_RST_IO |= BIT(LCD_RST_PIN);
sbi 0x12,1
.dbline 17
; LCD_CS_IO |= BIT(LCD_CS_PIN);
sbi 0x12,2
.dbline 18
; LCD_AO_IO |= BIT(LCD_AO_PIN);
sbi 0x12,0
.dbline 20
;
; LCD_CS_IO &= ~BIT(LCD_CS_PIN); //select 12864
cbi 0x12,2
.dbline 22
;
; LCD_RST_IO &= ~BIT(LCD_RST_PIN); //reset
cbi 0x12,1
.dbline 23
; nop();
nop
.dbline 24
; nop();
nop
.dbline 25
; nop();
nop
.dbline 26
; LCD_RST_IO |= BIT(LCD_RST_PIN);
sbi 0x12,1
.dbline 29
;
; //write command
; Write_LCDCOM(DISPLAY_ON); //ON DISPLAY
ldi R16,175
xcall _Write_LCDCOM
.dbline 30
; Write_LCDCOM(START_LINE_0); //STAR DISPLAY
ldi R16,64
xcall _Write_LCDCOM
.dbline 31
; Write_LCDCOM(ADC_NORMAL); //ADC NORMAL
ldi R16,160
xcall _Write_LCDCOM
.dbline 32
; Write_LCDCOM(DISPLAY_NORMAL); //Display normal
ldi R16,166
xcall _Write_LCDCOM
.dbline 33
; Write_LCDCOM(ALL_POINT_NORMAL); //CLEAR
ldi R16,164
xcall _Write_LCDCOM
.dbline 34
; Write_LCDCOM(BIAS_1_9); //1/9BIAS
ldi R16,162
xcall _Write_LCDCOM
.dbline 35
; Write_LCDCOM(OUTPUT_MPDE_REVERSE); //COMMON OUTPUT DIRECTION
ldi R16,200
xcall _Write_LCDCOM
.dbline 36
; Write_LCDCOM(POWER); //POWER CONTROL
ldi R16,47
xcall _Write_LCDCOM
.dbline 37
; Write_LCDCOM(RESISTOR_RATION); //RESISTER RATIO
ldi R16,36
xcall _Write_LCDCOM
.dbline 38
; Write_LCDCOM(HIBYTE(ELECTRONIC_VOLUME));//VOLUM MODE SET
ldi R16,129
xcall _Write_LCDCOM
.dbline 39
; Write_LCDCOM(LOBYTE(ELECTRONIC_VOLUME));
ldi R16,36
xcall _Write_LCDCOM
.dbline 41
;
; Clear_LCD();
xcall _Clear_LCD
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_LCDCOM _Write_LCDCOM fV
; command -> R16
.even
_Write_LCDCOM::
.dbline -1
.dbline 49
; }
;
;
; /*************************************************/
; //Write command
; /*************************************************/
; void Write_LCDCOM(BYTE command)
; {
.dbline 50
; LCD_AO_IO &= ~BIT(LCD_AO_PIN);
cbi 0x12,0
.dbline 51
; LCD_CS_IO &= ~BIT(LCD_CS_PIN);
cbi 0x12,2
.dbline 52
; SPDR = (unsigned char)command;
out 0xf,R16
L3:
.dbline 53
; while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
L4:
.dbline 53
sbis 0xe,7
rjmp L3
X0:
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r command 16 c
.dbend
.dbfunc e Write_LCDDATA _Write_LCDDATA fV
; data -> R16
.even
_Write_LCDDATA::
.dbline -1
.dbline 59
; }
; /*************************************************/
; //Write data
; /*************************************************/
; void Write_LCDDATA(BYTE data)
; {
.dbline 60
; LCD_AO_IO |= BIT(LCD_AO_PIN);
sbi 0x12,0
.dbline 61
; LCD_CS_IO &= ~BIT(LCD_CS_PIN);
cbi 0x12,2
.dbline 62
; SPDR = (unsigned char)data;
out 0xf,R16
L7:
.dbline 63
; while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
L8:
.dbline 63
sbis 0xe,7
rjmp L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e Clear_LCD _Clear_LCD fV
; page -> R20
; seg -> R22
.even
_Clear_LCD::
st -y,R20
st -y,R22
.dbline -1
.dbline 70
; }
;
; /*************************************************/
; //Clear LCD
; /*************************************************/
; void Clear_LCD()
; {
.dbline 73
; unsigned char seg;
; unsigned char page;
; for(page = PAGE_0; page < PAGE_8; page++) //写页地址共8 页0xb0----0xb8
ldi R20,176
xjmp L14
L11:
.dbline 74
; {
.dbline 75
; Write_LCDCOM(page);
mov R16,R20
xcall _Write_LCDCOM
.dbline 76
; Write_LCDCOM(0x10); //列地址,高低字节两次写入,从第0列开始
ldi R16,16
xcall _Write_LCDCOM
.dbline 77
; Write_LCDCOM(0x00);
clr R16
xcall _Write_LCDCOM
.dbline 78
; for(seg = 0; seg < 128; seg++) //写128列
clr R22
xjmp L18
L15:
.dbline 79
; {
.dbline 80
; Write_LCDDATA(0x00);
clr R16
xcall _Write_LCDDATA
.dbline 81
; }
L16:
.dbline 78
inc R22
L18:
.dbline 78
cpi R22,128
brlo L15
X2:
.dbline 82
; }
L12:
.dbline 73
inc R20
L14:
.dbline 73
cpi R20,184
brlo L11
X3:
.dbline -2
L10:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r page 20 c
.dbsym r seg 22 c
.dbend
.dbfunc e DispEN_LCD _DispEN_LCD fV
; seg -> R20
; ptr -> R10,R11
; column -> R12,R13
; page -> R14
.even
_DispEN_LCD::
xcall push_xgset30FC
movw R12,R18
mov R14,R16
ldd R10,y+8
ldd R11,y+9
.dbline -1
.dbline 89
; }
;
; /*************************************************/
; //Display English words
; /*************************************************/
; void DispEN_LCD(BYTE page, WORD column, BYTE *ptr)
; {
.dbline 92
; unsigned char seg;
;
; Write_LCDCOM(page);
mov R16,R14
xcall _Write_LCDCOM
.dbline 93
; Write_LCDCOM(HIBYTE(column)); //列地址,高低字节两次写入
movw R16,R12
mov R16,R17
clr R17
andi R17,0
xcall _Write_LCDCOM
.dbline 94
; Write_LCDCOM(LOBYTE(column));
mov R16,R12
xcall _Write_LCDCOM
.dbline 96
;
; for(seg = 0; seg < 8; seg++) //写8列
clr R20
xjmp L23
L20:
.dbline 97
; {
.dbline 98
; Write_LCDDATA((BYTE)(*ptr++));
movw R30,R10
ld R16,Z+
movw R10,R30
xcall _Write_LCDDATA
.dbline 99
; }
L21:
.dbline 96
inc R20
L23:
.dbline 96
cpi R20,8
brlo L20
X4:
.dbline -2
L19:
.dbline 0 ; func end
xjmp pop_xgset30FC
.dbsym r seg 20 c
.dbsym r ptr 10 pc
.dbsym r column 12 s
.dbsym r page 14 c
.dbend
.dbfunc e DispCN_LCD _DispCN_LCD fV
; offset -> R20
; seg -> R22
; ptr -> R10,R11
; column -> R12,R13
; page -> R14
.even
_DispCN_LCD::
xcall push_xgsetF0FC
movw R12,R18
mov R14,R16
ldd R10,y+10
ldd R11,y+11
.dbline -1
.dbline 106
; }
;
; /*************************************************/
; //Display Chinese words
; /*************************************************/
; void DispCN_LCD(BYTE page, WORD column, BYTE *ptr)
; {
.dbline 109
; unsigned char seg;
; unsigned char offset;
; for(offset = 0; offset < 2; offset++)
clr R20
xjmp L28
L25:
.dbline 110
; {
.dbline 111
; Write_LCDCOM((BYTE)(page + offset));
mov R2,R20
clr R3
mov R16,R14
clr R17
add R16,R2
adc R17,R3
xcall _Write_LCDCOM
.dbline 112
; Write_LCDCOM(HIBYTE(column)); //列地址,高低字节两次写入
movw R16,R12
mov R16,R17
clr R17
andi R17,0
xcall _Write_LCDCOM
.dbline 113
; Write_LCDCOM(LOBYTE(column));
mov R16,R12
xcall _Write_LCDCOM
.dbline 115
;
; for(seg = 0; seg < 16; seg++) //写16列
clr R22
xjmp L32
L29:
.dbline 116
; {
.dbline 117
; Write_LCDDATA((BYTE)(*ptr++));
movw R30,R10
ld R16,Z+
movw R10,R30
xcall _Write_LCDDATA
.dbline 118
; }
L30:
.dbline 115
inc R22
L32:
.dbline 115
cpi R22,16
brlo L29
X5:
.dbline 119
; }
L26:
.dbline 109
inc R20
L28:
.dbline 109
cpi R20,2
brlo L25
X6:
.dbline -2
L24:
.dbline 0 ; func end
xjmp pop_xgsetF0FC
.dbsym r offset 20 c
.dbsym r seg 22 c
.dbsym r ptr 10 pc
.dbsym r column 12 s
.dbsym r page 14 c
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -