📄 hzmmi.s
字号:
.dbline 229
clr R16
xcall _write_data_auto
.dbline 230
L44:
.dbline 227
subi R20,255 ; offset = 1
sbci R21,255
.dbline 227
cpi R20,64
ldi R30,31
cpc R21,R30
brlt L43
.dbline 231
; {
; write_data_auto(0x00);
; }
; write_order(0xb2);
ldi R16,178
xcall _write_order
.dbline -2
.dbline 232
; }
L42:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbfunc s write_data_auto _write_data_auto fI
; data -> R20
.even
_write_data_auto::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 235
;
; void write_data_auto(byte data)
; {
.dbline 236
; wait_disp_auto();
xcall _wait_disp_auto
.dbline 237
; write_data(data);
mov R16,R20
xcall _write_data
.dbline -2
.dbline 238
; }
L47:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbfunc s wait_disp_auto _wait_disp_auto fI
; flag -> R16
.even
_wait_disp_auto::
.dbline -1
.dbline 242
;
; //数据自动写状态忙等待
; void wait_disp_auto(void)
; {
.dbline 245
; byte flag;
;
; PORTA=0xff;
ldi R24,255
out 0x1b,R24
.dbline 246
; DDRA=0; //A口为输入
clr R2
out 0x1a,R2
.dbline 247
; PORTD|=LCD_ID; //CD=1
sbi 0x12,6
.dbline 248
; PORTD|=LCD_ID; //CD=1
sbi 0x12,6
.dbline 249
; PORTD&=~LCD_CS; //CE=0
cbi 0x12,5
.dbline 250
; PORTD&=~LCD_CS; //CE=0
cbi 0x12,5
.dbline 251
; PORTD&=~LCD_CS; //CE=0
cbi 0x12,5
.dbline 252
; for(;;)
L49:
.dbline 253
; {
.dbline 254
; flag=*(byte*)0x8000;
lds R16,32768
.dbline 255
; if(flag & LCD_BUSY_S3){ //判断液晶忙否?
sbrs R16,3
rjmp L49
.dbline 255
.dbline 256
; PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
in R24,0x12
ori R24,96
out 0x12,R24
.dbline 257
; PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
in R24,0x12
ori R24,96
out 0x12,R24
.dbline 258
; return;
.dbline 260
; }
; }
.dbline 252
.dbline 252
.dbline -2
L48:
.dbline 0 ; func end
ret
.dbsym r flag 16 c
.dbfunc s init_disp _init_disp fI
.even
_init_disp::
.dbline -1
.dbline 267
; }
;
;
;
; //对液晶初始化,清屏
; void init_disp(void)
; {
.dbline 268
; PORTD&=~LCD_RST; //LCD_RST=0
cbi 0x12,7
.dbline 269
; PORTD&=~LCD_RST; //LCD_RST=0
cbi 0x12,7
.dbline 270
; dlyms(2);
ldi R16,2
ldi R17,0
xcall _dlyms
.dbline 271
; PORTD|=LCD_RST; //LCD_RST=1
sbi 0x12,7
.dbline 272
; PORTD|=LCD_RST; //LCD_RST=1
sbi 0x12,7
.dbline 273
; dlyms(3);
ldi R16,3
ldi R17,0
xcall _dlyms
.dbline 274
; write_data(0x00); //设置图形显示首地址00H
clr R16
xcall _write_data
.dbline 275
; write_data(0x00);
clr R16
xcall _write_data
.dbline 276
; write_order(0x42);
ldi R16,66
xcall _write_order
.dbline 277
; dlyms(2);
ldi R16,2
ldi R17,0
xcall _dlyms
.dbline 278
; write_data(DIS_LEN); //设置图形显示区域宽度
ldi R16,32
xcall _write_data
.dbline 279
; write_data(00); //即一行显示所占字节数
clr R16
xcall _write_data
.dbline 280
; write_order(0x43);
ldi R16,67
xcall _write_order
.dbline 281
; dlyms(2);
ldi R16,2
ldi R17,0
xcall _dlyms
.dbline 282
; write_order(0xa7); //光标形状设置
ldi R16,167
xcall _write_order
.dbline 283
; write_order(0x80); //显示方式设置逻辑"或"合成
ldi R16,128
xcall _write_order
.dbline 284
; write_order(0x98); //显示开关设置,开图形和文本显示
ldi R16,152
xcall _write_order
.dbline -2
.dbline 285
; }
L55:
.dbline 0 ; func end
ret
.dbfunc s str_hz _str_hz fI
; lrow -> y+6
; aa -> y+4
; zk -> y+0
; lcol -> R22,R23
; dis_code -> R12
; pt -> y+11
; i -> R14
; w -> R10
; q -> y+10
; address1 -> y+8
; str -> R20,R21
; col -> R10
; row -> R12
.even
_str_hz::
xcall push_gset5
mov R10,R18
mov R12,R16
sbiw R28,13
ldd R20,y+23
ldd R21,y+24
.dbline -1
.dbline 289
;
; //显示汉字串及大ASCII串
; void str_hz(byte row,byte col,byte *str)
; {
.dbline 296
; byte q,w,i,dis_code;
; int address1,lrow,lcol;
; byte *pt;
; unsigned int aa;
; long zk;
;
; lrow=(row)%80; //设置行
ldi R18,80
ldi R19,0
mov R16,R12
clr R17
xcall mod16s
std y+6,R16
std y+7,R17
.dbline 297
; lcol=(col*8)%160; //列
ldi R18,160
ldi R19,0
mov R16,R10
clr R17
lsl R16
rol R17
lsl R16
rol R17
lsl R16
rol R17
xcall mod16s
movw R22,R16
.dbline 298
; for(;*str;)
xjmp L60
L57:
.dbline 299
; { //如果*str=0,则退出循环
.dbline 300
; if(*str<160) //如果是ASC码字符,<A0H
movw R30,R20
ldd R24,z+0
cpi R24,160
brlo X3
xjmp L61
X3:
.dbline 301
; {
.dbline 302
; q=(*str++);
movw R2,R20
movw R24,R2
adiw R24,1
movw R20,R24
movw R30,R2
ldd R2,z+0
std y+10,R2
.dbline 303
; if(q==13) //处理回车符
ldd R24,y+10
cpi R24,13
brne L63
.dbline 304
; {
.dbline 305
; lrow+=16; //换两行
ldd R24,y+6
ldd R25,y+7
adiw R24,16
std y+6,R24
std y+7,R25
.dbline 306
; lcol=0; //列的开始
clr R22
clr R23
.dbline 307
; continue;
xjmp L58
L63:
.dbline 309
; }
; if(q<0x20) continue; //为不可见字符,继续循环
ldd R24,y+10
cpi R24,32
brsh L65
.dbline 309
xjmp L58
L65:
.dbline 310
; zk=q*16l+0x100l+0x800l;
ldi R24,4
ldi R25,0
ldd R2,y+10
clr R3
clr R4
clr R5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
ldi R16,<L67
ldi R17,>L67
xcall lpm32
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
ldi R16,<L68
ldi R17,>L68
xcall lpm32
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 311
; lib_addr.l=zk<<2;
ldi R24,2
ldi R25,0
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
sts _lib_addr+1,R17
sts _lib_addr,R16
sts _lib_addr+2+1,R19
sts _lib_addr+2,R18
.dbline 312
; PORTF=lib_addr.bytes.a2 & 0x0f;
lds R24,_lib_addr+2
andi R24,15
sts 98,R24
.dbline 313
; aa=zk;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
std y+4,R2
std y+5,R3
.dbline 314
; aa=(aa & 0x3fff)|0xc000;
ldd R24,y+4
ldd R25,y+5
andi R25,63
ori R25,192
std y+4,R24
std y+5,R25
.dbline 315
; pt=(byte *)aa;
ldd R2,y+4
ldd R3,y+5
std y+11,R2
std y+12,R3
.dbline 316
; address1=lrow;
ldd R2,y+6
ldd R3,y+7
std y+8,R2
std y+9,R3
.dbline 317
; address1=DIS_LEN*address1+lcol/8;
ldi R18,8
ldi R19,0
movw R16,R22
xcall div16s
movw R2,R16
ldi R18,5
ldi R19,0
ldd R16,y+8
ldd R17,y+9
xcall lsl16
movw R4,R16
add R4,R2
adc R5,R3
std y+8,R4
std y+9,R5
.dbline 318
; address1=address1+START_ADDRESS; //+图形地址偏移量
.dbline 319
clr R14
xjmp L73
L70:
.dbline 319
.dbline 320
ldi R18,256
ldi R19,1
ldd R16,y+8
ldd R17,y+9
xcall div16s
std y+10,R16
.dbline 321
ldi R18,256
ldi R19,1
ldd R16,y+8
ldd R17,y+9
xcall mod16s
movw R10,R16
.dbline 323
mov R16,R10
xcall _write_data
.dbline 324
ldd R16,y+10
xcall _write_data
.dbline 326
ldi R16,36
xcall _write_order
.dbline 327
ldd R30,y+11
ldd R31,y+12
ldd R16,z+0
xcall _write_data
.dbline 328
ldi R16,192
xcall _write_order
.dbline 329
ldd R24,y+11
ldd R25,y+12
adiw R24,1
std y+11,R24
std y+12,R25
.dbline 330
ldd R24,y+8
ldd R25,y+9
adiw R24,32
std y+8,R24
std y+9,R25
.dbline 331
L71:
.dbline 319
inc R14
L73:
.dbline 319
; for(i=0;i<16;i++){
mov R24,R14
cpi R24,16
brlo L70
.dbline 332
; q=address1/0x100; //地址高位
; w=address1%0x100; //地址低位
;
; write_data(w); //送低地址
; write_data(q); //送高地址
;
; write_order(0x24); //设置显示RAM地址
; write_data(*pt);
; write_order(0x0c0); //设置一次写数据指令代码
; pt++;
; address1=address1+DIS_LEN; //地址调整到下一行
; }
; lcol=lcol+8; //
subi R22,248 ; offset = 8
sbci R23,255
.dbline 333
; if(lcol>=160)
cpi R22,160
ldi R30,0
cpc R23,R30
brge X4
xjmp L58
X4:
.dbline 334
; {
.dbline 335
; lrow+=16;
ldd R24,y+6
ldd R25,y+7
adiw R24,16
std y+6,R24
std y+7,R25
.dbline 336
; lcol=0;
clr R22
clr R23
.dbline 337
; }
.dbline 338
; continue;
xjmp L58
L61:
.dbline 341
; }
;
; q=(*str++)-160;
movw R2,R20
movw R24,R2
adiw R24,1
movw R20,R24
movw R30,R2
ldd R24,z+0
subi R24,160
std y+10,R24
.dbline 342
; if(*str==0) break;
movw R30,R20
ldd R2,z+0
tst R2
brne L76
.dbline 342
xjmp L59
L76:
.dbline 343
; w=(*str++)-161;
movw R2,R20
movw R24,R2
adiw R24,1
movw R20,R24
movw R30,R2
ldd R24,z+0
subi R24,161
mov R10,R24
.dbline 344
; if(q<=3) q--;
ldi R24,3
ldd R0,y+10
cp R24,R0
brlo L78
.dbline 344
dec R0
std y+10,R0
xjmp L79
L78:
.dbline 345
; else if(q==6) q-=3;
ldd R24,y+10
cpi R24,6
brne L80
.dbline 345
subi R24,3
std y+10,R24
xjmp L81
L80:
.dbline 346
; else q-=12;
ldd R24,y+10
subi R24,12
std y+10,R24
L81:
L79:
.dbline 348
; // zk=q;
; zk=(q*94l+w)*32l+0x100l+0x800l+0x1000l;
ldd R2,y+10
clr R3
clr R4
clr R5
ldi R16,<L82
ldi R17,>L82
xcall lpm32
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall mpy32s
movw R2,R16
movw R4,R18
mov R6,R10
clr R7
clr R8
clr R9
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
ldi R24,5
ldi R25,0
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R2,R16
movw R4,R18
ldi R16,<L67
ldi R17,>L67
xcall lpm32
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
ldi R16,<L68
ldi R17,>L68
xcall lpm32
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
ldi R16,<L83
ldi R17,>L83
xcall lpm32
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 349
; lib_addr.l=zk<<2;
ldi R24,2
ldi R25,0
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
sts _lib_addr+1,R17
sts _lib_addr,R16
sts _lib_addr+2+1,R19
sts _lib_addr+2,R18
.dbline 350
; PORTF=lib_addr.bytes.a2 & 0x0f;
lds R24,_lib_addr+2
andi R24,15
sts 98,R24
.dbline 351
; aa=(zk & 0x3fff) | 0xc000;
ldi R16,<L85
ldi R17,>L85
xcall lpm16
movw R30,R28
ldd R2,z+0
ldd R3,z+1
and R2,R16
and R3,R17
ldi R16,<L86
ldi R17,>L86
xcall lpm16
or R2,R16
or R3,R17
std y+4,R2
std y+5,R3
.dbline 352
; pt=(byte *)aa;
std y+11,R2
std y+12,R3
.dbline 355
;
; //汉字定位,行
; address1=lrow;
ldd R2,y+6
ldd R3,y+7
std y+8,R2
std y+9,R3
.dbline 356
; address1=DIS_LEN*address1+lcol/8;
ldi R18,8
ldi R19,0
movw R16,R22
xcall div16s
movw R2,R16
ldi R18,5
ldi R19,0
ldd R16,y+8
ldd R17,y+9
xcall lsl16
movw R4,R16
add R4,R2
adc R5,R3
std y+8,R4
std y+9,R5
.dbline 358
;
; if(lcol<145)
cpi R22,145
ldi R30,0
cpc R23,R30
brlt X5
xjmp L87
X5:
.dbline 359
; {
.dbline 360
; for(i=0;i<16;i++)
clr R14
xjmp L92
L89:
.dbline 361
.dbline 362
ldi R18,256
ldi R19,1
ldd R16,y+8
ldd R17,y+9
xcall div16s
std y+10,R16
.dbline 363
ldi R18,256
ldi R19,1
ldd R16,y+8
ldd R17,y+9
xcall mod16s
movw R10,R16
.dbline 364
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -