📄 lcd_1602_driver.lis
字号:
011A 0695 lsr R16
011C 0695 lsr R16
011E 0695 lsr R16
0120 0695 lsr R16
0122 0695 lsr R16
0124 00D0 rcall mod8u
0126 0023 tst R16
0128 11F0 breq L12
012A .dbline 93
012A ; LCD_D7_PORT |=LCD_D7;
012A 929A sbi 0x12,2
012C 01C0 rjmp L13
012E L12:
012E .dbline 95
012E ; else
012E ; LCD_D7_PORT &=~LCD_D7;
012E 9298 cbi 0x12,2
0130 L13:
0130 .dbline 97
0130 ;
0130 ; LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
0130 969A sbi 0x12,6
0132 .dbline 98
0132 ; delay_nus(25);
0132 09E1 ldi R16,25
0134 10E0 ldi R17,0
0136 00D0 rcall _delay_nus
0138 .dbline 99
0138 ; LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
0138 9698 cbi 0x12,6
013A .dbline 100
013A ; delay_nus(25);
013A 09E1 ldi R16,25
013C 10E0 ldi R17,0
013E 00D0 rcall _delay_nus
0140 .dbline -2
0140 L5:
0140 00D0 rcall pop_gset1
0142 .dbline 0 ; func end
0142 0895 ret
0144 .dbsym r data 20 c
0144 .dbend
0144 .dbfunc e LCD_clear _LCD_clear fV
0144 ; i -> R20
.even
0144 _LCD_clear::
0144 00D0 rcall push_gset1
0146 .dbline -1
0146 .dbline 110
0146 ; }
0146 ; /*-----------------------------------------------------------------------
0146 ; LCD_clear : 清除屏幕的函数
0146 ;
0146 ; 输入参数 :无
0146 ; 编写日期 :2005/10/18
0146 ; 说明 : lcd_data[]也会被清0
0146 ; -----------------------------------------------------------------------*/
0146 ; void LCD_clear(void)
0146 ; {
0146 .dbline 112
0146 ; unsigned char i;
0146 ; LCD_write_char(0,0x01);//显示清屏
0146 21E0 ldi R18,1
0148 30E0 ldi R19,0
014A 0027 clr R16
014C 1127 clr R17
014E 97DF rcall _LCD_write_char
0150 .dbline 113
0150 ; for(i=0;i<32;i++)
0150 4427 clr R20
0152 09C0 rjmp L18
0154 L15:
0154 .dbline 114
0154 .dbline 115
0154 80E0 ldi R24,<_lcd_data
0156 90E0 ldi R25,>_lcd_data
0158 E42F mov R30,R20
015A FF27 clr R31
015C E80F add R30,R24
015E F91F adc R31,R25
0160 2224 clr R2
0162 2082 std z+0,R2
0164 .dbline 116
0164 L16:
0164 .dbline 113
0164 4395 inc R20
0166 L18:
0166 .dbline 113
0166 4032 cpi R20,32
0168 A8F3 brlo L15
016A .dbline 117
016A ; {
016A ; lcd_data[i]=0;
016A ; }
016A ; delay_nus(500);
016A 04EF ldi R16,500
016C 11E0 ldi R17,1
016E 00D0 rcall _delay_nus
0170 .dbline -2
0170 L14:
0170 00D0 rcall pop_gset1
0172 .dbline 0 ; func end
0172 0895 ret
0174 .dbsym r i 20 c
0174 .dbend
.area lit(rom, con, rel)
0000 L20:
0000 00 .byte 0
0001 00 .byte 0
.area text(rom, con, rel)
0174 .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
0174 .dbfunc e LCD_check _LCD_check fV
0174 ; lcd -> y+0
0174 ; i -> R20
0174 ; y -> R22
0174 ; x -> R20
.even
0174 _LCD_check::
0174 00D0 rcall push_gset2
0176 622F mov R22,R18
0178 402F mov R20,R16
017A 2297 sbiw R28,2
017C .dbline -1
017C .dbline 128
017C ; }
017C ; /*-----------------------------------------------------------------------
017C ; LCD_check : 统计发送数据到LCD次数的函数
017C ;
017C ; 输入参数 :x,y 显示结果的座标
017C ; 编写日期 :2005/10/18
017C ; 说明 :如果每秒调用一次,就是统计每秒的次数
017C ; -----------------------------------------------------------------------*/
017C ; void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD
017C ; //次数的函数
017C ; {
017C .dbline 130
017C ; unsigned char i;
017C ; unsigned char lcd[2]={0};
017C 80E0 ldi R24,<L20
017E 90E0 ldi R25,>L20
0180 FE01 movw R30,R28
0182 02E0 ldi R16,2
0184 10E0 ldi R17,0
0186 FA93 st -y,R31
0188 EA93 st -y,R30
018A 9A93 st -y,R25
018C 8A93 st -y,R24
018E 00D0 rcall asgncblk
0190 .dbline 131
0190 ; add=y*16+x;//设置起始座标
0190 80E1 ldi R24,16
0192 869F mul R24,R22
0194 202C mov R2,R0
0196 240E add R2,R20
0198 20920000 sts _add,R2
019C .dbline 132
019C ; lcd[0]=num/10+48;
019C 2AE0 ldi R18,10
019E 30E0 ldi R19,0
01A0 00910100 lds R16,_num
01A4 10910200 lds R17,_num+1
01A8 00D0 rcall div16u
01AA C801 movw R24,R16
01AC C096 adiw R24,48
01AE 8883 std y+0,R24
01B0 .dbline 133
01B0 ; lcd[1]=num%10+48;
01B0 2AE0 ldi R18,10
01B2 30E0 ldi R19,0
01B4 00910100 lds R16,_num
01B8 10910200 lds R17,_num+1
01BC 00D0 rcall mod16u
01BE C801 movw R24,R16
01C0 C096 adiw R24,48
01C2 8983 std y+1,R24
01C4 .dbline 134
01C4 ; num=0;
01C4 2224 clr R2
01C6 3324 clr R3
01C8 30920200 sts _num+1,R3
01CC 20920100 sts _num,R2
01D0 .dbline 135
01D0 ; for (i=0;i<2;i++)
01D0 4427 clr R20
01D2 25C0 rjmp L25
01D4 L22:
01D4 .dbline 136
01D4 ; {
01D4 .dbline 137
01D4 ; if(lcd_data[add]==lcd[i]){}
01D4 CE01 movw R24,R28
01D6 E42F mov R30,R20
01D8 FF27 clr R31
01DA E80F add R30,R24
01DC F91F adc R31,R25
01DE 2080 ldd R2,z+0
01E0 80E0 ldi R24,<_lcd_data
01E2 90E0 ldi R25,>_lcd_data
01E4 E0910000 lds R30,_add
01E8 FF27 clr R31
01EA E80F add R30,R24
01EC F91F adc R31,R25
01EE 3080 ldd R3,z+0
01F0 3214 cp R3,R2
01F2 09F4 brne L26
01F4 .dbline 137
01F4 .dbline 137
01F4 0EC0 rjmp L27
01F6 L26:
01F6 .dbline 139
01F6 ; else
01F6 ; {data[add]=lcd[i];}
01F6 .dbline 139
01F6 CE01 movw R24,R28
01F8 E42F mov R30,R20
01FA FF27 clr R31
01FC E80F add R30,R24
01FE F91F adc R31,R25
0200 2080 ldd R2,z+0
0202 80E0 ldi R24,<_data
0204 90E0 ldi R25,>_data
0206 E0910000 lds R30,_add
020A FF27 clr R31
020C E80F add R30,R24
020E F91F adc R31,R25
0210 2082 std z+0,R2
0212 .dbline 139
0212 L27:
0212 .dbline 140
0212 80910000 lds R24,_add
0216 8F5F subi R24,255 ; addi 1
0218 80930000 sts _add,R24
021C .dbline 141
021C L23:
021C .dbline 135
021C 4395 inc R20
021E L25:
021E .dbline 135
021E 4230 cpi R20,2
0220 C8F2 brlo L22
0222 .dbline 142
0222 ; add++;
0222 ; }
0222 ; LCD_updata;
0222 2224 clr R2
0224 20920000 sts _new,R2
0228 .dbline -2
0228 L19:
0228 2296 adiw R28,2
022A 00D0 rcall pop_gset2
022C .dbline 0 ; func end
022C 0895 ret
022E .dbsym l lcd 0 A[2:2]c
022E .dbsym r i 20 c
022E .dbsym r y 22 c
022E .dbsym r x 20 c
022E .dbend
022E .dbfunc e LCD_write_string _LCD_write_string fV
022E ; e -> R20
022E ; s -> R22,R23
022E ; y -> R18
022E ; x -> R16
.even
022E _LCD_write_string::
022E 00D0 rcall push_gset2
0230 6C81 ldd R22,y+4
0232 7D81 ldd R23,y+5
0234 4E81 ldd R20,y+6
0236 .dbline -1
0236 .dbline 153
0236 ; }
0236 ; /*-----------------------------------------------------------------------
0236 ; LCD_write_string : 英文字符串显示函数
0236 ;
0236 ; 输入参数:*s :英文字符串指针;
0236 ; X、Y : 显示字符串的位置
0236 ; e : 把从最后一个字符到x=e之间的内容删除
0236 ; 编写日期 :2005/10/18
0236 ; -----------------------------------------------------------------------*/
0236 ; void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
0236 ; {
0236 .dbline 154
0236 ; if(y<2)
0236 2230 cpi R18,2
0238 50F5 brsh L32
023A .dbline 155
023A ; add=y*16+x;//设置起始座标
023A 80E1 ldi R24,16
023C 829F mul R24,R18
023E 202C mov R2,R0
0240 200E add R2,R16
0242 20920000 sts _add,R2
0246 23C0 rjmp L32
0248 L31:
0248 .dbline 157
0248 ; while (*s)
0248 ; {
0248 .dbline 158
0248 ; if(lcd_data[add]==*s)//如果LCD上显示的数和
0248 80E0 ldi R24,<_lcd_data
024A 90E0 ldi R25,>_lcd_data
024C E0910000 lds R30,_add
0250 FF27 clr R31
0252 E80F add R30,R24
0254 F91F adc R31,R25
0256 2080 ldd R2,z+0
0258 FB01 movw R30,R22
025A E491 lpm R30,Z
025C 2E16 cp R2,R30
025E 09F4 brne L34
0260 .dbline 159
0260 ; {} //待写入的数相同的话
0260 .dbline 159
0260 0FC0 rjmp L35
0262 L34:
0262 .dbline 160
0262 ; else{data[add]=*s;}//要显示的数据存入显存
0262 .dbline 160
0262 80E0 ldi R24,<_data
0264 90E0 ldi R25,>_data
0266 E0910000 lds R30,_add
026A FF27 clr R31
026C E80F add R30,R24
026E F91F adc R31,R25
0270 DB01 movw R26,R22
0272 FA93 st -y,R31
0274 EA93 st -y,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -