📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile F:\avrprojs\lcd_block\lcd.c
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 17
; //ICC-AVR application builder : 2008-8-5 下午 04:30:31
; // Target : M48
; // Crystal: 1.0000Mhz
;
; #include <iom48v.h>
; #include <macros.h>
;
; #define LCD_DATA_PORT PORTB
; #define LCD_DATA_DDR DDRB
; #define LCD_EN_PORT PORTD
; #define LCD_RS_PORT PORTD
; #define LCD_EN 0x10
; #define LCD_RS 0x08
;
;
; void LCD_init(void) //液晶初始化
; {
.dbline 18
; delay_nms(2);
ldi R16,2
ldi R17,0
rcall _delay_nms
.dbline 19
; LCD_write_char(0x38,0); //8位显示
clr R18
clr R19
ldi R16,56
ldi R17,0
rcall _LCD_write_char
.dbline 21
;
; delay_nms(6);
ldi R16,6
ldi R17,0
rcall _delay_nms
.dbline 22
; LCD_write_char(0x38,0); //8位显示
clr R18
clr R19
ldi R16,56
ldi R17,0
rcall _LCD_write_char
.dbline 24
;
; delay_nms(2);
ldi R16,2
ldi R17,0
rcall _delay_nms
.dbline 25
; LCD_write_char(0x38,0); //8位显示
clr R18
clr R19
ldi R16,56
ldi R17,0
rcall _LCD_write_char
.dbline 27
;
; LCD_write_char(0x38,0); //8位显示
clr R18
clr R19
ldi R16,56
ldi R17,0
rcall _LCD_write_char
.dbline 28
; delay_nms(2);
ldi R16,2
ldi R17,0
rcall _delay_nms
.dbline 29
; LCD_write_char(0x01,0); //8位显示
clr R18
clr R19
ldi R16,1
ldi R17,0
rcall _LCD_write_char
.dbline 30
; delay_nms(2);
ldi R16,2
ldi R17,0
rcall _delay_nms
.dbline 31
; LCD_write_char(0x08,0); //8位显示
clr R18
clr R19
ldi R16,8
ldi R17,0
rcall _LCD_write_char
.dbline 32
; delay_nms(1);
ldi R16,1
ldi R17,0
rcall _delay_nms
.dbline 34
;
; LCD_write_char(0x06,0); //8位显示
clr R18
clr R19
ldi R16,6
ldi R17,0
rcall _LCD_write_char
.dbline 35
; delay_nms(1);
ldi R16,1
ldi R17,0
rcall _delay_nms
.dbline 38
;
;
; LCD_write_char(0x0c,0); //显示开
clr R18
clr R19
ldi R16,12
ldi R17,0
rcall _LCD_write_char
.dbline 40
; //delay_nms(100);
; LCD_write_char(0x01,0); //清屏
clr R18
clr R19
ldi R16,1
ldi R17,0
rcall _LCD_write_char
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; Y -> R10,R11
; X -> R22,R23
.even
_LCD_write_string::
rcall push_gset3
mov R10,R18
mov R11,R19
mov R22,R16
mov R23,R17
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 45
; //delay_nms(3);
; }
;
; void LCD_write_string(int X,int Y,unsigned char *s)
; {
.dbline 46
; LCD_set_xy( X, Y ); //写地址
mov R18,R10
mov R19,R11
mov R16,R22
mov R17,R23
rcall _LCD_set_xy
rjmp L4
L3:
.dbline 49
.dbline 50
mov R30,R20
mov R31,R21
ldd R18,z+0
clr R19
clr R16
clr R17
rcall _LCD_write_char
.dbline 51
subi R20,255 ; offset = 1
sbci R21,255
.dbline 52
L4:
.dbline 48
;
; while (*s) // 写显示字符
mov R30,R20
mov R31,R21
ldd R2,z+0
tst R2
brne L3
.dbline -2
L2:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r Y 10 I
.dbsym r X 22 I
.dbend
.dbfunc e LCD_set_xy _LCD_set_xy fV
; address -> R20
; y -> R22,R23
; x -> R20,R21
.even
_LCD_set_xy::
rcall push_gset2
mov R22,R18
mov R23,R19
mov R20,R16
mov R21,R17
.dbline -1
.dbline 57
; {
; LCD_write_char( 0, *s );
; s ++;
; }
; }
;
;
; void LCD_set_xy( int x, int y ) //写地址函数
; {
.dbline 60
;
; unsigned char address;
; delay_nus(100);
ldi R16,100
ldi R17,0
rcall _delay_nus
.dbline 61
; address=x&0x0f;
andi R20,15
andi R21,0
.dbline 62
; switch(y)
cpi R22,0
cpc R22,R23
breq L9
X0:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L10
cpi R22,2
ldi R30,0
cpc R23,R30
breq L11
cpi R22,3
ldi R30,0
cpc R23,R30
breq L12
rjmp L8
X1:
.dbline 63
; {
L9:
.dbline 65
; case 0:
; address+= 0x00; //0x00 - 0x0f
.dbline 66
; break;
rjmp L8
L10:
.dbline 68
; case 1:
; address+= 0x40; //0x40 - 0x4f
subi R20,192 ; addi 64
.dbline 69
; break;
rjmp L8
L11:
.dbline 71
; case 2:
; address+= 0x10; //0x10 - 0x1f
subi R20,240 ; addi 16
.dbline 72
; break;
rjmp L8
L12:
.dbline 74
; case 3:
; address+= 0x50; //0x50 - 0x5f
subi R20,176 ; addi 80
.dbline 75
; break;
.dbline 77
; default :
; break;
L8:
.dbline 79
; }
; address=address|0x80;
ori R20,128
.dbline 80
; LCD_write_char( address, 0 );
clr R18
clr R19
mov R16,R20
clr R17
rcall _LCD_write_char
.dbline -2
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbsym r y 22 I
.dbsym r x 20 I
.dbend
.dbfunc e LCD_en_write _LCD_en_write fV
.even
_LCD_en_write::
.dbline -1
.dbline 86
; //delay_nms(2);
; }
;
;
; void LCD_en_write(void) //液晶使能
; {
.dbline 87
; LCD_EN_PORT|=LCD_EN;
sbi 0xb,4
.dbline 88
; delay_nus(1);
ldi R16,1
ldi R17,0
rcall _delay_nus
.dbline 89
; LCD_EN_PORT&=~LCD_EN;
cbi 0xb,4
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_display_char _LCD_display_char fV
; data -> y+4
; y -> R22,R23
; x -> R20,R21
.even
_LCD_display_char::
rcall push_gset2
mov R22,R18
mov R23,R19
mov R20,R16
mov R21,R17
.dbline -1
.dbline 92
; }
; void LCD_display_char(int x,int y,unsigned char data)
; {
.dbline 93
; LCD_set_xy(x,y); //写地址函数
mov R18,R22
mov R19,R23
mov R16,R20
mov R17,R21
rcall _LCD_set_xy
.dbline 94
; LCD_write_char(0,data);
ldd R18,y+4
clr R19
clr R16
clr R17
rcall _LCD_write_char
.dbline -2
L14:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data 4 c
.dbsym r y 22 I
.dbsym r x 20 I
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data -> R22,R23
; command -> R20,R21
.even
_LCD_write_char::
rcall push_gset2
mov R22,R18
mov R23,R19
mov R20,R16
mov R21,R17
.dbline -1
.dbline 98
; }
;
; void LCD_write_char(unsigned command,unsigned data) // 写数据
; {
.dbline 100
;
; delay_nus(16);
ldi R16,16
ldi R17,0
rcall _delay_nus
.dbline 101
; if(command==0)
cpi R20,0
cpc R20,R21
brne L16
X2:
.dbline 102
; {
.dbline 103
; LCD_RS_PORT|=LCD_RS; //RS=1
sbi 0xb,3
.dbline 104
; LCD_EN_PORT&=~LCD_EN;
cbi 0xb,4
.dbline 105
; LCD_DATA_PORT=data;
out 0x5,R22
.dbline 106
; LCD_EN_PORT|=LCD_EN;
sbi 0xb,4
.dbline 108
;
; delay_nus(50);
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 109
; LCD_EN_PORT&=~LCD_EN;
cbi 0xb,4
.dbline 110
; }
rjmp L17
L16:
.dbline 112
.dbline 113
cbi 0xb,3
.dbline 114
cbi 0xb,4
.dbline 115
out 0x5,R20
.dbline 116
sbi 0xb,4
.dbline 118
ldi R16,50
ldi R17,0
rcall _delay_nus
.dbline 119
cbi 0xb,4
.dbline 120
L17:
.dbline -2
L15:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 22 i
.dbsym r command 20 i
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 124
; else
; {
; LCD_RS_PORT&=~LCD_RS; //RS=0
; LCD_EN_PORT&=~LCD_EN;
; LCD_DATA_PORT=command;
; LCD_EN_PORT|=LCD_EN;
;
; delay_nus(50);
; LCD_EN_PORT&=~LCD_EN;
; }
; }
;
; void port_init(void)
; {
.dbline 125
; PORTB = 0x1B;
ldi R24,27
out 0x5,R24
.dbline 126
; DDRB = 0xFF;
ldi R24,255
out 0x4,R24
.dbline 127
; PORTC = 0x03; //m103 output only
ldi R24,3
out 0x8,R24
.dbline 128
; DDRC = 0x03;
out 0x7,R24
.dbline 129
; PORTD = 0x00;
clr R2
out 0xb,R2
.dbline 130
; DDRD = 0x18;
ldi R24,24
out 0xa,R24
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 135
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 137
; //stop errant interrupts until set up
; port_init();
rcall _port_init
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 146
; //all peripherals are now initialized
; }
;
; /*-----------------------------------------------------------------------
; 延时函数
; 系统时钟:8M
; -----------------------------------------------------------------------*/
; void delay_1us(void) //1us延时函数
; {
.dbline 147
; asm("nop");
nop
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
rcall push_gset2
mov R22,R16
mov R23,R17
.dbline -1
.dbline 151
; }
;
; void delay_nus(unsigned int n) //N us延时函数
; {
.dbline 152
; unsigned int i=0;
clr R20
clr R21
.dbline 153
; for (i=0;i<n;i++)
rjmp L25
L22:
.dbline 154
rcall _delay_1us
L23:
.dbline 153
subi R20,255 ; offset = 1
sbci R21,255
L25:
.dbline 153
cp R20,R22
cpc R21,R23
brlo L22
.dbline -2
L21:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 158
; delay_1us();
; }
;
; void delay_1ms(void) //1ms延时函数
; {
.dbline 160
clr R16
clr R17
rjmp L30
L27:
.dbline 160
L28:
.dbline 160
subi R16,255 ; offset = 1
sbci R17,255
L30:
.dbline 160
; unsigned int i;
; for (i=0;i<114;i++);
cpi R16,114
ldi R30,0
cpc R17,R30
brlo L27
.dbline -2
L26:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
rcall push_gset2
mov R22,R16
mov R23,R17
.dbline -1
.dbline 164
; }
;
; void delay_nms(unsigned int n) //N ms延时函数
; {
.dbline 165
; unsigned int i=0;
clr R20
clr R21
.dbline 166
; for (i=0;i<n;i++)
rjmp L35
L32:
.dbline 167
rcall _delay_1ms
L33:
.dbline 166
subi R20,255 ; offset = 1
sbci R21,255
L35:
.dbline 166
cp R20,R22
cpc R21,R23
brlo L32
.dbline -2
L31:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -