📄 lcd1602.s
字号:
.module lcd1602.c
.area text(rom, con, rel)
.dbfile D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\lcd1602.c
.dbfunc e delay_us _delay_us fV
; n -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 24
; /*
; LCD1602液晶屏四线驱动模块
; 1、可直接嵌入到项目中使用
; 2、晶振频率:1M
; 3、如晶振提高低层驱动延时要作相应修改
; 4、程序在原来基础上只使用了PB口的高四位,即PB4—PB7,PB0—PB3可以做它用
;
; SunnyTrip
; www.iccavr.com
; */
;
; #include <iom16v.h>
;
; #define RS_CLR PORTD &= ~(1 << PD3)
; #define RS_SET PORTD |= (1 << PD3)
;
; #define RW_CLR PORTD &= ~(1 << PD4)
; #define RW_SET PORTD |= (1 << PD4)
;
; #define EN_CLR PORTD &= ~(1 << PD6)
; #define EN_SET PORTD |= (1 << PD6)
;
; /*延时函数*/
; void delay_us(unsigned int n) {
.dbline 26
;
; if (n == 0) {
cpi R16,0
cpc R16,R17
brne L5
X0:
.dbline 26
.dbline 27
; return ;
xjmp L1
L4:
.dbline 29
L5:
.dbline 29
; }
; 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 33
; }
;
; /*延时函数*/
; void delay_ms(unsigned char i) {
.dbline 36
ldi R20,1
xjmp L11
L8:
.dbline 36
;
; unsigned char a, b;
; for (a = 1; a < i; a++) {
.dbline 37
ldi R22,1
xjmp L15
L12:
.dbline 37
.dbline 38
.dbline 39
L13:
.dbline 37
inc R22
L15:
.dbline 37
tst R22
brne L12
.dbline 40
L9:
.dbline 36
inc R20
L11:
.dbline 36
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 LCD_write_com _LCD_write_com fV
; com -> R20
.even
_LCD_write_com::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 44
; for (b = 1; b; b++) {
; ;
; }
; }
; }
;
; /*显示屏命令写入函数*/
; void LCD_write_com(unsigned char com) {
.dbline 46
;
; RS_CLR;
cbi 0x12,3
.dbline 47
; RW_CLR;
cbi 0x12,4
.dbline 48
; EN_SET;
sbi 0x12,6
.dbline 49
; PORTB&=0x0f;
in R24,0x18
andi R24,15
out 0x18,R24
.dbline 50
; PORTB|= com&0xf0;
mov R24,R20
andi R24,240
in R2,0x18
or R2,R24
out 0x18,R2
.dbline 51
; com = com<<4;
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 52
; EN_CLR;
cbi 0x12,6
.dbline 53
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 54
; EN_SET;
sbi 0x12,6
.dbline 55
; PORTB&=0x0f;
in R24,0x18
andi R24,15
out 0x18,R24
.dbline 56
; PORTB|= com&0xf0;
mov R24,R20
andi R24,240
in R2,0x18
or R2,R24
out 0x18,R2
.dbline 57
; EN_CLR;
cbi 0x12,6
.dbline 58
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline -2
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r com 20 c
.dbend
.dbfunc e LCD_write_data _LCD_write_data fV
; data -> R20
.even
_LCD_write_data::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 62
; }
;
; /*显示屏命令写入函数*/
; void LCD_write_data(unsigned char data) {
.dbline 64
;
; RS_SET;
sbi 0x12,3
.dbline 65
; RW_CLR;
cbi 0x12,4
.dbline 66
; EN_SET;
sbi 0x12,6
.dbline 67
; PORTB&=0x0f;
in R24,0x18
andi R24,15
out 0x18,R24
.dbline 68
; PORTB|= data&0xf0;
mov R24,R20
andi R24,240
in R2,0x18
or R2,R24
out 0x18,R2
.dbline 69
; data = data<<4;
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 70
; EN_CLR;
cbi 0x12,6
.dbline 71
; delay_us(1);
ldi R16,1
ldi R17,0
xcall _delay_us
.dbline 72
; EN_SET;
sbi 0x12,6
.dbline 73
; PORTB&=0x0f;
in R24,0x18
andi R24,15
out 0x18,R24
.dbline 74
; PORTB|= data&0xf0;
mov R24,R20
andi R24,240
in R2,0x18
or R2,R24
out 0x18,R2
.dbline 75
; EN_CLR;
cbi 0x12,6
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e LCD_clear _LCD_clear fV
.even
_LCD_clear::
.dbline -1
.dbline 79
; }
;
; /*显示屏清空显示*/
; void LCD_clear(void) {
.dbline 81
;
; LCD_write_com(0x01);
ldi R16,1
xcall _LCD_write_com
.dbline 82
; delay_ms(5);
ldi R16,5
xcall _delay_ms
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_str _LCD_write_str fV
; s -> R20,R21
; y -> R10
; x -> R22
.even
_LCD_write_str::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 86
; }
;
; /*显示屏字符串写入函数*/
; void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
.dbline 88
;
; if (y == 0) {
tst R10
brne L20
.dbline 88
.dbline 89
; LCD_write_com(0x80 + x);
mov R16,R22
subi R16,128 ; addi 128
xcall _LCD_write_com
.dbline 90
; }
xjmp L23
L20:
.dbline 91
; else {
.dbline 92
; LCD_write_com(0xC0 + x);
mov R16,R22
subi R16,64 ; addi 192
xcall _LCD_write_com
.dbline 93
; }
xjmp L23
L22:
.dbline 95
.dbline 96
movw R30,R20
ldd R16,z+0
xcall _LCD_write_data
.dbline 97
subi R20,255 ; offset = 1
sbci R21,255
.dbline 98
L23:
.dbline 95
;
; while (*s) {
movw R30,R20
ldd R2,z+0
tst R2
brne L22
.dbline -2
L19:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r y 10 c
.dbsym r x 22 c
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data -> y+4
; y -> R22
; x -> R20
.even
_LCD_write_char::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 102
; LCD_write_data( *s);
; s ++;
; }
; }
;
; /*显示屏单字符写入函数*/
; void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
.dbline 104
;
; if (y == 0) {
tst R22
brne L26
.dbline 104
.dbline 105
; LCD_write_com(0x80 + x);
mov R16,R20
subi R16,128 ; addi 128
xcall _LCD_write_com
.dbline 106
; }
xjmp L27
L26:
.dbline 107
; else {
.dbline 108
; LCD_write_com(0xC0 + x);
mov R16,R20
subi R16,64 ; addi 192
xcall _LCD_write_com
.dbline 109
; }
L27:
.dbline 111
;
; LCD_write_data( data);
ldd R16,y+4
xcall _LCD_write_data
.dbline -2
L25:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data 4 c
.dbsym r y 22 c
.dbsym r x 20 c
.dbend
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 115
; }
;
; /*显示屏初始化函数*/
; void LCD_init(void) {
.dbline 117
;
; DDRB = 0xFF; /*I/O口方向设置*/
ldi R24,255
out 0x17,R24
.dbline 118
; DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
in R24,0x11
ori R24,88
out 0x11,R24
.dbline 119
; LCD_write_com(0x28); /*显示模式设置*/
ldi R16,40
xcall _LCD_write_com
.dbline 120
; delay_ms(15);
ldi R16,15
xcall _delay_ms
.dbline 121
; LCD_write_com(0x28);
ldi R16,40
xcall _LCD_write_com
.dbline 122
; delay_ms(5);
ldi R16,5
xcall _delay_ms
.dbline 123
; LCD_write_com(0x28);
ldi R16,40
xcall _LCD_write_com
.dbline 124
; delay_ms(5);
ldi R16,5
xcall _delay_ms
.dbline 125
; LCD_write_com(0x28);
ldi R16,40
xcall _LCD_write_com
.dbline 127
;
; LCD_write_com(0x08); /*显示关闭*/
ldi R16,8
xcall _LCD_write_com
.dbline 128
; LCD_write_com(0x01); /*显示清屏*/
ldi R16,1
xcall _LCD_write_com
.dbline 129
; LCD_write_com(0x06); /*显示光标移动设置*/
ldi R16,6
xcall _LCD_write_com
.dbline 130
; delay_ms(5);
ldi R16,5
xcall _delay_ms
.dbline 131
; LCD_write_com(0x0C); /*显示开及光标设置*/
ldi R16,12
xcall _LCD_write_com
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -