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

📄 lcd.lis

📁 基于M16的字符液晶1602的驱动
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0356           ;     {
 0356                   .dbline 125
 0356           ;         *( datastr1 + (k-i) ) = '\0';
 0356 242E              mov R2,R20
 0358 3324              clr R3
 035A EA2D              mov R30,R10
 035C FF27              clr R31
 035E E219              sub R30,R2
 0360 F309              sbc R31,R3
 0362 CE01              movw R24,R28
 0364 0296              adiw R24,2
 0366 E80F              add R30,R24
 0368 F91F              adc R31,R25
 036A 2224              clr R2
 036C 2082              std z+0,R2
 036E                   .dbline 126
 036E           ;     }
 036E           L46:
 036E                   .dbline 128
 036E           ; 
 036E           ;     strcpy( datastr, datastr1 );
 036E 9E01              movw R18,R28
 0370 2E5F              subi R18,254  ; offset = 2
 0372 3F4F              sbci R19,255
 0374 0E8D              ldd R16,y+30
 0376 1F8D              ldd R17,y+31
 0378 0E940000          xcall _strcpy
 037C                   .dbline -2
 037C           L23:
 037C                   .dbline 0 ; func end
 037C 6096              adiw R28,16
 037E 0E940000          xcall pop_xgsetF0FC
 0382 2496              adiw R28,4
 0384 0895              ret
 0386                   .dbsym r flag2 12 c
 0386                   .dbsym r flag1 14 c
 0386                   .dbsym r k 10 c
 0386                   .dbsym l dataftmp 12 D
 0386                   .dbsym l datastr1 2 A[10:10]c
 0386                   .dbsym r i 20 c
 0386                   .dbsym r p 22 c
 0386                   .dbsym l datastr 30 pc
 0386                   .dbsym l dataf 26 D
 0386                   .dbend
 0386                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0386           _LCD_en_write::
 0386                   .dbline -1
 0386                   .dbline 139
 0386           ; }
 0386           ; //*********************************************************************************************
 0386           ; 
 0386           ; //==========================================
 0386           ; //函数名称:液晶模块使能
 0386           ; //函数作用: 使能液晶
 0386           ; //入口参数: 无
 0386           ; //返回类型:无
 0386           ; //==========================================
 0386           ; void LCD_en_write(void)
 0386           ; {
 0386                   .dbline 140
 0386           ;   EN_SET;
 0386 DB9A              sbi 0x1b,3
 0388                   .dbline 141
 0388           ;   delay_nus(4);
 0388 04E0              ldi R16,4
 038A 10E0              ldi R17,0
 038C 0E940000          xcall _delay_nus
 0390                   .dbline 142
 0390           ;   EN_CLR;
 0390 DB98              cbi 0x1b,3
 0392                   .dbline -2
 0392           L48:
 0392                   .dbline 0 ; func end
 0392 0895              ret
 0394                   .dbend
 0394                   .dbfunc e LCD_write_command _LCD_write_command fV
 0394           ;        command -> R20
                        .even
 0394           _LCD_write_command::
 0394 4A93              st -y,R20
 0396 402F              mov R20,R16
 0398                   .dbline -1
 0398                   .dbline 152
 0398           ; }
 0398           ; 
 0398           ; //==========================================
 0398           ; //函数名称:写指令
 0398           ; //函数作用:
 0398           ; //入口参数: 液晶指令command
 0398           ; //返回类型:无
 0398           ; //==========================================
 0398           ; void LCD_write_command(uchar command)
 0398           ; {
 0398                   .dbline 153
 0398           ;   delay_nus( 16 );
 0398 00E1              ldi R16,16
 039A 10E0              ldi R17,0
 039C 0E940000          xcall _delay_nus
 03A0                   .dbline 154
 03A0           ;   RS_CLR;
 03A0 DA98              cbi 0x1b,2
 03A2                   .dbline 155
 03A2           ;   DB &= 0X0F;           //清高四位
 03A2 8BB3              in R24,0x1b
 03A4 8F70              andi R24,15
 03A6 8BBB              out 0x1b,R24
 03A8                   .dbline 156
 03A8           ;   DB |= command & 0xf0; //写高四位
 03A8 842F              mov R24,R20
 03AA 807F              andi R24,240
 03AC 2BB2              in R2,0x1b
 03AE 282A              or R2,R24
 03B0 2BBA              out 0x1b,R2
 03B2                   .dbline 157
 03B2           ;   LCD_en_write();
 03B2 E9DF              xcall _LCD_en_write
 03B4                   .dbline 158
 03B4           ;   command=command << 4;   //低四位移到高四位
 03B4 842F              mov R24,R20
 03B6 8F70              andi R24,#0x0F
 03B8 8295              swap R24
 03BA 482F              mov R20,R24
 03BC                   .dbline 159
 03BC           ;   DB &= 0x0f;             //清高四位
 03BC 8BB3              in R24,0x1b
 03BE 8F70              andi R24,15
 03C0 8BBB              out 0x1b,R24
 03C2                   .dbline 160
 03C2           ;   DB |= command & 0xf0;   //写低四位
 03C2 842F              mov R24,R20
 03C4 807F              andi R24,240
 03C6 2BB2              in R2,0x1b
 03C8 282A              or R2,R24
 03CA 2BBA              out 0x1b,R2
 03CC                   .dbline 161
 03CC           ;   LCD_en_write();
 03CC DCDF              xcall _LCD_en_write
 03CE                   .dbline -2
 03CE           L49:
 03CE                   .dbline 0 ; func end
 03CE 4991              ld R20,y+
 03D0 0895              ret
 03D2                   .dbsym r command 20 c
 03D2                   .dbend
 03D2                   .dbfunc e LCD_write_data _LCD_write_data fV
 03D2           ;           DATA -> R20
                        .even
 03D2           _LCD_write_data::
 03D2 4A93              st -y,R20
 03D4 402F              mov R20,R16
 03D6                   .dbline -1
 03D6                   .dbline 172
 03D6           ;   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
 03D6           ; }
 03D6           ; 
 03D6           ; //==========================================
 03D6           ; //函数名称:写数据
 03D6           ; //函数作用:
 03D6           ; //入口参数: 数据DATA
 03D6           ; //返回类型:无
 03D6           ; //==========================================
 03D6           ; void LCD_write_data(uchar DATA)
 03D6           ; {
 03D6                   .dbline 173
 03D6           ;   delay_nus(16);
 03D6 00E1              ldi R16,16
 03D8 10E0              ldi R17,0
 03DA 0E940000          xcall _delay_nus
 03DE                   .dbline 174
 03DE           ;   RS_SET;           //RS=1
 03DE DA9A              sbi 0x1b,2
 03E0                   .dbline 175
 03E0           ;   DB &= 0X0f;       //清高四位
 03E0 8BB3              in R24,0x1b
 03E2 8F70              andi R24,15
 03E4 8BBB              out 0x1b,R24
 03E6                   .dbline 176
 03E6           ;   DB |= DATA&0xf0;  //写高四位
 03E6 842F              mov R24,R20
 03E8 807F              andi R24,240
 03EA 2BB2              in R2,0x1b
 03EC 282A              or R2,R24
 03EE 2BBA              out 0x1b,R2
 03F0                   .dbline 177
 03F0           ;   LCD_en_write();
 03F0 CADF              xcall _LCD_en_write
 03F2                   .dbline 178
 03F2           ;   DATA = DATA << 4; //低四位移到高四位
 03F2 842F              mov R24,R20
 03F4 8F70              andi R24,#0x0F
 03F6 8295              swap R24
 03F8 482F              mov R20,R24
 03FA                   .dbline 179
 03FA           ;   DB &= 0X0f;       //清高四位
 03FA 8BB3              in R24,0x1b
 03FC 8F70              andi R24,15
 03FE 8BBB              out 0x1b,R24
 0400                   .dbline 180
 0400           ;   DB |= DATA&0xf0;  //写低四位
 0400 842F              mov R24,R20
 0402 807F              andi R24,240
 0404 2BB2              in R2,0x1b
 0406 282A              or R2,R24
 0408 2BBA              out 0x1b,R2
 040A                   .dbline 181
 040A           ;   LCD_en_write();
 040A BDDF              xcall _LCD_en_write
 040C                   .dbline -2
 040C           L50:
 040C                   .dbline 0 ; func end
 040C 4991              ld R20,y+
 040E 0895              ret
 0410                   .dbsym r DATA 20 c
 0410                   .dbend
 0410                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0410           _LCD_init::
 0410                   .dbline -1
 0410                   .dbline 191
 0410           ; }
 0410           ; 
 0410           ; //==========================================
 0410           ; //函数名称:液晶初始化函数
 0410           ; //函数作用:
 0410           ; //入口参数: 无
 0410           ; //返回类型:无
 0410           ; //==========================================
 0410           ; void LCD_init( void )
 0410           ; {
 0410                   .dbline 192
 0410           ;   DB_DDR_OUT;
 0410                   .dbline 192
 0410 8AB3              in R24,0x1a
 0412 806F              ori R24,240
 0414 8ABB              out 0x1a,R24
 0416 8AB3              in R24,0x1a
 0418 8C60              ori R24,12
 041A 8ABB              out 0x1a,R24
 041C                   .dbline 192
 041C                   .dbline 192
 041C                   .dbline 193
 041C           ;   LCD_write_command(0x28);
 041C 08E2              ldi R16,40
 041E BADF              xcall _LCD_write_command
 0420                   .dbline 194
 0420           ;   LCD_en_write();           //********总结这里一定要加这液晶使能*********
 0420 B2DF              xcall _LCD_en_write
 0422                   .dbline 195
 0422           ;   delay_nus(20);
 0422 04E1              ldi R16,20
 0424 10E0              ldi R17,0
 0426 0E940000          xcall _delay_nus
 042A                   .dbline 196
 042A           ;   LCD_write_command(0x28);  //4位显示
 042A 08E2              ldi R16,40
 042C B3DF              xcall _LCD_write_command
 042E                   .dbline 197
 042E           ;   LCD_write_command(0x0c);  //显示开
 042E 0CE0              ldi R16,12
 0430 B1DF              xcall _LCD_write_command
 0432                   .dbline 198
 0432           ;   LCD_write_command(0x01);  //清屏
 0432 01E0              ldi R16,1
 0434 AFDF              xcall _LCD_write_command
 0436                   .dbline 199
 0436           ;   delay_nms(5);             //延时一定要长
 0436 05E0              ldi R16,5
 0438 10E0              ldi R17,0
 043A 0E940000          xcall _delay_nms
 043E                   .dbline -2
 043E           L51:
 043E                   .dbline 0 ; func end
 043E 0895              ret
 0440                   .dbend
 0440                   .dbfunc e LCD_set_rc _LCD_set_rc fV
 0440           ;        address -> R20
 0440           ;              c -> R22
 0440           ;              r -> R10
                        .even
 0440           _LCD_set_rc::
 0440 0E940000          xcall push_xgsetF00C
 0444 622F              mov R22,R18
 0446 A02E              mov R10,R16
 0448                   .dbline -1
 0448                   .dbline 209
 0448           ; }
 0448           ; 
 0448           ; //==========================================
 0448           ; //函数名称:写地址
 0448           ; //函数作用:
 0448           ; //入口参数: 行位置r, 列位置c
 0448           ; //返回类型:无
 0448           ; //==========================================
 0448           ; void LCD_set_rc( uchar r, uchar c )
 0448           ; {
 0448                   .dbline 212
 0448           ;     uchar address;
 0448           ; 
 0448           ;     if (r == 1)
 0448 8A2D              mov R24,R10
 044A 8130              cpi R24,1
 044C 19F4              brne L53
 044E           X16:
 044E                   .dbline 213
 044E           ;     address = 0x80 + c;
 044E 462F              mov R20,R22
 0450 4058              subi R20,128    ; addi 128
 0452 05C0              xjmp L54
 0454           L53:
 0454                   .dbline 214
 0454           ;     else if(r == 2)
 0454 8A2D              mov R24,R10
 0456 8230              cpi R24,2
 0458 11F4              brne L55
 045A           X17:
 045A                   .dbline 215
 045A           ;     address = 0xc0 + c;
 045A 462F              mov R20,R22
 045C 4054              subi R20,64    ; addi 192
 045E           L55:
 045E           L54:
 045E                   .dbline 217
 045E           ; 
 045E           ;     LCD_write_command( address );
 045E 042F              mov R16,R20
 0460 99DF              xcall _LCD_write_command
 0462                   .dbline -2
 0462           L52:
 0462                   .dbline 0 ; func end
 0462 0C940000          xjmp pop_xgsetF00C
 0466                   .dbsym r address 20 c
 0466                   .dbsym r c 22 c
 0466                   .dbsym r r 10 c
 0466                   .dbend
 0466                   .dbfunc e LCD_write_string _LCD_write_string fV
 0466           ;              s -> R20,R21
 0466           ;              c -> R12
 0466           ;              r -> R10
                        .even
 0466           _LCD_write_string::
 0466 0E940000          xcall push_xgset303C
 046A C22E              mov R12,R18
 046C A02E              mov R10,R16
 046E 4E81              ldd R20,y+6
 0470 5F81              ldd R21,y+7
 0472                   .dbline -1
 0472                   .dbline 228
 0472           ; }
 0472           ; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -