📄 lcd_1602_driver.s
字号:
std z+27,R19
.dbline 193
L38:
.dbline 189
dec R14
L40:
.dbline 189
clr R2
cp R2,R14
brsh X1
rjmp L37
X1:
.dbline 195
; {
; lcd[i]=dat%10+48;
; dat=dat/10;
; }
;
; for(i=1;i<11;i++)
clr R14
inc R14
rjmp L44
L41:
.dbline 196
; {
.dbline 197
; if(i==11-d)
ldi R24,11
ldd R0,y+22
sub R24,R0
cp R14,R24
brne L45
.dbline 198
; {
.dbline 199
; 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 L47
.dbline 200
; {}
.dbline 200
rjmp L48
L47:
.dbline 202
; else
; {data[add]=c;}
.dbline 202
ldi R24,<_data
ldi R25,>_data
lds R30,_add
clr R31
add R30,R24
adc R31,R25
std z+0,R10
.dbline 202
L48:
.dbline 203
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 204
; }
L45:
.dbline 205
; 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 L49
X2:
.dbline 206
; {
.dbline 207
; if(i>=(10-d))
ldi R24,10
ldd R0,y+22
sub R24,R0
cp R14,R24
brsh X3
rjmp L50
X3:
.dbline 208
; {
.dbline 209
; 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 L53
.dbline 210
; {}
.dbline 210
rjmp L54
L53:
.dbline 212
; else
; {data[add]=lcd[i];}
.dbline 212
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 212
L54:
.dbline 213
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 214
; }
.dbline 216
; else
; {}
.dbline 216
.dbline 217
; }
rjmp L50
L49:
.dbline 219
; else
; {
.dbline 220
; 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 L55
.dbline 221
; {}
.dbline 221
rjmp L56
L55:
.dbline 223
; else
; {data[add]=lcd[i];}
.dbline 223
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 223
L56:
.dbline 224
; add++;
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 225
; b=1;
clr R12
inc R12
.dbline 226
; }
L50:
.dbline 227
L42:
.dbline 195
inc R14
L44:
.dbline 195
mov R24,R14
cpi R24,11
brsh X4
rjmp L41
X4:
rjmp L58
L57:
.dbline 229
; }
; while (*s)
; {
.dbline 230
; 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 L60
.dbline 231
; {} //待写入的数相同的话
.dbline 231
rjmp L61
L60:
.dbline 232
; else{data[add]=*s;}//要显示的数据存入显存
.dbline 232
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 232
L61:
.dbline 233
movw R24,R8
adiw R24,1
movw R8,R24
.dbline 234
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 235
L58:
.dbline 228
movw R30,R8
lpm R30,Z
tst R30
brne L57
.dbline 236
; s ++;//指针加1
; add++;//显存地址加1
; }
; if(y==1)
ldd R24,y+20
cpi R24,1
brne L67
.dbline 237
; e+=16;
mov R24,R6
subi R24,240 ; addi 16
mov R6,R24
.dbline 238
; for(;e>=add;add++)
rjmp L67
L64:
.dbline 239
.dbline 239
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 239
L65:
.dbline 238
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
L67:
.dbline 238
lds R2,_add
cp R6,R2
brsh L64
.dbline 240
; {data[add]=' ';}
; LCD_updata;
clr R2
sts _new,R2
.dbline -2
L33:
adiw R28,10
rcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r c 10 c
.dbsym r b 12 c
.dbsym l lcd 0 A[10:10]c
.dbsym r i 14 c
.dbsym r e 6 c
.dbsym r s 8 pkc
.dbsym l dat 24 l
.dbsym l d 22 c
.dbsym l y 20 c
.dbsym r x 14 c
.dbend
.area lit(rom, con, rel)
L69:
.byte 0
.byte 0,0,0,0,0,0,0
.area text(rom, con, rel)
.dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
.dbfunc e LCD_write_time _LCD_write_time fV
; lcd -> y+0
; i -> R20
; z -> R22
; s -> y+18
; m -> y+16
; h -> y+14
; y -> R10
; x -> R20
.even
_LCD_write_time::
rcall push_gset3
mov R10,R18
mov R20,R16
sbiw R28,8
ldd R22,y+20
.dbline -1
.dbline 251
; }
; /*-----------------------------------------------------------------------
; LCD_write_time : 数字显示函数
;
; 输入参数:
; X、Y : 显示数据的起始的位置
; h,m,s :时,分,秒
; 编写日期 :2005-10-19
; -----------------------------------------------------------------------*/
; void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s,unsigned char z)
; {
.dbline 253
; unsigned char i;
; unsigned char lcd[8]={0};
ldi R24,<L69
ldi R25,>L69
movw R30,R28
ldi R16,8
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 254
; if(y<2)
mov R24,R10
cpi R24,2
brsh L70
.dbline 255
; add=y*16+x;//设置起始座标LCD_set_xy( X, Y );
ldi R24,16
mul R24,R10
mov R2,R0
add R2,R20
sts _add,R2
L70:
.dbline 256
; lcd[0]=h/10+48;
ldi R17,10
ldd R16,y+14
rcall div8u
mov R24,R16
subi R24,208 ; addi 48
std y+0,R24
.dbline 257
; lcd[1]=h%10+48;
ldi R17,10
ldd R16,y+14
rcall mod8u
mov R24,R16
subi R24,208 ; addi 48
std y+1,R24
.dbline 258
; lcd[2]=':';
ldi R24,58
std y+2,R24
.dbline 259
; lcd[3]=m/10+48;
ldi R17,10
ldd R16,y+16
rcall div8u
mov R24,R16
subi R24,208 ; addi 48
std y+3,R24
.dbline 260
; lcd[4]=m%10+48;
ldi R17,10
ldd R16,y+16
rcall mod8u
mov R24,R16
subi R24,208 ; addi 48
std y+4,R24
.dbline 261
; lcd[5]=':';
ldi R24,58
std y+5,R24
.dbline 262
; lcd[6]=s/10+48;
ldi R17,10
ldd R16,y+18
rcall div8u
mov R24,R16
subi R24,208 ; addi 48
std y+6,R24
.dbline 263
; lcd[7]=s%10+48;
ldi R17,10
ldd R16,y+18
rcall mod8u
mov R24,R16
subi R24,208 ; addi 48
std y+7,R24
.dbline 264
; if(z==5){if(lcd[7]%2)
cpi R22,5
brne L79
.dbline 264
.dbline 264
ldi R17,2
mov R16,R24
rcall mod8u
tst R16
breq L81
.dbline 265
; lcd[2]=':';
ldi R24,58
std y+2,R24
rjmp L82
L81:
.dbline 267
ldi R24,32
std y+2,R24
L82:
.dbline 267
; else
; lcd[2]=' ';}
L79:
.dbline 269
;
; for (i=0;i<z;i++)
clr R20
rjmp L89
L86:
.dbline 270
; {
.dbline 271
; if(lcd_data[add]==lcd[i])
movw R24,R28
mov R30,R20
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 L90
.dbline 272
; {}
.dbline 272
rjmp L91
L90:
.dbline 274
; else
; {data[add]=lcd[i];}
.dbline 274
movw R24,R28
mov R30,R20
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 274
L91:
.dbline 275
lds R24,_add
subi R24,255 ; addi 1
sts _add,R24
.dbline 276
L87:
.dbline 269
inc R20
L89:
.dbline 269
cp R20,R22
brlo L86
.dbline 277
; add++;
; }
; LCD_updata;
clr R2
sts _new,R2
.dbline -2
L68:
adiw R28,8
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l lcd 0 A[8:8]c
.dbsym r i 20 c
.dbsym r z 22 c
.dbsym l s 18 c
.dbsym l m 16 c
.dbsym l h 14 c
.dbsym r y 10 c
.dbsym r x 20 c
.dbend
.dbfunc e LCD_write_new _LCD_write_new fV
; address -> R20
; new_add -> R22
.even
_LCD_write_new::
rcall push_gset2
.dbline -1
.dbline 286
; }
; /*----------------------------------------------------
; LCD_write_new:写显存函数
; data[]:32字节的显存
; new:显存标号
; 编写日期:2005/10/18
; -----------------------------------------------------*/
; void LCD_write_new(void)
; {
.dbline 288
; unsigned char address;
; unsigned char new_add=1;//1表示要更新地址
ldi R22,1
rjmp L94
L93:
.dbline 290
; while(new<32)//显存共32个字节,标号从0--31
; {
.dbline 291
; if(new==16)//换行
lds R24,_new
cpi R24,16
brne L96
.dbline 292
; new_add=1;
ldi R22,1
L96:
.dbline 293
; if(data[new])//跳过为0的显存
ldi R24,<_data
ldi R25,>_data
lds R30,_new
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne X5
rjmp L98
X5:
.dbline 294
; {
.dbline 295
; if(new_add)//当new_add=0时表示无需更新地址
tst R22
breq L100
.dbline 296
; {
.dbline 297
; if(new>15)
ldi R24,15
lds R2,_new
cp R24,R2
brsh L102
.dbline 298
; address=0xb0+new;
mov R20,R2
subi R20,80 ; addi 176
rjmp L103
L102:
.dbline 300
; else
; address=0x80+new;
lds R20,_new
subi R20,128 ; addi 128
L103:
.dbline 301
; LCD_write_char(0,address);//设置起始地址
mov R18,R20
clr R19
clr R16
clr R17
rcall _LCD_write_char
.dbline 302
; }
L100:
.dbline 303
; LCD_write_char(1,data[new]);//写数据
ldi R24,<_data
ldi R25,>_data
lds R30,_new
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
ldi R16,1
ldi R17,0
rcall _LCD_write_char
.dbline 304
; lcd_data[new]=data[new];
ldi R24,<_data
ldi R25,>_data
lds R30,_new
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_lcd_data
ldi R25,>_lcd_data
lds R30,_new
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 305
; data[new]=0;//写完数据后,显存清0
ldi R24,<_data
ldi R25,>_data
lds R30,_new
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 306
; new_add=0;
clr R22
.dbline 307
; }
rjmp L99
L98:
.dbline 309
; else
; new_add=1;
ldi R22,1
L99:
.dbline 310
lds R24,_new
subi R24,255 ; addi 1
sts _new,R24
.dbline 311
L94:
.dbline 289
lds R24,_new
cpi R24,32
brsh X6
rjmp L93
X6:
.dbline -2
L92:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbsym r new_add 22 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
_add::
.blkb 1
.dbsym e add _add c
_data::
.blkb 32
.dbsym e data _data A[32:32]c
_lcd_data::
.blkb 32
.dbsym e lcd_data _lcd_data A[32:32]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -