⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_1602_driver.lis

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -