📄 lcd.lis
字号:
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 + -