📄 lcd_1602_driver.s
字号:
ldd R20,y+6
.dbline -1
.dbline 153
; }
; /*-----------------------------------------------------------------------
; LCD_write_string : 英文字符串显示函数
;
; 输入参数:*s :英文字符串指针;
; X、Y : 显示字符串的位置
; e : 把从最后一个字符到x=e之间的内容删除
; 编写日期 :2005/10/18
; -----------------------------------------------------------------------*/
; void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
; {
.dbline 154
; if(y<2)
cpi R18,2
brsh L32
.dbline 155
; add=y*16+x;//设置起始座标
ldi R24,16
mul R24,R18
mov R2,R0
add R2,R16
sts _add,R2
rjmp L32
L31:
.dbline 157
; while (*s)
; {
.dbline 158
; if(lcd_data[add]==*s)//如果LCD上显示的数和
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R22
lpm R30,Z
cp R2,R30
brne L34
.dbline 159
; {} //待写入的数相同的话
.dbline 159
rjmp L35
L34:
.dbline 160
; else{data[add]=*s;}//要显示的数据存入显存
.dbline 160
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
movw R26,R22
st -y,R31
st -y,R30
movw R30,R26
lpm R26,Z
ld R30,y+
ld R31,y+
std z+0,R26
.dbline 160
L35:
.dbline 161
subi R22,255 ; offset = 1
sbci R23,255
.dbline 162
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 163
L32:
.dbline 156
movw R30,R22
lpm R30,Z
tst R30
brne L31
.dbline 164
; s ++;//指针加1
; add++;//显存地址加1
; }
; if(y==1)
cpi R18,1
brne L41
.dbline 165
; e+=16;
subi R20,240 ; addi 16
.dbline 166
; for(;e>=add;add++)
rjmp L41
L38:
.dbline 167
.dbline 167
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldi R24,32
std z+0,R24
.dbline 167
L39:
.dbline 166
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
L41:
.dbline 166
lds R2,_add
cp R20,R2
brsh L38
.dbline 168
; {data[add]=' ';}
; LCD_updata;
clr R2
sts _new,R2
.dbline -2
L28:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r e 20 c
.dbsym r s 22 pkc
.dbsym r y 18 c
.dbsym r x 16 c
.dbend
.area lit(rom, con, rel)
L43:
.byte 0
.byte 0,0,0,0,0,0,0,0,0
.area text(rom, con, rel)
.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
.dbfunc e LCD_write_number _LCD_write_number fV
; c -> R10
; b -> R12
; lcd -> y+0
; i -> R14
; e -> R6
; s -> R8,R9
; dat -> y+24
; d -> y+22
; y -> y+20
; x -> R14
.even
_LCD_write_number::
st -y,r19
st -y,r18
rcall push_gset5
mov R14,R16
sbiw R28,10
ldd R8,y+28
ldd R9,y+29
ldd R6,y+30
.dbline -1
.dbline 182
; }
; /*-----------------------------------------------------------------------
; LCD_write_number : 数字显示函数
;
; 输入参数:
; X、Y : 显示字符串的位置
; d :在第d位插入小数点
; data :要显示的数据 长整形
; *s :数据的单位
; e : 把从最后一个字符到x=e之间的内容删除
; 编写日期 :2005/10/18
; -----------------------------------------------------------------------*/
; void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
; {
.dbline 184
; unsigned char i;
; unsigned char b=0;
clr R12
.dbline 185
; unsigned char c='.';
ldi R24,46
mov R10,R24
.dbline 186
; unsigned char lcd[10]={0};
ldi R24,<L43
ldi R25,>L43
movw R30,R28
ldi R16,10
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 187
; if(y<2)//如果Y>1则不重新计算地址
ldd R24,y+20
cpi R24,2
brsh L44
.dbline 188
; add=y*16+x;//设置起始座标
ldi R24,16
ldd R0,y+20
mul R24,R0
mov R2,R0
add R2,R14
sts _add,R2
L44:
.dbline 190
;
; for (i=10;i>0;i--)
ldi R24,10
mov R14,R24
rjmp L49
L46:
.dbline 191
.dbline 192
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall mod32u
movw R2,R16
movw R4,R18
ldi R20,48
ldi R21,0
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 193
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
rcall div32u
movw R30,R28
std z+24,R16
std z+25,R17
std z+26,R18
std z+27,R19
.dbline 194
L47:
.dbline 190
dec R14
L49:
.dbline 190
clr R2
cp R2,R14
brsh X1
rjmp L46
X1:
.dbline 196
; {
; lcd[i]=dat%10+48;
; dat=dat/10;
; }
;
; for(i=1;i<11;i++)
clr R14
inc R14
rjmp L53
L50:
.dbline 197
; {
.dbline 198
; if(i==11-d)
ldi R24,11
ldd R0,y+22
sub R24,R0
cp R14,R24
brne L54
.dbline 199
; {
.dbline 200
; if(lcd_data[add]==c)
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
cp R2,R10
brne L56
.dbline 201
; {}
.dbline 201
rjmp L57
L56:
.dbline 203
; else
; {data[add]=c;}
.dbline 203
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
std z+0,R10
.dbline 203
L57:
.dbline 204
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 205
; }
L54:
.dbline 206
; if((lcd[i]-48+b)==0)
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
subi R24,48
add R24,R12
breq X2
rjmp L58
X2:
.dbline 207
; {
.dbline 208
; if(i>=(10-d))
ldi R24,10
ldd R0,y+22
sub R24,R0
cp R14,R24
brsh X3
rjmp L59
X3:
.dbline 209
; {
.dbline 210
; if(lcd_data[add]==lcd[i])
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R3,z+0
cp R3,R2
brne L62
.dbline 211
; {}
.dbline 211
rjmp L63
L62:
.dbline 213
; else
; {data[add]=lcd[i];}
.dbline 213
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 213
L63:
.dbline 214
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 215
; }
.dbline 217
; else
; {}
.dbline 217
.dbline 218
; }
rjmp L59
L58:
.dbline 220
; else
; {
.dbline 221
; if(lcd_data[add]==lcd[i])
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R3,z+0
cp R3,R2
brne L64
.dbline 222
; {}
.dbline 222
rjmp L65
L64:
.dbline 224
; else
; {data[add]=lcd[i];}
.dbline 224
movw R24,R28
mov R30,R14
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 224
L65:
.dbline 225
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 226
; b=1;
clr R12
inc R12
.dbline 227
; }
L59:
.dbline 228
L51:
.dbline 196
inc R14
L53:
.dbline 196
mov R24,R14
cpi R24,11
brsh X4
rjmp L50
X4:
rjmp L67
L66:
.dbline 230
; }
; while (*s)
; {
.dbline 231
; if(lcd_data[add]==*s)//如果LCD上显示的数和
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R30,R8
lpm R30,Z
cp R2,R30
brne L69
.dbline 232
; {} //待写入的数相同的话
.dbline 232
rjmp L70
L69:
.dbline 233
; else{data[add]=*s;}//要显示的数据存入显存
.dbline 233
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
movw R26,R8
st -y,R31
st -y,R30
movw R30,R26
lpm R26,Z
ld R30,y+
ld R31,y+
std z+0,R26
.dbline 233
L70:
.dbline 234
movw R24,R8
adiw R24,1
movw R8,R24
.dbline 235
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 236
L67:
.dbline 229
movw R30,R8
lpm R30,Z
tst R30
brne L66
.dbline 237
; s ++;//指针加1
; add++;//显存地址加1
; }
; if(y==1)
ldd R24,y+20
cpi R24,1
brne L76
.dbline 238
; e+=16;
mov R24,R6
subi R24,240 ; addi 16
mov R6,R24
.dbline 239
; for(;e>=add;add++)
rjmp L76
L73:
.dbline 240
.dbline 240
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
ldi R24,32
std z+0,R24
.dbline 240
L74:
.dbline 239
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
L76:
.dbline 239
lds R2,_add
cp R6,R2
brsh L73
.dbline 241
; {data[add]=' ';}
; LCD_updata;
clr R2
sts _new,R2
.dbline -2
L42:
adiw R28,10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -