📄 lcd12864.s
字号:
.module lcd12864.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\lcd12864.c
.dbfunc e delay_us _delay_us fV
; n -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 33
; /*
; LCD12864液晶屏驱动模块
; 1、可直接嵌入到项目中使用
; 2、晶振频率:1M
; 3、如晶振提高低层驱动延时要作相应修改
;
; AVR_AFA
; www.iccavr.com
; */
;
; #include <iom128v.h>
; #include "font.h"
;
; #define RS_CLR PORTC &= ~(1 << PC2) /*命令或数据选择*/
; #define RS_SET PORTC |= (1 << PC2) /*RS = 1命令,RS = 0数据*/
;
; #define RW_CLR PORTC &= ~(1 << PC3) /*读取或写入选择*/
; #define RW_SET PORTC |= (1 << PC3) /*RW = 1读,RW = 0写*/
;
; #define EN_CLR PORTC &= ~(1 << PC4) /*读写使能信号*/
; #define EN_SET PORTC |= (1 << PC4) /*下降沿有效*/
;
; #define RST_CLR PORTC &= ~(1 << PC5) /*芯片复位脚*/
; #define RST_SET PORTC |= (1 << PC5) /*高电平复位*/
;
; #define CSA_CLR PORTC &= ~(1 << PC7) /*左半屏片选*/
; #define CSA_SET PORTC |= (1 << PC7) /*高电平选中*/
;
; #define CSB_CLR PORTC &= ~(1 << PC6) /*右半屏片选*/
; #define CSB_SET PORTC |= (1 << PC6) /*高电平选中*/
;
; /*延时函数*/
; void delay_us(unsigned int n) {
.dbline 35
;
; if (n == 0) {
cpi R16,0
cpc R16,R17
brne L5
X0:
.dbline 35
.dbline 36
; return ;
xjmp L1
L4:
.dbline 38
L5:
.dbline 38
; }
; while (--n);
movw R24,R16
sbiw R24,1
movw R16,R24
cpi R16,0
cpc R16,R17
brne L4
X1:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r n 16 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; a -> R20
; b -> R22
; i -> R16
.even
_delay_ms::
xcall push_gset2
.dbline -1
.dbline 42
; }
;
; /*延时函数*/
; void delay_ms(unsigned char i) {
.dbline 45
ldi R20,1
xjmp L11
L8:
.dbline 45
;
; unsigned char a, b;
; for (a = 1; a < i; a++) {
.dbline 46
ldi R22,1
xjmp L15
L12:
.dbline 46
.dbline 47
.dbline 48
L13:
.dbline 46
inc R22
L15:
.dbline 46
tst R22
brne L12
.dbline 49
L9:
.dbline 45
inc R20
L11:
.dbline 45
cp R20,R16
brlo L8
.dbline -2
L7:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r b 22 c
.dbsym r i 16 c
.dbend
.dbfunc e LCD0_write_com _LCD0_write_com fV
; com -> R20
.even
_LCD0_write_com::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 53
; for (b = 1; b; b++) {
; ;
; }
; }
; }
;
; /*显示屏命令写入函数前半屏*/
; void LCD0_write_com(unsigned char com) {
.dbline 55
;
; RS_CLR;
cbi 0x15,2
.dbline 56
; RW_CLR;
cbi 0x15,3
.dbline 57
; CSA_SET;
sbi 0x15,7
.dbline 58
; CSB_CLR;
cbi 0x15,6
.dbline 59
; EN_SET;
sbi 0x15,4
.dbline 60
; PORTA = com;
out 0x1b,R20
.dbline 61
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 62
; EN_CLR;
cbi 0x15,4
.dbline -2
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r com 20 c
.dbend
.dbfunc e LCD1_write_com _LCD1_write_com fV
; com -> R20
.even
_LCD1_write_com::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 66
; }
;
; /*显示屏命令写入函数后半屏*/
; void LCD1_write_com(unsigned char com) {
.dbline 68
;
; RS_CLR;
cbi 0x15,2
.dbline 69
; RW_CLR;
cbi 0x15,3
.dbline 70
; CSA_CLR;
cbi 0x15,7
.dbline 71
; CSB_SET;
sbi 0x15,6
.dbline 72
; EN_SET;
sbi 0x15,4
.dbline 73
; PORTA = com;
out 0x1b,R20
.dbline 74
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 75
; EN_CLR;
cbi 0x15,4
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r com 20 c
.dbend
.dbfunc e LCD0_write_data _LCD0_write_data fV
; data -> R20
.even
_LCD0_write_data::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 79
; }
;
; /*显示屏命令写入函数*/
; void LCD0_write_data(unsigned char data) {
.dbline 81
;
; RS_SET;
sbi 0x15,2
.dbline 82
; RW_CLR;
cbi 0x15,3
.dbline 83
; CSA_SET;
sbi 0x15,7
.dbline 84
; CSB_CLR;
cbi 0x15,6
.dbline 85
; EN_SET;
sbi 0x15,4
.dbline 86
; PORTA = data;
out 0x1b,R20
.dbline 87
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 88
; EN_CLR;
cbi 0x15,4
.dbline -2
L18:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e LCD1_write_data _LCD1_write_data fV
; data -> R20
.even
_LCD1_write_data::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 92
; }
;
; /*显示屏命令写入函数*/
; void LCD1_write_data(unsigned char data) {
.dbline 94
;
; RS_SET;
sbi 0x15,2
.dbline 95
; RW_CLR;
cbi 0x15,3
.dbline 96
; CSA_CLR;
cbi 0x15,7
.dbline 97
; CSB_SET;
sbi 0x15,6
.dbline 98
; EN_SET;
sbi 0x15,4
.dbline 99
; PORTA = data;
out 0x1b,R20
.dbline 100
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 101
; EN_CLR;
cbi 0x15,4
.dbline -2
L19:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e disp_clear _disp_clear fV
; x -> R20
; y -> R10
; x1 -> R22
; x0 -> R12
.even
_disp_clear::
xcall push_gset4
mov R22,R18
mov R12,R16
ldd R10,y+8
.dbline -1
.dbline 105
; }
;
; /*显示屏清空显示*/
; void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
.dbline 110
;
; unsigned char x;
;
; /*清除高位*/
; x = x0;
mov R20,R12
.dbline 111
; if (x < 63) { /*地址在左半屏范围内*/
cpi R20,63
brsh L24
.dbline 111
.dbline 112
; LCD0_write_com(y | 0xB8);
mov R16,R10
ori R16,184
xcall _LCD0_write_com
.dbline 113
; LCD0_write_com(x | 0x40);
mov R16,R20
ori R16,64
xcall _LCD0_write_com
.dbline 114
; }
xjmp L24
L23:
.dbline 115
; while (x < x1) {
.dbline 116
; LCD0_write_data(0x00);
clr R16
xcall _LCD0_write_data
.dbline 117
; x ++;
inc R20
.dbline 118
; if (x > 63) { /*判断地址是否越界*/
ldi R24,63
cp R24,R20
brsh L26
.dbline 118
.dbline 119
; break;
xjmp L25
L26:
.dbline 121
L24:
.dbline 115
cp R20,R22
brlo L23
L25:
.dbline 122
; }
; }
; if (x < x1) { /*地址进入左半屏范围*/
cp R20,R22
brsh L31
.dbline 122
.dbline 123
; LCD1_write_com(y | 0xB8);
mov R16,R10
ori R16,184
xcall _LCD1_write_com
.dbline 124
; LCD1_write_com(x | 0x40);
mov R16,R20
ori R16,64
xcall _LCD1_write_com
.dbline 125
; }
xjmp L31
L30:
.dbline 126
.dbline 127
clr R16
xcall _LCD1_write_data
.dbline 128
inc R20
.dbline 129
L31:
.dbline 126
; while (x < x1) {
cp R20,R22
brlo L30
.dbline 132
; LCD1_write_data(0x00);
; x ++;
; }
;
; /*清除低位*/
; x = x0;
mov R20,R12
.dbline 133
; if (x < 63) { /*地址在左半屏范围内*/
cpi R20,63
brsh L36
.dbline 133
.dbline 134
; LCD0_write_com((y+1) | 0xB8);
mov R16,R10
subi R16,255 ; addi 1
ori R16,184
xcall _LCD0_write_com
.dbline 135
; LCD0_write_com(x | 0x40);
mov R16,R20
ori R16,64
xcall _LCD0_write_com
.dbline 136
; }
xjmp L36
L35:
.dbline 137
; while (x < x1) {
.dbline 138
; LCD0_write_data(0x00);
clr R16
xcall _LCD0_write_data
.dbline 139
; x ++;
inc R20
.dbline 140
; if (x > 63) { /*判断地址是否越界*/
ldi R24,63
cp R24,R20
brsh L38
.dbline 140
.dbline 141
; break;
xjmp L37
L38:
.dbline 143
L36:
.dbline 137
cp R20,R22
brlo L35
L37:
.dbline 144
; }
; }
; if (x < x1) { /*地址进入左半屏范围*/
cp R20,R22
brsh L43
.dbline 144
.dbline 145
; LCD1_write_com((y+1) | 0xB8);
mov R16,R10
subi R16,255 ; addi 1
ori R16,184
xcall _LCD1_write_com
.dbline 146
; LCD1_write_com(x | 0x40);
mov R16,R20
ori R16,64
xcall _LCD1_write_com
.dbline 147
; }
xjmp L43
L42:
.dbline 148
.dbline 149
clr R16
xcall _LCD1_write_data
.dbline 150
inc R20
.dbline 151
L43:
.dbline 148
; while (x < x1) {
cp R20,R22
brlo L42
.dbline -2
L20:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r x 20 c
.dbsym r y 10 c
.dbsym r x1 22 c
.dbsym r x0 12 c
.dbend
.dbfunc e disp_char _disp_char fV
; q -> R20,R21
; i -> R22
; ascii -> y+8
; y -> R12
; x -> R10
.even
_disp_char::
xcall push_gset4
mov R12,R18
mov R10,R16
.dbline -1
.dbline 155
; LCD1_write_data(0x00);
; x ++;
; }
; }
;
; /*在指定位置显示一个ASCII 字符*/
; void disp_char(unsigned char x, unsigned char y, unsigned char ascii) {
.dbline 157
;
; unsigned char i = 0x00;
clr R22
.dbline 160
; const unsigned char *q; /*取字库指针*/
;
; ascii -= 0x20;
ldd R24,y+8
subi R24,32
std y+8,R24
.dbline 161
; q = &ENGLISH_FONT[ascii * 16]; /*定位指针地址*/
ldi R24,16
ldd R0,y+8
mul R24,R0
movw R20,R0
ldi R24,<_ENGLISH_FONT
ldi R25,>_ENGLISH_FONT
add R20,R24
adc R21,R25
.dbline 164
;
; /*显示高8位*/
; i = 0x00;
.dbline 165
; if (x < 64) { /*地址在左半屏范围内*/
mov R24,R10
cpi R24,64
brsh L46
.dbline 165
.dbline 166
; LCD0_write_com(y | 0xB8);
mov R16,R12
ori R16,184
xcall _LCD0_write_com
.dbline 167
; LCD0_write_com(x | 0x40);
mov R16,R10
ori R16,64
xcall _LCD0_write_com
xjmp L49
L48:
.dbline 168
; while (i < 8) {
.dbline 169
; LCD0_write_data(*q);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -