📄 lcd7920.s
字号:
.module Lcd7920.c
.area text(rom, con, rel)
.dbfile E:\__test\_RTL8019_M128_struct_Test\Lcd7920.c
.dbfunc e LCD_Init _LCD_Init fV
.even
_LCD_Init::
.dbline -1
.dbline 16
; //本程序测试通过 --2007.11.27
;
; //本程序是7920的LM3037的液晶驱动程序
; //汉字2x9
; //可显示图形
; //ATMEGA16, 内部晶振8M (也可用于外部7.3728MHz晶振)
; //使用串行传输 (2线)
;
; #include "Lcd7920.h"
;
; #define LINEWIDTH 18 //行宽
; #define LINES 2 //行数
;
; //LCD初始化
; void LCD_Init(void)
; {
.dbline 17
; Delay_nms(100);
ldi R16,100
ldi R17,0
xcall _Delay_nms
.dbline 20
;
; //端口初始化
; LCD_CONTROL_DDR=0xFF;
ldi R24,255
out 0x14,R24
.dbline 22
;
; CLRBIT(LCD_CONTROL_PORT,E);
cbi 0x15,3
.dbline 23
; CLRBIT(LCD_CONTROL_PORT,RW);
cbi 0x15,2
.dbline 24
; Delay_nms(1);
ldi R16,1
ldi R17,0
xcall _Delay_nms
.dbline 26
;
; LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
ldi R16,32
xcall _LCD_WriteCmd
.dbline 27
; LCD_WriteCmd(0x20); // 8bit I/F, basic command, graphic off
ldi R16,32
xcall _LCD_WriteCmd
.dbline 28
; LCD_WriteCmd(0x0C); // display on
ldi R16,12
xcall _LCD_WriteCmd
.dbline 29
; LCD_WriteCmd(0x06); // cursor right shift
ldi R16,6
xcall _LCD_WriteCmd
.dbline 31
;
; LCD_Clear(); // cursor right shift
xcall _LCD_Clear
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_Clear _LCD_Clear fV
.even
_LCD_Clear::
.dbline -1
.dbline 37
; }
;
;
; //LCD清屏
; void LCD_Clear(void)
; {
.dbline 38
; LCD_WriteCmd(0x01);
ldi R16,1
xcall _LCD_WriteCmd
.dbline 39
; Delay_nms(1); //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
ldi R16,1
ldi R17,0
xcall _Delay_nms
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_CheckState _LCD_CheckState fV
.even
_LCD_CheckState::
.dbline -1
.dbline 45
; }
;
;
; //状态检查函数,判断是否处于忙状态 //--保留
; void LCD_CheckState(void)
; {
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_Send _LCD_Send fV
; i -> R20
; senddata -> R16
.even
_LCD_Send::
st -y,R20
.dbline -1
.dbline 63
; /* unsigned char dat;
; CLRBIT(LCD_CONTROL_PORT,RS); //RS=0
; //SETBIT(LCD_CONTROL_PORT,RW); //RW=1
; LCD_DATA_DDR=0x00; // portA as input
; do
; {
; SETBIT(LCD_CONTROL_PORT,E);
; NOP();
; CLRBIT(LCD_CONTROL_PORT,E);
; }
; while (LCD_DATA_PIN&0x80);
; */
; }
;
;
; //对LCD写入数据的时序协议处理
; void LCD_Send(unsigned char senddata)
; {
.dbline 66
; unsigned char i;
;
; for(i=0;i<8;i++)
clr R20
xjmp L8
L5:
.dbline 67
; {
.dbline 68
; if((senddata)&0x80)
sbrs R16,7
rjmp L9
X0:
.dbline 69
; {
.dbline 71
; //D_OUT=1 ;
; SETBIT(LCD_CONTROL_PORT,RW);
sbi 0x15,2
.dbline 72
; }
xjmp L10
L9:
.dbline 74
; else
; {
.dbline 76
; //D_OUT=0;
; CLRBIT(LCD_CONTROL_PORT,RW);
cbi 0x15,2
.dbline 77
; }
L10:
.dbline 80
;
; //SCK=1;
; SETBIT(LCD_CONTROL_PORT,E);
sbi 0x15,3
.dbline 81
; NOP();
nop
.dbline 83
; //SCK=0;
; CLRBIT(LCD_CONTROL_PORT,E);
cbi 0x15,3
.dbline 85
;
; senddata<<=1;
lsl R16
.dbline 86
; }
L6:
.dbline 66
inc R20
L8:
.dbline 66
cpi R20,8
brlo L5
X1:
.dbline -2
L4:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r i 20 c
.dbsym r senddata 16 c
.dbend
.dbfunc e LCD_WriteCmd _LCD_WriteCmd fV
; scmd -> R20
.even
_LCD_WriteCmd::
st -y,R20
mov R20,R16
.dbline -1
.dbline 91
; }
;
; //写一个命令到LCD
; void LCD_WriteCmd(unsigned char scmd)
; {
.dbline 92
; LCD_Send(0xf8);
ldi R16,248
xcall _LCD_Send
.dbline 93
; LCD_Send(scmd&0xf0);
mov R16,R20
andi R16,240
xcall _LCD_Send
.dbline 94
; LCD_Send(scmd<<4);
mov R16,R20
andi R16,#0x0F
swap R16
xcall _LCD_Send
.dbline 95
; Delay_nus(20);
ldi R16,20
ldi R17,0
xcall _Delay_nus
.dbline -2
L11:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r scmd 20 c
.dbend
.dbfunc e LCD_WriteData _LCD_WriteData fV
; DData -> R20
.even
_LCD_WriteData::
st -y,R20
mov R20,R16
.dbline -1
.dbline 100
; }
;
; ////写一个数据到LCD
; void LCD_WriteData(unsigned char DData)
; {
.dbline 101
; LCD_Send(0xfa);
ldi R16,250
xcall _LCD_Send
.dbline 102
; LCD_Send(DData&0xf0);
mov R16,R20
andi R16,240
xcall _LCD_Send
.dbline 103
; LCD_Send(DData<<4);
mov R16,R20
andi R16,#0x0F
swap R16
xcall _LCD_Send
.dbline 104
; Delay_nus(20);
ldi R16,20
ldi R17,0
xcall _Delay_nus
.dbline -2
L12:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r DData 20 c
.dbend
.dbfunc e LCD_Set_xy _LCD_Set_xy fV
; i -> R20
; X -> R22
; Y -> R10
.even
_LCD_Set_xy::
xcall push_xgsetF00C
mov R22,R18
mov R10,R16
.dbline -1
.dbline 109
; }
;
; //设置光标位置,先Y坐标后X坐标
; void LCD_Set_xy(unsigned char Y, unsigned char X)
; {
.dbline 110
; unsigned char i=0x00;
clr R20
.dbline 111
; switch(Y & 0x0f) //确定行号
mov R24,R10
clr R25
andi R24,15
andi R25,0
movw R10,R24
cpi R24,0
cpc R24,R25
breq L17
X2:
cpi R24,1
ldi R30,0
cpc R25,R30
breq L18
X3:
cpi R24,2
ldi R30,0
cpc R25,R30
breq L19
X4:
cpi R24,3
ldi R30,0
cpc R25,R30
breq L20
X5:
xjmp L15
L17:
.dbline 114
; {
; case 0x00:
; i=0x80;
ldi R20,128
.dbline 115
; break;
xjmp L15
L18:
.dbline 117
; case 0x01:
; i=0x90;
ldi R20,144
.dbline 118
; break;
xjmp L15
L19:
.dbline 120
; case 0x02:
; i=0x88;
ldi R20,136
.dbline 121
; break;
xjmp L15
L20:
.dbline 123
; case 0x03:
; i=0x98;
ldi R20,152
.dbline 124
; break;
.dbline 126
; default :
; break;
L15:
.dbline 128
; }
; i = (X & 0x0f)|i; //确定列号
mov R24,R22
andi R24,15
or R20,R24
.dbline 129
; LCD_WriteCmd(i);
mov R16,R20
xcall _LCD_WriteCmd
.dbline -2
L13:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r i 20 c
.dbsym r X 22 c
.dbsym r Y 10 c
.dbend
.dbfunc e LCD_WriteChar _LCD_WriteChar fV
; c1 -> y+2
; Y -> R12
; X -> R10
.even
_LCD_WriteChar::
st -y,R10
st -y,R12
mov R12,R18
mov R10,R16
.dbline -1
.dbline 135
;
; }
;
; //写一个字符到LCD
; void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
; {
.dbline 138
; //从显示屏指定的行(Y),列(X)的位置写入字符
;
; LCD_WriteCmd(0x34); // 8bit I/F, basic command
ldi R16,52
xcall _LCD_WriteCmd
.dbline 139
; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
ldi R16,48
xcall _LCD_WriteCmd
.dbline 141
;
; LCD_Set_xy(X,Y);
mov R18,R12
mov R16,R10
xcall _LCD_Set_xy
.dbline 142
; LCD_WriteData(c1);
ldd R16,y+2
xcall _LCD_WriteData
.dbline 144
;
; Delay_nms(1); //2006.11.19
ldi R16,1
ldi R17,0
xcall _Delay_nms
.dbline -2
L21:
.dbline 0 ; func end
ld R12,y+
ld R10,y+
ret
.dbsym l c1 2 c
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfunc e LCD_WriteStr _LCD_WriteStr fV
; pstr -> R22,R23
; j -> R20
; pstr1 -> y+8
; Y -> R12
; X -> R10
.even
_LCD_WriteStr::
xcall push_xgsetF03C
mov R12,R18
mov R10,R16
.dbline -1
.dbline 149
; }
;
; //指定光标位置,写字符串到LCD显示
; void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
; {
.dbline 152
; //从显示屏指定的行(Y),列(X)的位置写入字符串
; unsigned char j;
; unsigned char *pstr = pstr1;
ldd R22,y+8
ldd R23,y+9
.dbline 154
;
; LCD_WriteCmd(0x34); // 8bit I/F, basic command
ldi R16,52
xcall _LCD_WriteCmd
.dbline 155
; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
ldi R16,48
xcall _LCD_WriteCmd
.dbline 157
;
; LCD_Set_xy(Y,X);
mov R18,R10
mov R16,R12
xcall _LCD_Set_xy
.dbline 159
;
; j=Y * LINEWIDTH + X;
ldi R24,18
mul R24,R12
mov R20,R0
add R20,R10
xjmp L24
L23:
.dbline 161
; while (*pstr && j< (LINEWIDTH * LINES))
; {
.dbline 162
; if (j%LINEWIDTH==0) //判断是否换行
ldi R17,18
mov R16,R20
xcall mod8u
tst R16
brne L26
X6:
.dbline 163
; {
.dbline 164
; LCD_Set_xy(j/LINEWIDTH,0); //如换行, 则光标移动到行首
clr R18
ldi R17,18
mov R16,R20
xcall div8u
xcall _LCD_Set_xy
.dbline 165
; }
L26:
.dbline 168
;
; //避免最后一格写半个汉字, 把汉字写到下一行
; if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
ldi R17,2
mov R16,R20
subi R16,255 ; addi 1
xcall mod8u
tst R16
brne L28
X7:
ldi R24,127
movw R30,R22
ldd R2,z+0
cp R24,R2
brsh L28
X8:
sbiw R30,1
ldd R24,z+0
cpi R24,128
brsh L28
X9:
.dbline 169
; {
.dbline 170
; LCD_WriteData(' ');
ldi R16,32
xcall _LCD_WriteData
.dbline 171
; j++;
inc R20
.dbline 172
; }
xjmp L29
L28:
.dbline 174
; else
; {
.dbline 175
; LCD_WriteData(*pstr++);
movw R30,R22
ld R16,Z+
movw R22,R30
xcall _LCD_WriteData
.dbline 176
; j++;
inc R20
.dbline 177
; }
L29:
.dbline 178
; }
L24:
.dbline 160
movw R30,R22
ldd R2,z+0
tst R2
breq L30
X10:
cpi R20,36
brsh X12
xjmp L23
X12:
X11:
L30:
.dbline 180
;
; Delay_nms(1); //2006.11.19
ldi R16,1
ldi R17,0
xcall _Delay_nms
.dbline -2
L22:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r pstr 22 pc
.dbsym r j 20 c
.dbsym l pstr1 8 pc
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfunc e LCD_WriteStrAuto _LCD_WriteStrAuto fV
; pstr -> R22,R23
; i -> R20
; j -> R20
; pstr1 -> R10,R11
.even
_LCD_WriteStrAuto::
xcall push_xgsetF00C
movw R10,R16
.dbline -1
.dbline 185
; }
;
; //从显示屏的初始位置写入字符串,自动换行
; void LCD_WriteStrAuto(unsigned char *pstr1)
; {
.dbline 188
; unsigned char i;
; unsigned char j;
; unsigned char *pstr = pstr1;
movw R22,R10
.dbline 190
;
; LCD_WriteCmd(0x34); // 8bit I/F, basic command
ldi R16,52
xcall _LCD_WriteCmd
.dbline 191
; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
ldi R16,48
xcall _LCD_WriteCmd
.dbline 193
;
; for(i=0;i<36;i++) //清空屏幕
clr R20
xjmp L35
L32:
.dbline 194
; {
.dbline 195
; if (i%18==0) //判断是否换行
ldi R17,18
mov R16,R20
xcall mod8u
tst R16
brne L36
X13:
.dbline 196
; {
.dbline 197
; LCD_Set_xy(i/18,0); //如换行, 则光标移动到行首
clr R18
ldi R17,18
mov R16,R20
xcall div8u
xcall _LCD_Set_xy
.dbline 198
; }
L36:
.dbline 200
;
; LCD_WriteData(' '); //
ldi R16,32
xcall _LCD_WriteData
.dbline 201
; }
L33:
.dbline 193
inc R20
L35:
.dbline 193
cpi R20,36
brlo L32
X14:
.dbline 203
;
; j=0;
clr R20
xjmp L39
L38:
.dbline 205
; while (*pstr && j<36)
; {
.dbline 206
; if (j%18==0) //判断是否换行
ldi R17,18
mov R16,R20
xcall mod8u
tst R16
brne L41
X15:
.dbline 207
; {
.dbline 208
; LCD_Set_xy(j/18,0); //如换行, 则光标移动到行首
clr R18
ldi R17,18
mov R16,R20
xcall div8u
xcall _LCD_Set_xy
.dbline 209
; }
L41:
.dbline 212
;
; //避免最后一格写半个汉字, 把汉字写到下一行
; if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
ldi R17,2
mov R16,R20
subi R16,255 ; addi 1
xcall mod8u
tst R16
brne L43
X16:
ldi R24,127
movw R30,R22
ldd R2,z+0
cp R24,R2
brsh L43
X17:
sbiw R30,1
ldd R24,z+0
cpi R24,128
brsh L43
X18:
.dbline 213
; {
.dbline 214
; LCD_WriteData(' '); //
ldi R16,32
xcall _LCD_WriteData
.dbline 215
; j++;
inc R20
.dbline 216
; }
xjmp L44
L43:
.dbline 218
; else
; {
.dbline 219
; LCD_WriteData(*pstr++);
movw R30,R22
ld R16,Z+
movw R22,R30
xcall _LCD_WriteData
.dbline 220
; j++;
inc R20
.dbline 221
; }
L44:
.dbline 222
; }
L39:
.dbline 204
movw R30,R22
ldd R2,z+0
tst R2
breq L45
X19:
cpi R20,36
brsh X21
xjmp L38
X21:
X20:
L45:
.dbline 224
;
; Delay_nms(1); //11.19
ldi R16,1
ldi R17,0
xcall _Delay_nms
.dbline -2
L31:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r pstr 22 pc
.dbsym r i 20 c
.dbsym r j 20 c
.dbsym r pstr1 10 pc
.dbend
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -