📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile F:\radio\第十二篇\sleep\lcd.c
.dbfunc e ClearLcd _ClearLcd fV
.even
_ClearLcd::
.dbline -1
.dbline 40
; #include <iom16v.h>
; #include <macros.h>
; #include "delay.h"
; #define delay125ns NOP()
; #define delay250ns NOP();NOP()
; #define delay500ns NOP();NOP();NOP();NOP()
; //;NOP()
;
; #define delay1us NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
; #define delay2us delay1us;delay1us
; #define RS PD4
; #define RW PD5
; #define EN PD7
; #define DataLcd PORTB
; #define DataLcdIn PINB
; #define DataOut DDRB = 0XFF
; #define DataIn DDRB = 0
;
; #define RS_0 PORTD &=~ (1<<RS)
; #define RS_1 PORTD |= (1<<RS)
; #define RW_0 PORTD &=~ (1<<RW)
; #define RW_1 PORTD |= (1<<RW)
; #define EN_0 PORTD &=~ (1<<EN)
; #define EN_1 PORTD |= (1<<EN)
; /*时钟为8MHZ* /
; void delay_1us(void)
; {
; asm("nop");
; }
; void delay_us(unsigned int itimes)
; {
; unsigned int itemp;
; for (itemp=0;itemp<itimes;itemp++)
; {
; delay_1us();
; }
; }
; /**/
; void ClearLcd(void)
; {
.dbline 41
; EN_0;
cbi 0x12,7
.dbline 42
; RS_0;
cbi 0x12,4
.dbline 43
; RW_0;
cbi 0x12,5
.dbline 44
; DataOut;
ldi R24,255
out 0x17,R24
.dbline 45
; DataLcd = 1;
ldi R24,1
out 0x18,R24
.dbline 46
; delay250ns;
nop
.dbline 46
nop
.dbline 47
; EN_1;
sbi 0x12,7
.dbline 48
; delay500ns;
nop
.dbline 48
nop
.dbline 48
nop
.dbline 48
nop
.dbline 49
; EN_0;
cbi 0x12,7
.dbline 50
; delay125ns;
nop
.dbline 51
; RS_1;
sbi 0x12,4
.dbline 52
; RW_1;
sbi 0x12,5
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e home _home fV
.even
_home::
.dbline -1
.dbline 56
; }
; /**/
; void home(void)
; {
.dbline 57
; RS_0;
cbi 0x12,4
.dbline 58
; RW_0;
cbi 0x12,5
.dbline 59
; DataLcd = 2;
ldi R24,2
out 0x18,R24
.dbline 60
; delay250ns;
nop
.dbline 60
nop
.dbline 61
; EN_1;
sbi 0x12,7
.dbline 62
; delay500ns;
nop
.dbline 62
nop
.dbline 62
nop
.dbline 62
nop
.dbline 63
; EN_0;
cbi 0x12,7
.dbline 64
; delay125ns;
nop
.dbline 65
; RS_1;
sbi 0x12,4
.dbline 66
; RW_1;
sbi 0x12,5
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e InputSet _InputSet fV
.even
_InputSet::
.dbline -1
.dbline 69
; }
; void InputSet(void)
; {
.dbline 70
; RS_0;
cbi 0x12,4
.dbline 71
; RW_0;
cbi 0x12,5
.dbline 72
; DataLcd = 6; //
ldi R24,6
out 0x18,R24
.dbline 73
; delay250ns;
nop
.dbline 73
nop
.dbline 74
; EN_1;
sbi 0x12,7
.dbline 75
; delay500ns;
nop
.dbline 75
nop
.dbline 75
nop
.dbline 75
nop
.dbline 76
; EN_0;
cbi 0x12,7
.dbline 77
; delay125ns;
nop
.dbline 78
; RS_1;
sbi 0x12,4
.dbline 79
; RW_1;
sbi 0x12,5
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e VisionSet _VisionSet fV
.even
_VisionSet::
.dbline -1
.dbline 82
; }
; void VisionSet(void)
; {
.dbline 83
; EN_0;
cbi 0x12,7
.dbline 84
; RS_0;
cbi 0x12,4
.dbline 85
; RW_0;
cbi 0x12,5
.dbline 86
; DataLcd = 0x0f; //设置D=1,C=1,B=1
ldi R24,15
out 0x18,R24
.dbline 87
; delay250ns;
nop
.dbline 87
nop
.dbline 88
; EN_1;
sbi 0x12,7
.dbline 89
; delay500ns;
nop
.dbline 89
nop
.dbline 89
nop
.dbline 89
nop
.dbline 90
; EN_0;
cbi 0x12,7
.dbline 91
; delay125ns;
nop
.dbline 92
; RS_1;
sbi 0x12,4
.dbline 93
; RW_1;
sbi 0x12,5
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e FunctionSet _FunctionSet fV
.even
_FunctionSet::
.dbline -1
.dbline 96
; }
; void FunctionSet(void)
; {
.dbline 97
; DataOut;
ldi R24,255
out 0x17,R24
.dbline 98
; EN_0;
cbi 0x12,7
.dbline 99
; RS_0;
cbi 0x12,4
.dbline 100
; RW_0;
cbi 0x12,5
.dbline 101
; DataLcd = 0x38; //设置DL=1,N=1,F=0
ldi R24,56
out 0x18,R24
.dbline 102
; delay250ns; //地址建立时间,最小140ns
nop
.dbline 102
nop
.dbline 103
; EN_1;
sbi 0x12,7
.dbline 104
; delay500ns; //脉冲宽度,最小450ns
nop
.dbline 104
nop
.dbline 104
nop
.dbline 104
nop
.dbline 105
; EN_0;
cbi 0x12,7
.dbline 106
; delay125ns; //地址保持时间,最小10ns
nop
.dbline 107
; RS_1;
sbi 0x12,4
.dbline 108
; RW_1;
sbi 0x12,5
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e CgramSet _CgramSet fV
.even
_CgramSet::
.dbline -1
.dbline 111
; }
; void CgramSet(void)
; {
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DdramSet _DdramSet fV
; addr -> R16
.even
_DdramSet::
.dbline -1
.dbline 115
;
; }
; void DdramSet(unsigned char addr)
; {
.dbline 116
; EN_0;
cbi 0x12,7
.dbline 117
; RS_0;
cbi 0x12,4
.dbline 118
; RW_0;
cbi 0x12,5
.dbline 119
; DataLcd = (0x80+addr); //
mov R24,R16
subi R24,128 ; addi 128
out 0x18,R24
.dbline 120
; delay250ns;
nop
.dbline 120
nop
.dbline 121
; EN_1;
sbi 0x12,7
.dbline 122
; delay500ns;
nop
.dbline 122
nop
.dbline 122
nop
.dbline 122
nop
.dbline 123
; EN_0;
cbi 0x12,7
.dbline 124
; delay125ns;
nop
.dbline 125
; RS_1;
sbi 0x12,4
.dbline 126
; RW_1;
sbi 0x12,5
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r addr 16 c
.dbend
.dbfunc e BFRead _BFRead fc
; bf -> R16
.even
_BFRead::
.dbline -1
.dbline 129
; }
; unsigned char BFRead(void)
; {
.dbline 131
; unsigned char bf;
; RS_0;
cbi 0x12,4
.dbline 132
; RW_1;
sbi 0x12,5
.dbline 133
; delay250ns;
nop
.dbline 133
nop
.dbline 134
; EN_1;
sbi 0x12,7
.dbline 135
; delay500ns;
nop
.dbline 135
nop
.dbline 135
nop
.dbline 135
nop
.dbline 136
; DataIn;
clr R2
out 0x17,R2
.dbline 137
; bf = DataLcdIn;
in R16,0x16
.dbline 138
; EN_0;
cbi 0x12,7
.dbline 139
; delay125ns;
nop
.dbline 140
; RS_1;
sbi 0x12,4
.dbline 141
; RW_0;
cbi 0x12,5
.dbline 143
;
; return bf;
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbsym r bf 16 c
.dbend
.dbfunc e LCDReady _LCDReady fV
; bf -> R20
.even
_LCDReady::
xcall push_gset1
.dbline -1
.dbline 146
; }
; void LCDReady(void)
; {
L10:
.dbline 149
; unsigned char bf;
; do
; {bf = BFRead();
.dbline 149
xcall _BFRead
mov R20,R16
.dbline 151
; //PORTA = bf; //just for debug
; }
L11:
.dbline 152
; while((bf&0x80)==0x80);
mov R2,R20
clr R3
sbrc R2,7
rjmp L10
.dbline 153
; DataOut;
ldi R24,255
out 0x17,R24
.dbline -2
L9:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r bf 20 c
.dbend
.dbfunc e CharWrite _CharWrite fV
; data -> R20
.even
_CharWrite::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 156
; }
; void CharWrite(unsigned char data)
; {
.dbline 157
; LCDReady();
xcall _LCDReady
.dbline 158
; RS_1;
sbi 0x12,4
.dbline 159
; RW_0;
cbi 0x12,5
.dbline 160
; DataLcd = data; //
out 0x18,R20
.dbline 161
; delay250ns;
nop
.dbline 161
nop
.dbline 162
; EN_1;
sbi 0x12,7
.dbline 163
; delay500ns;
nop
.dbline 163
nop
.dbline 163
nop
.dbline 163
nop
.dbline 164
; EN_0;
cbi 0x12,7
.dbline 165
; delay125ns;
nop
.dbline 166
; RS_0;
cbi 0x12,4
.dbline 167
; RW_1;
sbi 0x12,5
.dbline -2
L13:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e LcdInit _LcdInit fV
.even
_LcdInit::
.dbline -1
.dbline 170
; }
; void LcdInit(void)
; {
.dbline 171
; LCDReady();
xcall _LCDReady
.dbline 172
; FunctionSet();
xcall _FunctionSet
.dbline 173
; LCDReady();
xcall _LCDReady
.dbline 174
; DdramSet(0);
clr R16
xcall _DdramSet
.dbline 175
; LCDReady();
xcall _LCDReady
.dbline 176
; VisionSet();
xcall _VisionSet
.dbline 177
; LCDReady();
xcall _LCDReady
.dbline 178
; InputSet();
xcall _InputSet
.dbline 179
; LCDReady();
xcall _LCDReady
.dbline 180
; ClearLcd();
xcall _ClearLcd
.dbline 181
; LCDReady();
xcall _LCDReady
.dbline 182
; home();
xcall _home
.dbline 183
; delay_us(10);
ldi R16,10
ldi R17,0
xcall _delay_us
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e CharsWrite _CharsWrite fV
; addr -> R22
; s -> R20,R21
; addry -> R12
; addrx -> R10
.even
_CharsWrite::
xcall push_gset4
mov R12,R18
mov R10,R16
ldd R20,y+8
ldd R21,y+9
.dbline -1
.dbline 186
; }
; void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
; {
.dbline 188
; unsigned char addr;
; if (addry==1)
mov R24,R12
cpi R24,1
brne L16
.dbline 189
; {
.dbline 190
; addr = addrx;
mov R22,R10
.dbline 191
; }
xjmp L17
L16:
.dbline 192
; else if (addry==2)
mov R24,R12
cpi R24,2
brne L18
.dbline 193
; {
.dbline 194
; addr = (addrx+0x40);
mov R22,R10
subi R22,192 ; addi 64
.dbline 195
; }
xjmp L19
L18:
.dbline 197
; else
; {
.dbline 198
; addr = 0;
clr R22
.dbline 199
; }
L19:
L17:
.dbline 200
; DdramSet(0); //初始化ddram地址
clr R16
xcall _DdramSet
.dbline 201
; LCDReady();
xcall _LCDReady
.dbline 202
; DdramSet(addr); //设定ddram地址
mov R16,R22
xcall _DdramSet
.dbline 203
; delay_us(80);
ldi R16,80
ldi R17,0
xcall _delay_us
xjmp L21
L20:
.dbline 205
.dbline 206
movw R30,R20
ldd R16,z+0
xcall _CharWrite
.dbline 207
subi R20,255 ; offset = 1
sbci R21,255
.dbline 208
ldi R16,80
ldi R17,0
xcall _delay_us
.dbline 209
L21:
.dbline 204
; while(*s)
movw R30,R20
ldd R2,z+0
tst R2
brne L20
.dbline -2
L15:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r addr 22 c
.dbsym r s 20 pc
.dbsym r addry 12 c
.dbsym r addrx 10 c
.dbend
.dbfunc e DataWrite _DataWrite fV
; addr -> R22
; s -> R20,R21
; addry -> R12
; addrx -> R10
.even
_DataWrite::
xcall push_gset4
mov R12,R18
mov R10,R16
ldd R20,y+8
ldd R21,y+9
.dbline -1
.dbline 212
; {
; CharWrite(*s);
; s++;
; delay_us(80); //等待写入操作完成
; }
; }
; void DataWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
; {
.dbline 214
; unsigned char addr;
; if (addry==1)
mov R24,R12
cpi R24,1
brne L24
.dbline 215
; {
.dbline 216
; addr = addrx;
mov R22,R10
.dbline 217
; }
xjmp L25
L24:
.dbline 218
; else if (addry==2)
mov R24,R12
cpi R24,2
brne L26
.dbline 219
; {
.dbline 220
; addr = (addrx+0x40);
mov R22,R10
subi R22,192 ; addi 64
.dbline 221
; }
xjmp L27
L26:
.dbline 223
; else
; {
.dbline 224
; addr = 0;
clr R22
.dbline 225
; }
L27:
L25:
.dbline 226
; DdramSet(0); //初始化ddram地址
clr R16
xcall _DdramSet
.dbline 227
; LCDReady();
xcall _LCDReady
.dbline 228
; DdramSet(addr); //设定ddram地址
mov R16,R22
xcall _DdramSet
.dbline 229
; delay_us(80);
ldi R16,80
ldi R17,0
xcall _delay_us
xjmp L29
L28:
.dbline 231
.dbline 232
movw R30,R20
ldd R16,z+0
subi R16,208 ; addi 48
xcall _CharWrite
.dbline 233
subi R20,255 ; offset = 1
sbci R21,255
.dbline 234
ldi R16,80
ldi R17,0
xcall _delay_us
.dbline 235
L29:
.dbline 230
; while(*s!=0XFF)
movw R30,R20
ldd R24,z+0
cpi R24,255
brne L28
.dbline -2
L23:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r addr 22 c
.dbsym r s 20 pc
.dbsym r addry 12 c
.dbsym r addrx 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -