📄 lcd7920.lis
字号:
00F2 ; Y -> R12
00F2 ; X -> R10
.even
00F2 _LCD_WriteChar::
00F2 AA92 st -y,R10
00F4 CA92 st -y,R12
00F6 C22E mov R12,R18
00F8 A02E mov R10,R16
00FA .dbline -1
00FA .dbline 135
00FA ;
00FA ; }
00FA ;
00FA ; //写一个字符到LCD
00FA ; void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
00FA ; {
00FA .dbline 138
00FA ; //从显示屏指定的行(Y),列(X)的位置写入字符
00FA ;
00FA ; LCD_WriteCmd(0x34); // 8bit I/F, basic command
00FA 04E3 ldi R16,52
00FC B0DF xcall _LCD_WriteCmd
00FE .dbline 139
00FE ; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
00FE 00E3 ldi R16,48
0100 AEDF xcall _LCD_WriteCmd
0102 .dbline 141
0102 ;
0102 ; LCD_Set_xy(X,Y);
0102 2C2D mov R18,R12
0104 0A2D mov R16,R10
0106 CDDF xcall _LCD_Set_xy
0108 .dbline 142
0108 ; LCD_WriteData(c1);
0108 0A81 ldd R16,y+2
010A BADF xcall _LCD_WriteData
010C .dbline 144
010C ;
010C ; Delay_nms(1); //2006.11.19
010C 01E0 ldi R16,1
010E 10E0 ldi R17,0
0110 0E940000 xcall _Delay_nms
0114 .dbline -2
0114 L21:
0114 .dbline 0 ; func end
0114 C990 ld R12,y+
0116 A990 ld R10,y+
0118 0895 ret
011A .dbsym l c1 2 c
011A .dbsym r Y 12 c
011A .dbsym r X 10 c
011A .dbend
011A .dbfunc e LCD_WriteStr _LCD_WriteStr fV
011A ; pstr -> R22,R23
011A ; j -> R20
011A ; pstr1 -> y+8
011A ; Y -> R12
011A ; X -> R10
.even
011A _LCD_WriteStr::
011A 0E940000 xcall push_xgsetF03C
011E C22E mov R12,R18
0120 A02E mov R10,R16
0122 .dbline -1
0122 .dbline 149
0122 ; }
0122 ;
0122 ; //指定光标位置,写字符串到LCD显示
0122 ; void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
0122 ; {
0122 .dbline 152
0122 ; //从显示屏指定的行(Y),列(X)的位置写入字符串
0122 ; unsigned char j;
0122 ; unsigned char *pstr = pstr1;
0122 6885 ldd R22,y+8
0124 7985 ldd R23,y+9
0126 .dbline 154
0126 ;
0126 ; LCD_WriteCmd(0x34); // 8bit I/F, basic command
0126 04E3 ldi R16,52
0128 9ADF xcall _LCD_WriteCmd
012A .dbline 155
012A ; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
012A 00E3 ldi R16,48
012C 98DF xcall _LCD_WriteCmd
012E .dbline 157
012E ;
012E ; LCD_Set_xy(Y,X);
012E 2A2D mov R18,R10
0130 0C2D mov R16,R12
0132 B7DF xcall _LCD_Set_xy
0134 .dbline 159
0134 ;
0134 ; j=Y * LINEWIDTH + X;
0134 82E1 ldi R24,18
0136 8C9D mul R24,R12
0138 402D mov R20,R0
013A 4A0D add R20,R10
013C 25C0 xjmp L24
013E L23:
013E .dbline 161
013E ; while (*pstr && j< (LINEWIDTH * LINES))
013E ; {
013E .dbline 162
013E ; if (j%LINEWIDTH==0) //判断是否换行
013E 12E1 ldi R17,18
0140 042F mov R16,R20
0142 0E940000 xcall mod8u
0146 0023 tst R16
0148 31F4 brne L26
014A X6:
014A .dbline 163
014A ; {
014A .dbline 164
014A ; LCD_Set_xy(j/LINEWIDTH,0); //如换行, 则光标移动到行首
014A 2227 clr R18
014C 12E1 ldi R17,18
014E 042F mov R16,R20
0150 0E940000 xcall div8u
0154 A6DF xcall _LCD_Set_xy
0156 .dbline 165
0156 ; }
0156 L26:
0156 .dbline 168
0156 ;
0156 ; //避免最后一格写半个汉字, 把汉字写到下一行
0156 ; if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
0156 12E0 ldi R17,2
0158 042F mov R16,R20
015A 0F5F subi R16,255 ; addi 1
015C 0E940000 xcall mod8u
0160 0023 tst R16
0162 69F4 brne L28
0164 X7:
0164 8FE7 ldi R24,127
0166 FB01 movw R30,R22
0168 2080 ldd R2,z+0
016A 8215 cp R24,R2
016C 40F4 brsh L28
016E X8:
016E 3197 sbiw R30,1
0170 8081 ldd R24,z+0
0172 8038 cpi R24,128
0174 20F4 brsh L28
0176 X9:
0176 .dbline 169
0176 ; {
0176 .dbline 170
0176 ; LCD_WriteData(' ');
0176 00E2 ldi R16,32
0178 83DF xcall _LCD_WriteData
017A .dbline 171
017A ; j++;
017A 4395 inc R20
017C .dbline 172
017C ; }
017C 05C0 xjmp L29
017E L28:
017E .dbline 174
017E ; else
017E ; {
017E .dbline 175
017E ; LCD_WriteData(*pstr++);
017E FB01 movw R30,R22
0180 0191 ld R16,Z+
0182 BF01 movw R22,R30
0184 7DDF xcall _LCD_WriteData
0186 .dbline 176
0186 ; j++;
0186 4395 inc R20
0188 .dbline 177
0188 ; }
0188 L29:
0188 .dbline 178
0188 ; }
0188 L24:
0188 .dbline 160
0188 FB01 movw R30,R22
018A 2080 ldd R2,z+0
018C 2220 tst R2
018E 19F0 breq L30
0190 X10:
0190 4432 cpi R20,36
0192 08F4 brsh X12
0194 D4CF xjmp L23
0196 X12:
0196 X11:
0196 L30:
0196 .dbline 180
0196 ;
0196 ; Delay_nms(1); //2006.11.19
0196 01E0 ldi R16,1
0198 10E0 ldi R17,0
019A 0E940000 xcall _Delay_nms
019E .dbline -2
019E L22:
019E .dbline 0 ; func end
019E 0C940000 xjmp pop_xgsetF03C
01A2 .dbsym r pstr 22 pc
01A2 .dbsym r j 20 c
01A2 .dbsym l pstr1 8 pc
01A2 .dbsym r Y 12 c
01A2 .dbsym r X 10 c
01A2 .dbend
01A2 .dbfunc e LCD_WriteStrAuto _LCD_WriteStrAuto fV
01A2 ; pstr -> R22,R23
01A2 ; i -> R20
01A2 ; j -> R20
01A2 ; pstr1 -> R10,R11
.even
01A2 _LCD_WriteStrAuto::
01A2 0E940000 xcall push_xgsetF00C
01A6 5801 movw R10,R16
01A8 .dbline -1
01A8 .dbline 185
01A8 ; }
01A8 ;
01A8 ; //从显示屏的初始位置写入字符串,自动换行
01A8 ; void LCD_WriteStrAuto(unsigned char *pstr1)
01A8 ; {
01A8 .dbline 188
01A8 ; unsigned char i;
01A8 ; unsigned char j;
01A8 ; unsigned char *pstr = pstr1;
01A8 B501 movw R22,R10
01AA .dbline 190
01AA ;
01AA ; LCD_WriteCmd(0x34); // 8bit I/F, basic command
01AA 04E3 ldi R16,52
01AC 58DF xcall _LCD_WriteCmd
01AE .dbline 191
01AE ; LCD_WriteCmd(0x30); // 8bit I/F, basic command, graphic off
01AE 00E3 ldi R16,48
01B0 56DF xcall _LCD_WriteCmd
01B2 .dbline 193
01B2 ;
01B2 ; for(i=0;i<36;i++) //清空屏幕
01B2 4427 clr R20
01B4 0FC0 xjmp L35
01B6 L32:
01B6 .dbline 194
01B6 ; {
01B6 .dbline 195
01B6 ; if (i%18==0) //判断是否换行
01B6 12E1 ldi R17,18
01B8 042F mov R16,R20
01BA 0E940000 xcall mod8u
01BE 0023 tst R16
01C0 31F4 brne L36
01C2 X13:
01C2 .dbline 196
01C2 ; {
01C2 .dbline 197
01C2 ; LCD_Set_xy(i/18,0); //如换行, 则光标移动到行首
01C2 2227 clr R18
01C4 12E1 ldi R17,18
01C6 042F mov R16,R20
01C8 0E940000 xcall div8u
01CC 6ADF xcall _LCD_Set_xy
01CE .dbline 198
01CE ; }
01CE L36:
01CE .dbline 200
01CE ;
01CE ; LCD_WriteData(' '); //
01CE 00E2 ldi R16,32
01D0 57DF xcall _LCD_WriteData
01D2 .dbline 201
01D2 ; }
01D2 L33:
01D2 .dbline 193
01D2 4395 inc R20
01D4 L35:
01D4 .dbline 193
01D4 4432 cpi R20,36
01D6 78F3 brlo L32
01D8 X14:
01D8 .dbline 203
01D8 ;
01D8 ; j=0;
01D8 4427 clr R20
01DA 25C0 xjmp L39
01DC L38:
01DC .dbline 205
01DC ; while (*pstr && j<36)
01DC ; {
01DC .dbline 206
01DC ; if (j%18==0) //判断是否换行
01DC 12E1 ldi R17,18
01DE 042F mov R16,R20
01E0 0E940000 xcall mod8u
01E4 0023 tst R16
01E6 31F4 brne L41
01E8 X15:
01E8 .dbline 207
01E8 ; {
01E8 .dbline 208
01E8 ; LCD_Set_xy(j/18,0); //如换行, 则光标移动到行首
01E8 2227 clr R18
01EA 12E1 ldi R17,18
01EC 042F mov R16,R20
01EE 0E940000 xcall div8u
01F2 57DF xcall _LCD_Set_xy
01F4 .dbline 209
01F4 ; }
01F4 L41:
01F4 .dbline 212
01F4 ;
01F4 ; //避免最后一格写半个汉字, 把汉字写到下一行
01F4 ; if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
01F4 12E0 ldi R17,2
01F6 042F mov R16,R20
01F8 0F5F subi R16,255 ; addi 1
01FA 0E940000 xcall mod8u
01FE 0023 tst R16
0200 69F4 brne L43
0202 X16:
0202 8FE7 ldi R24,127
0204 FB01 movw R30,R22
0206 2080 ldd R2,z+0
0208 8215 cp R24,R2
020A 40F4 brsh L43
020C X17:
020C 3197 sbiw R30,1
020E 8081 ldd R24,z+0
0210 8038 cpi R24,128
0212 20F4 brsh L43
0214 X18:
0214 .dbline 213
0214 ; {
0214 .dbline 214
0214 ; LCD_WriteData(' '); //
0214 00E2 ldi R16,32
0216 34DF xcall _LCD_WriteData
0218 .dbline 215
0218 ; j++;
0218 4395 inc R20
021A .dbline 216
021A ; }
021A 05C0 xjmp L44
021C L43:
021C .dbline 218
021C ; else
021C ; {
021C .dbline 219
021C ; LCD_WriteData(*pstr++);
021C FB01 movw R30,R22
021E 0191 ld R16,Z+
0220 BF01 movw R22,R30
0222 2EDF xcall _LCD_WriteData
0224 .dbline 220
0224 ; j++;
0224 4395 inc R20
0226 .dbline 221
0226 ; }
0226 L44:
0226 .dbline 222
0226 ; }
0226 L39:
0226 .dbline 204
0226 FB01 movw R30,R22
0228 2080 ldd R2,z+0
022A 2220 tst R2
022C 19F0 breq L45
022E X19:
022E 4432 cpi R20,36
0230 08F4 brsh X21
0232 D4CF xjmp L38
0234 X21:
0234 X20:
0234 L45:
0234 .dbline 224
0234 ;
0234 ; Delay_nms(1); //11.19
0234 01E0 ldi R16,1
0236 10E0 ldi R17,0
0238 0E940000 xcall _Delay_nms
023C .dbline -2
023C L31:
023C .dbline 0 ; func end
023C 0C940000 xjmp pop_xgsetF00C
0240 .dbsym r pstr 22 pc
0240 .dbsym r i 20 c
0240 .dbsym r j 20 c
0240 .dbsym r pstr1 10 pc
0240 .dbend
0240 ; }
0240 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -