📄 hzmmi.lst
字号:
(0197)
(0198) void write_data(byte data)
(0199) {
(0200) byte *pt;
(0201)
(0202) wait_disp();
019E DFCD RCALL _wait_disp
(0203) PORTD&=~LCD_ID; //CD=0
019F 9896 CBI P12,6
(0204) PORTD&=~LCD_ID; //CD=0
01A0 9896 CBI P12,6
(0205) PORTD&=~LCD_ID; //CD=0
01A1 9896 CBI P12,6
(0206) PORTD&=~LCD_CS; //CS=0
01A2 9895 CBI P12,5
(0207) PORTD&=~LCD_CS; //CS=0
01A3 9895 CBI P12,5
(0208) PORTD&=~LCD_CS; //CS=0
01A4 9895 CBI P12,5
(0209) *(byte*)0x8000=data; //命令码
01A5 93408000 STS R20,0x8000
(0210) PORTD|=LCD_CS; //CS=1
01A7 9A95 SBI P12,5
(0211) PORTD|=LCD_CS; //CS=1
01A8 9A95 SBI P12,5
(0212) PORTD|=LCD_CS; //CS=1
01A9 9A95 SBI P12,5
(0213)
(0214) }
01AA 940E0555 CALL pop_gset1
01AC 9508 RET
_cls:
i --> R20
01AD 940E0552 CALL push_gset1
(0215)
(0216) //清屏
(0217) void cls(void)
(0218) {
(0219) int i;
(0220)
(0221) write_data(00); //设置显示储存器首地址
01AF 2700 CLR R16
01B0 DFEA RCALL _write_data
(0222) write_data(00);
01B1 2700 CLR R16
01B2 DFE8 RCALL _write_data
(0223) write_order(0x24);
01B3 E204 LDI R16,0x24
01B4 DFD1 RCALL _write_order
(0224) write_order(0xb0); //设置自动写方式
01B5 EB00 LDI R16,0xB0
01B6 DFCF RCALL _write_order
(0225) wait_disp();
01B7 DFB4 RCALL _wait_disp
(0226) for(i=0;i<8000;i++) //8k显示存储器填00
01B8 2744 CLR R20
01B9 2755 CLR R21
(0227) {
(0228) write_data_auto(0x00);
01BA 2700 CLR R16
01BB D00B RCALL _write_data_auto
(0229) }
01BC 5F4F SUBI R20,0xFF
01BD 4F5F SBCI R21,0xFF
01BE 3440 CPI R20,0x40
01BF E1EF LDI R30,0x1F
01C0 075E CPC R21,R30
01C1 F3C4 BLT 0x01BA
(0230) write_order(0xb2);
01C2 EB02 LDI R16,0xB2
01C3 DFC2 RCALL _write_order
(0231) }
01C4 940E0555 CALL pop_gset1
01C6 9508 RET
_write_data_auto:
data --> R20
01C7 940E0552 CALL push_gset1
01C9 2F40 MOV R20,R16
(0232)
(0233) void write_data_auto(byte data)
(0234) {
(0235) wait_disp_auto();
01CA D005 RCALL _wait_disp_auto
(0236) write_data(data);
01CB 2F04 MOV R16,R20
01CC DFCE RCALL _write_data
(0237) }
01CD 940E0555 CALL pop_gset1
01CF 9508 RET
(0238)
(0239) //数据自动写状态忙等待
(0240) void wait_disp_auto(void)
(0241) {
(0242) byte flag;
(0243)
(0244) PORTA=0xff;
_wait_disp_auto:
flag --> R16
01D0 EF8F LDI R24,0xFF
01D1 BB8B OUT P1B,R24
(0245) DDRA=0; //A口为输入
01D2 2422 CLR R2
01D3 BA2A OUT P1A,R2
(0246) PORTD|=LCD_ID; //CD=1
01D4 9A96 SBI P12,6
(0247) PORTD|=LCD_ID; //CD=1
01D5 9A96 SBI P12,6
(0248) PORTD&=~LCD_CS; //CE=0
01D6 9895 CBI P12,5
(0249) PORTD&=~LCD_CS; //CE=0
01D7 9895 CBI P12,5
(0250) PORTD&=~LCD_CS; //CE=0
01D8 9895 CBI P12,5
(0251) for(;;)
(0252) {
(0253) flag=*(byte*)0x8000;
01D9 91008000 LDS R16,0x8000
(0254) if(flag & LCD_BUSY_S3){ //判断液晶忙否?
01DB FF03 SBRS R16,3
01DC CFFC RJMP 0x01D9
(0255) PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
01DD B382 IN R24,P12
01DE 6680 ORI R24,0x60
01DF BB82 OUT P12,R24
(0256) PORTD|=LCD_CS|LCD_ID; //CE=1,ID=1
01E0 B382 IN R24,P12
01E1 6680 ORI R24,0x60
01E2 BB82 OUT P12,R24
(0257) return;
(0258) }
(0259) }
01E3 9508 RET
(0260) }
(0261)
(0262)
(0263)
(0264) //对液晶初始化,清屏
(0265) void init_disp(void)
(0266) {
(0267) PORTD&=~LCD_RST; //LCD_RST=0
_init_disp:
01E4 9897 CBI P12,7
(0268) PORTD&=~LCD_RST; //LCD_RST=0
01E5 9897 CBI P12,7
(0269) dlyms(2);
01E6 E002 LDI R16,2
01E7 E010 LDI R17,0
01E8 DF66 RCALL _dlyms
(0270) PORTD|=LCD_RST; //LCD_RST=1
01E9 9A97 SBI P12,7
(0271) PORTD|=LCD_RST; //LCD_RST=1
01EA 9A97 SBI P12,7
(0272) dlyms(3);
01EB E003 LDI R16,3
01EC E010 LDI R17,0
01ED DF61 RCALL _dlyms
(0273) write_data(0x00); //设置图形显示首地址00H
01EE 2700 CLR R16
01EF DFAB RCALL _write_data
(0274) write_data(0x00);
01F0 2700 CLR R16
01F1 DFA9 RCALL _write_data
(0275) write_order(0x42);
01F2 E402 LDI R16,0x42
01F3 DF92 RCALL _write_order
(0276) dlyms(2);
01F4 E002 LDI R16,2
01F5 E010 LDI R17,0
01F6 DF58 RCALL _dlyms
(0277) write_data(DIS_LEN); //设置图形显示区域宽度
01F7 E200 LDI R16,0x20
01F8 DFA2 RCALL _write_data
(0278) write_data(00); //即一行显示所占字节数
01F9 2700 CLR R16
01FA DFA0 RCALL _write_data
(0279) write_order(0x43);
01FB E403 LDI R16,0x43
01FC DF89 RCALL _write_order
(0280) dlyms(2);
01FD E002 LDI R16,2
01FE E010 LDI R17,0
01FF DF4F RCALL _dlyms
(0281) write_order(0xa7); //光标形状设置
0200 EA07 LDI R16,0xA7
0201 DF84 RCALL _write_order
(0282) write_order(0x80); //显示方式设置逻辑"或"合成
0202 E800 LDI R16,0x80
0203 DF82 RCALL _write_order
(0283) write_order(0x98); //显示开关设置,开图形和文本显示
0204 E908 LDI R16,0x98
0205 DF80 RCALL _write_order
(0284) }
0206 9508 RET
_str_hz:
lrow --> Y+6
aa --> Y+4
zk --> Y+0
lcol --> R22
dis_code --> R12
pt --> Y+11
i --> R14
w --> R10
q --> Y+10
address1 --> Y+8
str --> R20
col --> R10
row --> R12
0207 940E0575 CALL push_gset5
0209 2EA2 MOV R10,R18
020A 2EC0 MOV R12,R16
020B 972D SBIW R28,0xD
020C 894F LDD R20,23+Y
020D 8D58 LDD R21,24+Y
(0285)
(0286) //显示汉字串及大ASCII串
(0287) void str_hz(byte row,byte col,byte *str)
(0288) {
(0289) byte q,w,i,dis_code;
(0290) int address1,lrow,lcol;
(0291) byte *pt;
(0292) unsigned int aa;
(0293) long zk;
(0294)
(0295) lrow=(row)%80; //设置行
020E E520 LDI R18,0x50
020F E030 LDI R19,0
0210 2D0C MOV R16,R12
0211 2711 CLR R17
0212 940E0535 CALL mod16s
0214 830E STD R16,6+Y
0215 831F STD R17,7+Y
(0296) lcol=(col*8)%160; //列
0216 EA20 LDI R18,0xA0
0217 E030 LDI R19,0
0218 2D0A MOV R16,R10
0219 2711 CLR R17
021A 0F00 LSL R16
021B 1F11 ROL R17
021C 0F00 LSL R16
021D 1F11 ROL R17
021E 0F00 LSL R16
021F 1F11 ROL R17
0220 940E0535 CALL mod16s
0222 01B8 MOVW R22,R16
(0297) for(;*str;)
0223 C1C2 RJMP 0x03E6
(0298) { //如果*str=0,则退出循环
(0299) if(*str<160) //如果是ASC码字符,<A0H
0224 01FA MOVW R30,R20
0225 8180 LDD R24,0+Z
0226 3A80 CPI R24,0xA0
0227 F008 BCS 0x0229
0228 C0A9 RJMP 0x02D2
(0300) {
(0301) q=(*str++);
0229 011A MOVW R2,R20
022A 01C1 MOVW R24,R2
022B 9601 ADIW R24,1
022C 01AC MOVW R20,R24
022D 01F1 MOVW R30,R2
022E 8020 LDD R2,0+Z
022F 862A STD R2,10+Y
(0302) if(q==13) //处理回车符
0230 858A LDD R24,10+Y
0231 308D CPI R24,0xD
0232 F441 BNE 0x023B
(0303) {
(0304) lrow+=16; //换两行
0233 818E LDD R24,6+Y
0234 819F LDD R25,7+Y
0235 9640 ADIW R24,0x10
0236 838E STD R24,6+Y
0237 839F STD R25,7+Y
(0305) lcol=0; //列的开始
0238 2766 CLR R22
0239 2777 CLR R23
(0306) continue;
023A C1AB RJMP 0x03E6
(0307) }
(0308) if(q<0x20) continue; //为不可见字符,继续循环
023B 858A LDD R24,10+Y
023C 3280 CPI R24,0x20
023D F408 BCC 0x023F
023E C1A7 RJMP 0x03E6
(0309) zk=q*16l+0x100l+0x800l;
023F E084 LDI R24,4
0240 E090 LDI R25,0
0241 842A LDD R2,10+Y
0242 2433 CLR R3
0243 2444 CLR R4
0244 2455 CLR R5
0245 938A ST R24,-Y
0246 0181 MOVW R16,R2
0247 0192 MOVW R18,R4
0248 940E05A8 CALL lsl32
024A 0118 MOVW R2,R16
024B 0129 MOVW R4,R18
024C EA00 LDI R16,0xA0
024D E010 LDI R17,0
024E 940E0594 CALL lpm32
0250 0E20 ADD R2,R16
0251 1E31 ADC R3,R17
0252 1E42 ADC R4,R18
0253 1E53 ADC R5,R19
0254 E90C LDI R16,0x9C
0255 E010 LDI R17,0
0256 940E0594 CALL lpm32
0258 0E20 ADD R2,R16
0259 1E31 ADC R3,R17
025A 1E42 ADC R4,R18
025B 1E53 ADC R5,R19
025C 01FE MOVW R30,R28
025D 8220 STD R2,0+Z
025E 8231 STD R3,1+Z
025F 8242 STD R4,2+Z
0260 8253 STD R5,3+Z
(0310) lib_addr.l=zk<<2;
0261 E082 LDI R24,2
0262 E090 LDI R25,0
0263 938A ST R24,-Y
0264 0181 MOVW R16,R2
0265 0192 MOVW R18,R4
0266 940E05A8 CALL lsl32
0268 931001DC STS R17,_lib_addr+1
026A 930001DB STS R16,_lib_addr
026C 933001DE STS R19,_lib_addr+3
026E 932001DD STS R18,_lib_addr+2
(0311) PORTF=lib_addr.bytes.a2 & 0x0f;
0270 918001DD LDS R24,_lib_addr+2
0272 708F ANDI R24,0xF
0273 93800062 STS R24,0x62
(0312) aa=zk;
0275 01FE MOVW R30,R28
0276 8020 LDD R2,0+Z
0277 8031 LDD R3,1+Z
0278 822C STD R2,4+Y
0279 823D STD R3,5+Y
(0313) aa=(aa & 0x3fff)|0xc000;
027A 818C LDD R24,4+Y
027B 819D LDD R25,5+Y
027C 739F ANDI R25,0x3F
027D 6C90 ORI R25,0xC0
027E 838C STD R24,4+Y
027F 839D STD R25,5+Y
(0314) pt=(byte *)aa;
0280 802C LDD R2,4+Y
0281 803D LDD R3,5+Y
0282 862B STD R2,11+Y
0283 863C STD R3,12+Y
(0315) address1=lrow;
0284 802E LDD R2,6+Y
0285 803F LDD R3,7+Y
0286 8628 STD R2,8+Y
0287 8639 STD R3,9+Y
(0316) address1=DIS_LEN*address1+lcol/8;
0288 E028 LDI R18,0x8
0289 E030 LDI R19,0
028A 018B MOVW R16,R22
028B 940E0537 CALL div16s
028D 0118 MOVW R2,R16
028E E025 LDI R18,5
028F E030 LDI R19,0
0290 8508 LDD R16,8+Y
0291 8519 LDD R17,9+Y
0292 940E05C2 CALL lsl16
0294 0128 MOVW R4,R16
0295 0C42 ADD R4,R2
0296 1C53 ADC R5,R3
0297 8648 STD R4,8+Y
0298 8659 STD R5,9+Y
(0317) address1=address1+START_ADDRESS; //+图形地址偏移量
(0318) for(i=0;i<16;i++){
0299 24EE CLR R14
029A C025 RJMP 0x02C0
(0319) q=address1/0x100; //地址高位
029B E020 LDI R18,0
029C E031 LDI R19,1
029D 8508 LDD R16,8+Y
029E 8519 LDD R17,9+Y
029F 940E0537 CALL div16s
02A1 870A STD R16,10+Y
(0320) w=address1%0x100; //地址低位
02A2 E020 LDI R18,0
02A3 E031 LDI R19,1
02A4 8508 LDD R16,8+Y
02A5 8519 LDD R17,9+Y
02A6 940E0535 CALL mod16s
02A8 0158 MOVW R10,R16
(0321)
(0322) write_data(w); //送低地址
02A9 2D0A MOV R16,R10
02AA DEF0 RCALL _write_data
(0323) write_data(q); //送高地址
02AB 850A LDD R16,10+Y
02AC DEEE RCALL _write_data
(0324)
(0325) write_order(0x24); //设置显示RAM地址
02AD E204 LDI R16,0x24
02AE DED7 RCALL _write_order
(0326) write_data(*pt);
02AF 85EB LDD R30,11+Y
02B0 85FC LDD R31,12+Y
02B1 8100 LDD R16,0+Z
02B2 DEE8 RCALL _write_data
(0327) write_order(0x0c0); //设置一次写数据指令代码
02B3 EC00 LDI R16,0xC0
02B4 DED1 RCALL _write_order
(0328) pt++;
02B5 858B LDD R24,11+Y
02B6 859C LDD R25,12+Y
02B7 9601 ADIW R24,1
02B8 878B STD R24,11+Y
02B9 879C STD R25,12+Y
(0329) address1=address1+DIS_LEN; //地址调整到下一行
02BA 8588 LDD R24,8+Y
02BB 8599 LDD R25,9+Y
02BC 9680 ADIW R24,0x20
02BD 8788 STD R24,8+Y
02BE 8799 STD R25,9+Y
(0330) }
02BF 94E3 INC R14
02C0 2D8E MOV R24,R14
02C1 3180 CPI R24,0x10
02C2 F2C0 BCS 0x029B
(0331) lcol=lcol+8; //
02C3 5F68 SUBI R22,0xF8
02C4 4F7F SBCI R23,0xFF
(0332) if(lcol>=160)
02C5 3A60 CPI R22,0xA0
02C6 E0E0 LDI R30,0
02C7 077E CPC R23,R30
02C8 F40C BGE 0x02CA
02C9 C11C RJMP 0x03E6
(0333) {
(0334) lrow+=16;
02CA 818E LDD R24,6+Y
02CB 819F LDD R25,7+Y
02CC 9640 ADIW R24,0x10
02CD 838E STD R24,6+Y
02CE 839F STD R25,7+Y
(0335) lcol=0;
02CF 2766 CLR R22
02D0 2777 CLR R23
(0336) }
(0337) continue;
02D1 C114 RJMP 0x03E6
(0338) }
(0339)
(0340) q=(*str++)-160;
02D2 011A MOVW R2,R20
02D3 01C1 MOVW R24,R2
02D4 9601 ADIW R24,1
02D5 01AC MOVW R20,R24
02D6 01F1 MOVW R30,R2
02D7 8180 LDD R24,0+Z
02D8 5A80 SUBI R24,0xA0
02D9 878A STD R24,10+Y
(0341) if(*str==0) break;
02DA 01FA MOVW R30,R20
02DB 8020 LDD R2,0+Z
02DC 2022 TST R2
02DD F409 BNE 0x02DF
02DE C10C RJMP 0x03EB
(0342) w=(*str++)-161;
02DF 011A MOVW R2,R20
02E0 01C1 MOVW R24,R2
02E1 9601 ADIW R24,1
02E2 01AC MOVW R20,R24
02E3 01F1 MOVW R30,R2
02E4 8180 LDD R24,0+Z
02E5 5A81 SUBI R24,0xA1
02E6 2EA8 MOV R10,R24
(0343) if(q<=3) q--;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -