📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile E:\AVR程序\12864串口/lcd.h
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 19
; #include "lcd.h"
;
; #define CS BIT(5)
; #define SID BIT(6)
; #define SCLK BIT(7)
;
; #define LCD_ON PORTD &=~ BIT(7)
; #define LCD_OFF PORTD &=~ BIT(7)
;
;
; #define EN_CS PORTA |= CS
; #define DIS_CS PORTA &=~ CS
;
; #define ST_SID PORTA |= SID
; #define CLS_SID PORTA &=~ SID
;
; #define ST_SCLK PORTA |= SCLK
; #define CLS_SCLK PORTA &=~ SCLK
;
.dbline 20
;
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 24
; unsigned char ma[] ={"汉字显示LCD"};
; unsigned char flash ma2[]={"自带字库图文混排"};
; unsigned char flash ma3[]={"控制IC:ST7920 "};
; unsigned char flash ma4[]={"功能强大使用方便"};
.dbline 25
;
clr R20
clr R21
.dbline 26
; void portini(void)
xjmp L6
L3:
.dbline 27
xcall _delay_1us
L4:
.dbline 26
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 26
cp R20,R22
cpc R21,R23
brlo L3
.dbline -2
L2:
xcall 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 31
; {
; DDRD=0xff;
; PORTD = 0xff;
; DDRB = 0xff;
; PORTB = 0xff;
.dbline 33
clr R16
clr R17
xjmp L11
L8:
.dbline 33
L9:
.dbline 33
subi R16,255 ; offset = 1
sbci R17,255
L11:
.dbline 33
; }
;
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L8
.dbline -2
L7:
.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::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 37
; void delaynms(uint di) //延时
; {
; uint da,db;
; for(da=0;da<di;da++)
.dbline 38
; for(db=0;db<1000;db++);
clr R20
clr R21
.dbline 39
; }
xjmp L16
L13:
.dbline 40
xcall _delay_1ms
L14:
.dbline 39
subi R20,255 ; offset = 1
sbci R21,255
L16:
.dbline 39
cp R20,R22
cpc R21,R23
brlo L13
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.area data(ram, con, rel)
.dbfile E:\AVR程序\12864串口/lcd.h
_ma::
.blkb 12
.area idata
.byte 186,186,215,214,207,212,202,190,'L,'C,'D,0
.area data(ram, con, rel)
.dbfile E:\AVR程序\12864串口/lcd.h
.dbfile E:\AVR程序\12864串口\lcd.c
.dbsym e ma _ma A[12:12]c
.area lit(rom, con, rel)
_ma2::
.byte 215,212,180,248,215,214,191,226,205,188,206,196,187,236,197,197
.byte 0
.dbsym e ma2 _ma2 A[17:17]kc
_ma3::
.byte 191,216,214,198,'I,'C,163,186,'S,'T,55,57,50,48,32,32
.byte 0
.dbsym e ma3 _ma3 A[17:17]kc
_ma4::
.byte 185,166,196,220,199,191,180,243,202,185,211,195,183,189,177,227
.byte 0
.dbsym e ma4 _ma4 A[17:17]kc
.area text(rom, con, rel)
.dbfile E:\AVR程序\12864串口\lcd.c
.dbfunc e portini _portini fV
.even
_portini::
.dbline -1
.dbline 27
.dbline 28
ldi R24,255
out 0x11,R24
.dbline 29
out 0x12,R24
.dbline 30
out 0x17,R24
.dbline 31
out 0x18,R24
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delaynms _delaynms fV
; da -> R20,R21
; db -> R22,R23
; di -> R16,R17
.even
_delaynms::
xcall push_gset2
.dbline -1
.dbline 35
.dbline 37
clr R20
clr R21
xjmp L22
L19:
.dbline 38
clr R22
clr R23
xjmp L26
L23:
.dbline 38
L24:
.dbline 38
subi R22,255 ; offset = 1
sbci R23,255
L26:
.dbline 38
cpi R22,232
ldi R30,3
cpc R23,R30
brlo L23
L20:
.dbline 37
subi R20,255 ; offset = 1
sbci R21,255
L22:
.dbline 37
cp R20,R16
cpc R21,R17
brlo L19
.dbline -2
L18:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r da 20 i
.dbsym r db 22 i
.dbsym r di 16 i
.dbend
.dbfunc e lcdinit _lcdinit fV
.even
_lcdinit::
.dbline -1
.dbline 43
;
;
; void lcdinit(void)//初始化LCD
; {
.dbline 44
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 45
; EN_CS;
sbi 0x1b,5
.dbline 46
; write(0,0x30); //8位界面,基本指令集
ldi R18,48
clr R16
xcall _write
.dbline 47
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 48
; write(0,0x30); //显示打开,光标关,反白关
ldi R18,48
clr R16
xcall _write
.dbline 49
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 50
; write(0,0x0c); //显示打开,光标关,反白关
ldi R18,12
clr R16
xcall _write
.dbline 51
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 52
; write(0,0x01); //清屏
ldi R18,1
clr R16
xcall _write
.dbline 53
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 54
; write(0,0x60);
ldi R18,96
clr R16
xcall _write
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e write _write fV
; Ldata -> R20
; Hdata -> R22
; start_data -> R10
; ddata -> R20
; start -> R22
.even
_write::
xcall push_gset3
mov R20,R18
mov R22,R16
.dbline -1
.dbline 58
; }
;
; void write(uchar start,uchar ddata) //写指令或数据
; {
.dbline 60
; uchar start_data,Hdata,Ldata;
; if(start==0)
tst R22
brne L29
.dbline 61
; start_data = 0xf8; //写指令
ldi R24,248
mov R10,R24
xjmp L30
L29:
.dbline 63
; else
; start_data = 0xfa; //写数据
ldi R24,250
mov R10,R24
L30:
.dbline 64
; Hdata = ddata&0xf0; //取高4位
mov R22,R20
andi R22,240
.dbline 65
; Ldata = (ddata<<4)&0xf0; //取低4位
mov R24,R20
andi R24,#0x0F
swap R24
andi R24,240
mov R20,R24
.dbline 66
; sendbyte(start_data); //发送起始信号
mov R16,R10
xcall _sendbyte
.dbline 67
; delaynms(100);
ldi R16,100
ldi R17,0
xcall _delaynms
.dbline 68
; sendbyte(Hdata); //发送高四位
mov R16,R22
xcall _sendbyte
.dbline 69
; delaynms(50);
ldi R16,50
ldi R17,0
xcall _delaynms
.dbline 70
; sendbyte(Ldata); //发送低四位
mov R16,R20
xcall _sendbyte
.dbline 71
; delaynms(50);
ldi R16,50
ldi R17,0
xcall _delaynms
.dbline -2
L28:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Ldata 20 c
.dbsym r Hdata 22 c
.dbsym r start_data 10 c
.dbsym r ddata 20 c
.dbsym r start 22 c
.dbend
.dbfunc e sendbyte _sendbyte fV
; i -> R20
; bbyte -> R22
.even
_sendbyte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 75
; }
;
; void sendbyte(uchar bbyte) //发送一个字节
; {
.dbline 77
; unsigned char i;
; for(i=0;i<8;i++)
clr R20
xjmp L35
L32:
.dbline 78
; {
.dbline 80
;
; if((bbyte&0x80)==1) //取出最高位
mov R24,R22
andi R24,128
cpi R24,1
brne L36
.dbline 81
; {ST_SID;}
.dbline 81
sbi 0x1b,6
.dbline 81
xjmp L37
L36:
.dbline 83
; else
; {CLS_SID;}
.dbline 83
cbi 0x1b,6
.dbline 83
L37:
.dbline 84
sbi 0x1b,7
.dbline 85
ldi R16,100
ldi R17,0
xcall _delay_nus
.dbline 86
cbi 0x1b,7
.dbline 87
lsl R22
.dbline 88
ldi R16,100
ldi R17,0
xcall _delay_nus
.dbline 89
L33:
.dbline 77
inc R20
L35:
.dbline 77
cpi R20,8
brlo L32
.dbline -2
L31:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r bbyte 22 c
.dbend
.dbfunc e lcdtest _lcdtest fV
; i -> R20
; j -> R22
.even
_lcdtest::
xcall push_gset2
.dbline -1
.dbline 93
; ST_SCLK;
; delay_nus(100);
; CLS_SCLK;
; bbyte<<=1;
; delay_nus(100);
; }
; }
;
; void lcdtest(void) //图形方式下屏幕全黑
; {
.dbline 95
; uchar i,j;
; for(i=0;i<32;i++)
clr R20
xjmp L42
L39:
.dbline 96
; {
.dbline 97
; write(0,0x80+i);write(0,0x80);
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _write
.dbline 97
ldi R18,128
clr R16
xcall _write
.dbline 98
clr R22
xjmp L46
L43:
.dbline 98
ldi R18,255
ldi R16,1
xcall _write
L44:
.dbline 98
inc R22
L46:
.dbline 98
cpi R22,16
brlo L43
.dbline 99
L40:
.dbline 95
inc R20
L42:
.dbline 95
cpi R20,32
brlo L39
.dbline 100
; for(j=0;j<16;j++)write(1,0xff);
; }
; for(i=0;i<32;i++)
clr R20
xjmp L50
L47:
.dbline 101
; {
.dbline 102
; write(0,0x80+i);write(0,0x88);
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _write
.dbline 102
ldi R18,136
clr R16
xcall _write
.dbline 103
clr R22
xjmp L54
L51:
.dbline 103
ldi R18,255
ldi R16,1
xcall _write
L52:
.dbline 103
inc R22
L54:
.dbline 103
cpi R22,16
brlo L51
.dbline 104
L48:
.dbline 100
inc R20
L50:
.dbline 100
cpi R20,32
brlo L47
.dbline -2
L38:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbend
.dbfunc e lcdcls _lcdcls fV
; i -> R20
; j -> R22
.even
_lcdcls::
xcall push_gset2
.dbline -1
.dbline 108
; for(j=0;j<16;j++) write(1,0xff);
; }
; }
;
; void lcdcls(void) //图形方式下清屏
; {
.dbline 110
; unsigned char i,j;
; for(i=0;i<32;i++)
clr R20
xjmp L59
L56:
.dbline 111
; {
.dbline 112
; {write(0,0x80+i);delaynms(10);write(0,0x80);}
.dbline 112
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _write
.dbline 112
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 112
ldi R18,128
clr R16
xcall _write
.dbline 112
.dbline 113
clr R22
xjmp L63
L60:
.dbline 113
.dbline 113
clr R18
ldi R16,1
xcall _write
.dbline 113
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 113
L61:
.dbline 113
inc R22
L63:
.dbline 113
cpi R22,16
brlo L60
.dbline 114
L57:
.dbline 110
inc R20
L59:
.dbline 110
cpi R20,32
brlo L56
.dbline 116
; for(j=0;j<16;j++){ write(1,0x00);delaynms(10);}
; }
;
; for(i=0;i<32;i++)
clr R20
xjmp L67
L64:
.dbline 117
; {
.dbline 118
; {write(0,0x80+i);delaynms(10);write(0,0x88);}
.dbline 118
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _write
.dbline 118
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 118
ldi R18,136
clr R16
xcall _write
.dbline 118
.dbline 119
clr R22
xjmp L71
L68:
.dbline 119
.dbline 119
clr R18
ldi R16,1
xcall _write
.dbline 119
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 119
L69:
.dbline 119
inc R22
L71:
.dbline 119
cpi R22,16
brlo L68
.dbline 120
L65:
.dbline 116
inc R20
L67:
.dbline 116
cpi R20,32
brlo L64
.dbline -2
L55:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 124
; for(j=0;j<16;j++) {write(1,0x00);delaynms(10);}
; }
; }
;
; void main()
; {
.dbline 126
; unsigned char i;
; delaynms(1000);
ldi R16,1000
ldi R17,3
xcall _delaynms
.dbline 127
; portini();
xcall _portini
.dbline 128
; lcdinit();
xcall _lcdinit
.dbline 129
; LCD_ON;
cbi 0x12,7
xjmp L74
L73:
.dbline 131
; while(1)
; {
.dbline 132
; lcdtest();
xcall _lcdtest
.dbline 133
; lcdcls();
xcall _lcdcls
.dbline 134
ldi R18,128
clr R16
xcall _write
.dbline 134
clr R20
xjmp L79
L76:
.dbline 134
ldi R24,<_ma
ldi R25,>_ma
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
ldi R16,1
xcall _write
L77:
.dbline 134
inc R20
L79:
.dbline 134
; write(0,0x80); for(i=0;i<16;i++) write(1,ma[i]);
cpi R20,16
brlo L76
.dbline 135
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 136
ldi R18,144
clr R16
xcall _write
.dbline 136
clr R20
xjmp L83
L80:
.dbline 136
ldi R24,<_ma2
ldi R25,>_ma2
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R18,Z
ldi R16,1
xcall _write
L81:
.dbline 136
inc R20
L83:
.dbline 136
; write(0,0x90); for(i=0;i<16;i++) write(1,ma2[i]);
cpi R20,16
brlo L80
.dbline 137
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 138
ldi R18,136
clr R16
xcall _write
.dbline 138
clr R20
xjmp L87
L84:
.dbline 138
ldi R24,<_ma3
ldi R25,>_ma3
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R18,Z
ldi R16,1
xcall _write
L85:
.dbline 138
inc R20
L87:
.dbline 138
; write(0,0x88); for(i=0;i<16;i++) write(1,ma3[i]);
cpi R20,16
brlo L84
.dbline 139
; delaynms(10);
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 140
ldi R18,152
clr R16
xcall _write
.dbline 140
clr R20
xjmp L91
L88:
.dbline 140
ldi R24,<_ma4
ldi R25,>_ma4
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R18,Z
ldi R16,1
xcall _write
L89:
.dbline 140
inc R20
L91:
.dbline 140
cpi R20,16
brlo L88
.dbline 141
ldi R16,10
ldi R17,0
xcall _delaynms
.dbline 142
ldi R18,54
clr R16
xcall _write
.dbline 143
L74:
.dbline 130
xjmp L73
X0:
.dbline -2
L72:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -