📄 lcd_1602_driver.lis
字号:
013C _LCD_clear::
013C 00D0 rcall push_gset1
013E .dbline -1
013E .dbline 109
013E ; }
013E ; /*-----------------------------------------------------------------------
013E ; LCD_clear : 清除屏幕的函数
013E ;
013E ; 输入参数 :无
013E ; 编写日期 :2005/10/18
013E ; 说明 : lcd_data[]也会被清0
013E ; -----------------------------------------------------------------------*/
013E ; void LCD_clear(void)
013E ; {
013E .dbline 111
013E ; unsigned char i;
013E ; LCD_write_char(0,0x01);//显示清屏
013E 21E0 ldi R18,1
0140 30E0 ldi R19,0
0142 0027 clr R16
0144 1127 clr R17
0146 97DF rcall _LCD_write_char
0148 .dbline 112
0148 ; for(i=0;i<32;i++)
0148 4427 clr R20
014A 09C0 rjmp L18
014C L15:
014C .dbline 113
014C .dbline 114
014C 80E0 ldi R24,<_lcd_data
014E 90E0 ldi R25,>_lcd_data
0150 E42F mov R30,R20
0152 FF27 clr R31
0154 E80F add R30,R24
0156 F91F adc R31,R25
0158 2224 clr R2
015A 2082 std z+0,R2
015C .dbline 115
015C L16:
015C .dbline 112
015C 4395 inc R20
015E L18:
015E .dbline 112
015E 4032 cpi R20,32
0160 A8F3 brlo L15
0162 .dbline 116
0162 ; {
0162 ; lcd_data[i]=0;
0162 ; }
0162 ; delay_nus(500);
0162 04EF ldi R16,500
0164 11E0 ldi R17,1
0166 00D0 rcall _delay_nus
0168 .dbline -2
0168 L14:
0168 00D0 rcall pop_gset1
016A .dbline 0 ; func end
016A 0895 ret
016C .dbsym r i 20 c
016C .dbend
016C .dbfunc e LCD_write_string _LCD_write_string fV
016C ; e -> R20
016C ; s -> R22,R23
016C ; y -> R18
016C ; x -> R16
.even
016C _LCD_write_string::
016C 00D0 rcall push_gset2
016E 6C81 ldd R22,y+4
0170 7D81 ldd R23,y+5
0172 4E81 ldd R20,y+6
0174 .dbline -1
0174 .dbline 152
0174 ; }
0174 ; /*-----------------------------------------------------------------------
0174 ; LCD_check : 统计发送数据到LCD次数的函数
0174 ;
0174 ; 输入参数 :x,y 显示结果的座标
0174 ; 编写日期 :2005/10/18
0174 ; 说明 :如果每秒调用一次,就是统计每秒的次数
0174 ; -----------------------------------------------------------------------
0174 ; void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD
0174 ; //次数的函数
0174 ; {
0174 ; unsigned char i;
0174 ; unsigned char lcd[2]={0};
0174 ; add=y*16+x;//设置起始座标
0174 ; lcd[0]=num/10+48;
0174 ; lcd[1]=num%10+48;
0174 ; num=0;
0174 ; for (i=0;i<2;i++)
0174 ; {
0174 ; if(lcd_data[add]==lcd[i]){}
0174 ; else
0174 ; {data[add]=lcd[i];}
0174 ; add++;
0174 ; }
0174 ; LCD_updata;
0174 ; }*/
0174 ; /*-----------------------------------------------------------------------
0174 ; LCD_write_string : 英文字符串显示函数
0174 ;
0174 ; 输入参数:*s :英文字符串指针;
0174 ; X、Y : 显示字符串的位置
0174 ; e : 把从最后一个字符到x=e之间的内容删除
0174 ; 编写日期 :2005/10/18
0174 ; -----------------------------------------------------------------------*/
0174 ; void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
0174 ; {
0174 .dbline 153
0174 ; if(y<2)
0174 2230 cpi R18,2
0176 50F5 brsh L23
0178 .dbline 154
0178 ; add=y*16+x;//设置起始座标
0178 80E1 ldi R24,16
017A 829F mul R24,R18
017C 202C mov R2,R0
017E 200E add R2,R16
0180 20920000 sts _add,R2
0184 23C0 rjmp L23
0186 L22:
0186 .dbline 156
0186 ; while (*s)
0186 ; {
0186 .dbline 157
0186 ; if(lcd_data[add]==*s)//如果LCD上显示的数和
0186 80E0 ldi R24,<_lcd_data
0188 90E0 ldi R25,>_lcd_data
018A E0910000 lds R30,_add
018E FF27 clr R31
0190 E80F add R30,R24
0192 F91F adc R31,R25
0194 2080 ldd R2,z+0
0196 FB01 movw R30,R22
0198 E491 lpm R30,Z
019A 2E16 cp R2,R30
019C 09F4 brne L25
019E .dbline 158
019E ; {} //待写入的数相同的话
019E .dbline 158
019E 0FC0 rjmp L26
01A0 L25:
01A0 .dbline 159
01A0 ; else{data[add]=*s;}//要显示的数据存入显存
01A0 .dbline 159
01A0 80E0 ldi R24,<_data
01A2 90E0 ldi R25,>_data
01A4 E0910000 lds R30,_add
01A8 FF27 clr R31
01AA E80F add R30,R24
01AC F91F adc R31,R25
01AE DB01 movw R26,R22
01B0 FA93 st -y,R31
01B2 EA93 st -y,R30
01B4 FD01 movw R30,R26
01B6 A491 lpm R26,Z
01B8 E991 ld R30,y+
01BA F991 ld R31,y+
01BC A083 std z+0,R26
01BE .dbline 159
01BE L26:
01BE .dbline 160
01BE 6F5F subi R22,255 ; offset = 1
01C0 7F4F sbci R23,255
01C2 .dbline 161
01C2 80910000 lds R24,_add
01C6 8F5F subi R24,255 ; addi 1
01C8 80930000 sts _add,R24
01CC .dbline 162
01CC L23:
01CC .dbline 155
01CC FB01 movw R30,R22
01CE E491 lpm R30,Z
01D0 EE23 tst R30
01D2 C9F6 brne L22
01D4 .dbline 163
01D4 ; s ++;//指针加1
01D4 ; add++;//显存地址加1
01D4 ; }
01D4 ; if(y==1)
01D4 2130 cpi R18,1
01D6 81F4 brne L32
01D8 .dbline 164
01D8 ; e+=16;
01D8 405F subi R20,240 ; addi 16
01DA .dbline 165
01DA ; for(;e>=add;add++)
01DA 0EC0 rjmp L32
01DC L29:
01DC .dbline 166
01DC .dbline 166
01DC 80E0 ldi R24,<_data
01DE 90E0 ldi R25,>_data
01E0 E0910000 lds R30,_add
01E4 FF27 clr R31
01E6 E80F add R30,R24
01E8 F91F adc R31,R25
01EA 80E2 ldi R24,32
01EC 8083 std z+0,R24
01EE .dbline 166
01EE L30:
01EE .dbline 165
01EE 80910000 lds R24,_add
01F2 8F5F subi R24,255 ; addi 1
01F4 80930000 sts _add,R24
01F8 L32:
01F8 .dbline 165
01F8 20900000 lds R2,_add
01FC 4215 cp R20,R2
01FE 70F7 brsh L29
0200 .dbline 167
0200 ; {data[add]=' ';}
0200 ; LCD_updata;
0200 2224 clr R2
0202 20920000 sts _new,R2
0206 .dbline -2
0206 L19:
0206 00D0 rcall pop_gset2
0208 .dbline 0 ; func end
0208 0895 ret
020A .dbsym r e 20 c
020A .dbsym r s 22 pkc
020A .dbsym r y 18 c
020A .dbsym r x 16 c
020A .dbend
.area lit(rom, con, rel)
0000 L34:
0000 00 .byte 0
0001 000000000000000000 .byte 0,0,0,0,0,0,0,0,0
.area text(rom, con, rel)
020A .dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
020A .dbfunc e LCD_write_number _LCD_write_number fV
020A ; c -> R10
020A ; b -> R12
020A ; lcd -> y+0
020A ; i -> R14
020A ; e -> R6
020A ; s -> R8,R9
020A ; dat -> y+24
020A ; d -> y+22
020A ; y -> y+20
020A ; x -> R14
.even
020A _LCD_write_number::
020A 3A93 st -y,r19
020C 2A93 st -y,r18
020E 00D0 rcall push_gset5
0210 E02E mov R14,R16
0212 2A97 sbiw R28,10
0214 8C8C ldd R8,y+28
0216 9D8C ldd R9,y+29
0218 6E8C ldd R6,y+30
021A .dbline -1
021A .dbline 181
021A ; }
021A ; /*-----------------------------------------------------------------------
021A ; LCD_write_number : 数字显示函数
021A ;
021A ; 输入参数:
021A ; X、Y : 显示字符串的位置
021A ; d :在第d位插入小数点
021A ; data :要显示的数据 长整形
021A ; *s :数据的单位
021A ; e : 把从最后一个字符到x=e之间的内容删除
021A ; 编写日期 :2005/10/18
021A ; -----------------------------------------------------------------------*/
021A ; void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
021A ; {
021A .dbline 183
021A ; unsigned char i;
021A ; unsigned char b=0;
021A CC24 clr R12
021C .dbline 184
021C ; unsigned char c='.';
021C 8EE2 ldi R24,46
021E A82E mov R10,R24
0220 .dbline 185
0220 ; unsigned char lcd[10]={0};
0220 80E0 ldi R24,<L34
0222 90E0 ldi R25,>L34
0224 FE01 movw R30,R28
0226 0AE0 ldi R16,10
0228 10E0 ldi R17,0
022A FA93 st -y,R31
022C EA93 st -y,R30
022E 9A93 st -y,R25
0230 8A93 st -y,R24
0232 00D0 rcall asgncblk
0234 .dbline 186
0234 ; if(y<2)//如果Y>1则不重新计算地址
0234 8C89 ldd R24,y+20
0236 8230 cpi R24,2
0238 38F4 brsh L35
023A .dbline 187
023A ; add=y*16+x;//设置起始座标
023A 80E1 ldi R24,16
023C 0C88 ldd R0,y+20
023E 809D mul R24,R0
0240 202C mov R2,R0
0242 2E0C add R2,R14
0244 20920000 sts _add,R2
0248 L35:
0248 .dbline 189
0248 ;
0248 ; for (i=10;i>0;i--)
0248 8AE0 ldi R24,10
024A E82E mov R14,R24
024C 36C0 rjmp L40
024E L37:
024E .dbline 190
024E .dbline 191
024E 4AE0 ldi R20,10
0250 50E0 ldi R21,0
0252 60E0 ldi R22,0
0254 70E0 ldi R23,0
0256 FE01 movw R30,R28
0258 208C ldd R2,z+24
025A 318C ldd R3,z+25
025C 428C ldd R4,z+26
025E 538C ldd R5,z+27
0260 7A93 st -y,R23
0262 6A93 st -y,R22
0264 5A93 st -y,R21
0266 4A93 st -y,R20
0268 8101 movw R16,R2
026A 9201 movw R18,R4
026C 00D0 rcall mod32u
026E 1801 movw R2,R16
0270 2901 movw R4,R18
0272 40E3 ldi R20,48
0274 50E0 ldi R21,0
0276 60E0 ldi R22,0
0278 70E0 ldi R23,0
027A 240E add R2,R20
027C 351E adc R3,R21
027E 461E adc R4,R22
0280 571E adc R5,R23
0282 CE01 movw R24,R28
0284 EE2D mov R30,R14
0286 FF27 clr R31
0288 E80F add R30,R24
028A F91F adc R31,R25
028C 2082 std z+0,R2
028E .dbline 192
028E 4AE0 ldi R20,10
0290 50E0 ldi R21,0
0292 60E0 ldi R22,0
0294 70E0 ldi R23,0
0296 FE01 movw R30,R28
0298 208C ldd R2,z+24
029A 318C ldd R3,z+25
029C 428C ldd R4,z+26
029E 538C ldd R5,z+27
02A0 7A93 st -y,R23
02A2 6A93 st -y,R22
02A4 5A93 st -y,R21
02A6 4A93 st -y,R20
02A8 8101 movw R16,R2
02AA 9201 movw R18,R4
02AC 00D0 rcall div32u
02AE FE01 movw R30,R28
02B0 008F std z+24,R16
02B2 118F std z+25,R17
02B4 228F std z+26,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -