📄 lcd.s
字号:
.module LCD.c
.area text(rom, con, rel)
; i -> R20
; t -> R16,R17
.even
_delay::
xcall push_gset1
; #include <iom128v.h>
; #ifndef __lcd_h
; #define __lcd_h
; #define req asm("sbi 0x03,6")
; #define cl_req asm("cbi 0x03,6")
; #define dat asm("sbi 0x18,0")
; #define cl_dat asm("cbi 0x18,0")
; #define cl_reset asm("cbi 0x15,3")
; #define set_reset asm("sbi 0x15,3")
; #define LCD 0x9000
; void delay (unsigned int t)
; {
ldi R20,1
xjmp L5
L2:
L3:
inc R20
L5:
; unsigned char i;
; for (i=1;i<t;i++);
mov R2,R20
clr R3
cp R2,R16
cpc R3,R17
brlo L2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
; i -> R16,R17
.even
_delay_1ms::
; }
; void delay_1ms(void)
; {
clr R16
clr R17
xjmp L10
L7:
L8:
subi R16,255 ; offset = 1
sbci R17,255
L10:
; unsigned int i;
; for (i=0;i<2286;i++);
cpi R16,238
ldi R30,8
cpc R17,R30
brlo L7
L6:
.dbline 0 ; func end
ret
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
; }
; void delay_nms(unsigned int n)
; {
; unsigned int i=0;
clr R20
clr R21
; for (i=0;i<n;i++)
xjmp L15
L12:
xcall _delay_1ms
L13:
subi R20,255 ; offset = 1
sbci R21,255
L15:
cp R20,R22
cpc R21,R23
brlo L12
L11:
xcall pop_gset2
.dbline 0 ; func end
ret
; p -> R20,R21
; data -> R16
.even
_lcd_w::
xcall push_gset1
; delay_1ms();
; }
;
;
; void lcd_w(unsigned char data)
; {
; unsigned char *p=(unsigned char *)(LCD);
ldi R20,36864
ldi R21,144
L17:
L18:
; while((PINE&0x80)!=0x00)
in R24,0x1
andi R24,128
brne L17
; ;
; dat;
sbi 0x18,0
; *p=data;
movw R30,R20
std z+0,R16
; cl_dat;
cbi 0x18,0
; ;;
; req;
sbi 0x03,6
; ;;
L20:
L21:
; while((PINE&0x80)==0x00)
in R24,0x1
andi R24,128
breq L20
; ;
; cl_req;
cbi 0x03,6
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.even
_lcd_init::
; }
; void lcd_init (void)
; {
; MCUCR=MCUCR|0x80;
in R24,0x35
ori R24,128
out 0x35,R24
; DDRB|=0x01;
sbi 0x17,0
; PORTB&=0xfe;
in R24,0x18
andi R24,254
out 0x18,R24
; DDRE=0x40;
ldi R24,64
out 0x2,R24
; PORTE=0xff;
ldi R24,255
out 0x3,R24
; cl_reset;
cbi 0x15,3
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
; set_reset;
sbi 0x15,3
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
; cl_req;
cbi 0x03,6
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
L23:
.dbline 0 ; func end
ret
.even
_lcd_clear::
; }
; void lcd_clear (void)
; {
; lcd_w(0xf4);
ldi R16,244
xcall _lcd_w
L24:
.dbline 0 ; func end
ret
; i -> R12,R13
; ch -> R22,R23
; y -> R10
; x -> R20
.even
_lcd_putsc::
xcall push_gset4
mov R10,R18
mov R20,R16
ldd R22,y+8
ldd R23,y+9
; }
;
; void lcd_putsc (unsigned char x,unsigned char y,unsigned char *ch)
; { unsigned int i;
; x+=2;
subi R20,254 ; addi 2
xjmp L27
L26:
; while (*ch!=0)
; {
; lcd_w(0xf0);
ldi R16,240
xcall _lcd_w
; lcd_w(x);
mov R16,R20
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(*ch-0xa0);
movw R30,R22
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; lcd_w(*ch-0xa0);
movw R30,R22
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; delay_nms(2);
ldi R16,2
ldi R17,0
xcall _delay_nms
; for(i=0;i<16;i++)
clr R12
clr R13
xjmp L32
L29:
ldi R16,247
xcall _lcd_w
ldi R16,2
ldi R17,0
xcall _delay_nms
L30:
movw R24,R12
adiw R24,1
movw R12,R24
L32:
movw R24,R12
cpi R24,16
ldi R30,0
cpc R25,R30
brlo L29
L27:
movw R30,R22
ldd R2,z+0
tst R2
breq X0
xjmp L26
X0:
; {lcd_w(0xf7);
; delay_nms(2);}
; }
; for(i=0;i<115;i++)
clr R12
clr R13
xjmp L36
L33:
ldi R16,247
xcall _lcd_w
ldi R16,2
ldi R17,0
xcall _delay_nms
L34:
movw R24,R12
adiw R24,1
movw R12,R24
L36:
movw R24,R12
cpi R24,115
ldi R30,0
cpc R25,R30
brlo L33
L25:
xcall pop_gset4
.dbline 0 ; func end
ret
; i -> R12,R13
; ch -> R22,R23
; y -> R10
; x -> R20
.even
_lcd_putsm::
xcall push_gset4
mov R10,R18
mov R20,R16
ldd R22,y+8
ldd R23,y+9
; {lcd_w(0xf7);
; delay_nms(2);}
; }
; void lcd_putsm(unsigned char x,unsigned char y,unsigned char *ch)
; { unsigned int i;
; x+=4;
subi R20,252 ; addi 4
xjmp L39
L38:
; while (*ch!=0)
; {
; lcd_w(0xf1);
ldi R16,241
xcall _lcd_w
; lcd_w(x);
mov R16,R20
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(*ch);
movw R30,R22
ldd R16,z+0
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; delay_nms(1);
ldi R16,1
ldi R17,0
xcall _delay_nms
; for(i=0;i<8;i++)
clr R12
clr R13
xjmp L44
L41:
ldi R16,247
xcall _lcd_w
ldi R16,2
ldi R17,0
xcall _delay_nms
L42:
movw R24,R12
adiw R24,1
movw R12,R24
L44:
movw R24,R12
cpi R24,8
ldi R30,0
cpc R25,R30
brlo L41
L39:
movw R30,R22
ldd R2,z+0
tst R2
brne L38
; {lcd_w(0xf7);
; delay_nms(2);}
; }
; for(i=0;i<118;i++)
clr R12
clr R13
xjmp L48
L45:
ldi R16,247
xcall _lcd_w
ldi R16,2
ldi R17,0
xcall _delay_nms
L46:
movw R24,R12
adiw R24,1
movw R12,R24
L48:
movw R24,R12
cpi R24,118
ldi R30,0
cpc R25,R30
brlo L45
L37:
xcall pop_gset4
.dbline 0 ; func end
ret
; ch -> R20,R21
; y -> R22
; x -> R10
.even
_lcd_putse::
xcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
; {lcd_w(0xf7);
; delay_nms(2);}
;
;
; }
;
; void lcd_putse(unsigned char x,unsigned char y,unsigned char *ch)
; {
; x+=4;
mov R24,R10
subi R24,252 ; addi 4
mov R10,R24
xjmp L51
L50:
; while (*ch!=0)
; {
; lcd_w(0xf1);
ldi R16,241
xcall _lcd_w
; lcd_w(x);
mov R16,R10
xcall _lcd_w
; lcd_w(y);
mov R16,R22
xcall _lcd_w
; lcd_w(*ch);
movw R30,R20
ldd R16,z+0
xcall _lcd_w
; ch++;
subi R20,255 ; offset = 1
sbci R21,255
; if (x>=19)
mov R24,R10
cpi R24,19
brlo L53
; {
; x=4;
ldi R24,4
mov R10,R24
; y+=8;
subi R22,248 ; addi 8
; }
xjmp L54
L53:
; else
; x++;
inc R10
L54:
L51:
movw R30,R20
ldd R2,z+0
tst R2
brne L50
L49:
xcall pop_gset3
.dbline 0 ; func end
ret
; i -> <dead>
; ch -> R22,R23
; y -> R10
; x -> R20
.even
_lcd_putsf::
xcall push_gset3
mov R10,R18
mov R20,R16
ldd R22,y+6
ldd R23,y+7
; }
; }
; void lcd_putsf(unsigned char x,unsigned char y,unsigned char *ch)
; { unsigned int i;
; x+=2;
subi R20,254 ; addi 2
xjmp L57
L56:
; while (*ch!=0)
; {
; lcd_w(0xf0);
ldi R16,240
xcall _lcd_w
; lcd_w(x);
mov R16,R20
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(*ch-0xa0);
movw R30,R22
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; lcd_w(*ch-0xa0);
movw R30,R22
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; delay_nms(2);
ldi R16,2
ldi R17,0
xcall _delay_nms
; if (x>=0x09)
cpi R20,9
brlo L59
; {
; x=2;
ldi R20,2
; y+=1;
inc R10
; }
xjmp L60
L59:
; else
; x++;
inc R20
L60:
L57:
movw R30,R22
ldd R2,z+0
tst R2
brne L56
L55:
xcall pop_gset3
.dbline 0 ; func end
ret
.area data(ram, con, rel)
_a::
.blkb 2
.area idata
.byte 'W,'e
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'l,'c
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'o,'m
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 32,'t
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'o,32
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'B,'e
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'i,'j
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'i,'n
.area data(ram, con, rel)
_b::
.blkb 2
.area idata
.byte 'O,'n
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'e,32
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'W,'o
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'r,'l
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'd,32
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'O,'n
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'e,32
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'D,'r
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'e,'a
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'm,0
.area data(ram, con, rel)
.area text(rom, con, rel)
; j -> R20,R21
.even
_main::
sbiw R28,2
; }
; }
;
; #endif
;
; unsigned char a[]={87,101,108,99,111,109,32,116,111,32,66,101,105,106,105,110};
; unsigned char b[]={79,110,101,32,87,111,114,108,100,32,79,110,
; 101,32,68,114,101,97,109,0};
; void main(void)
; {while(1)
xjmp L63
L62:
; {
; int j;
; lcd_init();
xcall _lcd_init
; lcd_clear();
xcall _lcd_clear
; lcd_putsc(7,0,"北京欢迎你"); //右移动
ldi R24,<L65
ldi R25,>L65
std y+1,R25
std y+0,R24
clr R18
ldi R16,7
xcall _lcd_putsc
; lcd_putsm(55,10,b);
ldi R24,<_b
ldi R25,>_b
std y+1,R25
std y+0,R24
ldi R18,10
ldi R16,55
xcall _lcd_putsm
; delay_nms(100);
ldi R16,100
ldi R17,0
xcall _delay_nms
; for(j=0;j<2;j++)
clr R20
clr R21
L66:
ldi R24,<L65
ldi R25,>L65
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,1
xcall _lcd_putsf
ldi R16,20
ldi R17,0
xcall _delay_nms
ldi R16,244
xcall _lcd_w
ldi R16,20
ldi R17,0
xcall _delay_nms
L67:
subi R20,255 ; offset = 1
sbci R21,255
cpi R20,2
ldi R30,0
cpc R21,R30
brlt L66
ldi R24,<L65
ldi R25,>L65
std y+1,R25
std y+0,R24
ldi R18,1
ldi R16,1
xcall _lcd_putsf
ldi R24,<_b
ldi R25,>_b
std y+1,R25
std y+0,R24
ldi R18,35
clr R16
xcall _lcd_putse
ldi R16,150
ldi R17,0
xcall _delay_nms
L63:
xjmp L62
X1:
L61:
adiw R28,2
.dbline 0 ; func end
ret
.area data(ram, con, rel)
L65:
.blkb 11
.area idata
.byte 177,177,190,169,187,182,211,173,196,227,0
.area data(ram, con, rel)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -