📄 lcd1602.lis
字号:
0090 .dbline 71
0090 ; lcd_control_port&=~lcd_RS;//RS=0
0090 A898 cbi 0x15,0
0092 .dbline 72
0092 ; lcd_control_port|=lcd_RW;//RW=1
0092 A99A sbi 0x15,1
0094 .dbline 73
0094 ; NOP();
0094 0000 nop
0096 .dbline 74
0096 ; lcd_control_port|=lcd_EN;//E=1
0096 AA9A sbi 0x15,2
0098 L8:
0098 .dbline 75
0098 L9:
0098 .dbline 75
0098 ; while(lcd_busy_pin&busy);//等待LCD_DB7为0
0098 B799 sbic 0x16,7
009A FECF rjmp L8
009C .dbline 76
009C ; lcd_control_port&=~lcd_EN;//重设E=0
009C AA98 cbi 0x15,2
009E .dbline 77
009E ; lcd_busy_ddr|=busy;//设置busy口为输出
009E BF9A sbi 0x17,7
00A0 .dbline -2
00A0 L7:
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbend
00A2 .dbfunc e lcd_set_xy _lcd_set_xy fV
00A2 ; address -> R20
00A2 ; y -> R20
00A2 ; x -> R22
.even
00A2 _lcd_set_xy::
00A2 00D0 rcall push_gset2
00A4 422F mov R20,R18
00A6 602F mov R22,R16
00A8 .dbline -1
00A8 .dbline 84
00A8 ; }
00A8 ; /**LCD_set_xy:设置LCD显示的起始位置输入参数:x、y :
00A8 ; 显示字符串的位置,X:0-15,Y:0-1
00A8 ; LCD第一行显示寄存器地址:0X80-0X8F
00A8 ; LCD第一行显示寄存器地址:0XC0-0XCF ***/
00A8 ; void lcd_set_xy( unsigned char x, unsigned char y )
00A8 ; {
00A8 .dbline 86
00A8 ; unsigned char address;
00A8 ; if (y == 0)
00A8 4423 tst R20
00AA 19F4 brne L12
00AC .dbline 87
00AC ; address = 0x80 + x;
00AC 462F mov R20,R22
00AE 4058 subi R20,128 ; addi 128
00B0 02C0 rjmp L13
00B2 L12:
00B2 .dbline 89
00B2 ; else
00B2 ; address = 0xc0 + x;
00B2 462F mov R20,R22
00B4 4054 subi R20,64 ; addi 192
00B6 L13:
00B6 .dbline 90
00B6 ; lcd_write_command(address,1);//一定需要检查忙信号,所以为1
00B6 21E0 ldi R18,1
00B8 042F mov R16,R20
00BA CEDF rcall _lcd_write_command
00BC .dbline -2
00BC L11:
00BC 00D0 rcall pop_gset2
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r address 20 c
00C0 .dbsym r y 20 c
00C0 .dbsym r x 22 c
00C0 .dbend
00C0 .dbfunc e display_a_char _display_a_char fV
00C0 ; char_data -> y+4
00C0 ; y -> R22
00C0 ; x -> R20
.even
00C0 _display_a_char::
00C0 00D0 rcall push_gset2
00C2 622F mov R22,R18
00C4 402F mov R20,R16
00C6 .dbline -1
00C6 .dbline 94
00C6 ; }
00C6 ; //显示一个字符函数
00C6 ; void display_a_char(unsigned char x,unsigned char y,unsigned char char_data)//char_data为要显示的字符
00C6 ; {
00C6 .dbline 95
00C6 ; lcd_set_xy(x,y);
00C6 262F mov R18,R22
00C8 042F mov R16,R20
00CA EBDF rcall _lcd_set_xy
00CC .dbline 96
00CC ; lcd_write_data(char_data);
00CC 0C81 ldd R16,y+4
00CE D3DF rcall _lcd_write_data
00D0 .dbline -2
00D0 L14:
00D0 00D0 rcall pop_gset2
00D2 .dbline 0 ; func end
00D2 0895 ret
00D4 .dbsym l char_data 4 c
00D4 .dbsym r y 22 c
00D4 .dbsym r x 20 c
00D4 .dbend
00D4 .dbfunc e display_a_string _display_a_string fV
00D4 ; ptr -> R20,R21
00D4 ; y -> R10
00D4 ; x -> R22
.even
00D4 _display_a_string::
00D4 00D0 rcall push_gset3
00D6 A22E mov R10,R18
00D8 602F mov R22,R16
00DA 4E81 ldd R20,y+6
00DC 5F81 ldd R21,y+7
00DE .dbline -1
00DE .dbline 103
00DE ; }
00DE ;
00DE ; //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
00DE ; //显示一行连续字符串函数
00DE ;
00DE ; void display_a_string(unsigned char x,unsigned char y,unsigned char *ptr)
00DE ; {
00DE .dbline 105
00DE ; //ptr:指向无符号字符型变量的指针变量,指针也就是地址,指字符串数组的首指针
00DE ; lcd_set_xy(x,y);
00DE 2A2D mov R18,R10
00E0 062F mov R16,R22
00E2 DFDF rcall _lcd_set_xy
00E4 05C0 rjmp L17
00E6 L16:
00E6 .dbline 107
00E6 .dbline 108
00E6 FA01 movw R30,R20
00E8 0081 ldd R16,z+0
00EA C5DF rcall _lcd_write_data
00EC .dbline 109
00EC 4F5F subi R20,255 ; offset = 1
00EE 5F4F sbci R21,255
00F0 .dbline 110
00F0 L17:
00F0 .dbline 106
00F0 ; while(*ptr)//当ptr='\0'(空指针null)跳出循环
00F0 FA01 movw R30,R20
00F2 2080 ldd R2,z+0
00F4 2220 tst R2
00F6 B9F7 brne L16
00F8 .dbline -2
00F8 L15:
00F8 00D0 rcall pop_gset3
00FA .dbline 0 ; func end
00FA 0895 ret
00FC .dbsym r ptr 20 pc
00FC .dbsym r y 10 c
00FC .dbsym r x 22 c
00FC .dbend
00FC .dbfunc e display_a_fluid _display_a_fluid fV
00FC ; ptr -> R20,R21
00FC ; y -> R10
00FC ; x -> R22
.even
00FC _display_a_fluid::
00FC 00D0 rcall push_gset3
00FE A22E mov R10,R18
0100 602F mov R22,R16
0102 4E81 ldd R20,y+6
0104 5F81 ldd R21,y+7
0106 .dbline -1
0106 .dbline 114
0106 ; {
0106 ; lcd_write_data(*ptr);//*ptr,指向该地址的内容
0106 ; ptr++;
0106 ; }
0106 ; }
0106 ; /*********************流动字幕***********************/
0106 ; void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr)
0106 ; { lcd_write_command(0x07,1);//流动字幕
0106 .dbline 114
0106 21E0 ldi R18,1
0108 07E0 ldi R16,7
010A A6DF rcall _lcd_write_command
010C .dbline 115
010C ; lcd_set_xy(x,y);
010C 2A2D mov R18,R10
010E 062F mov R16,R22
0110 C8DF rcall _lcd_set_xy
0112 08C0 rjmp L21
0114 L20:
0114 .dbline 117
0114 .dbline 118
0114 FA01 movw R30,R20
0116 0081 ldd R16,z+0
0118 AEDF rcall _lcd_write_data
011A .dbline 119
011A 08EC ldi R16,200
011C 10E0 ldi R17,0
011E 00D0 rcall _delay_nms
0120 .dbline 120
0120 4F5F subi R20,255 ; offset = 1
0122 5F4F sbci R21,255
0124 .dbline 121
0124 L21:
0124 .dbline 116
0124 ; while(*ptr)
0124 FA01 movw R30,R20
0126 2080 ldd R2,z+0
0128 2220 tst R2
012A A1F7 brne L20
012C .dbline -2
012C L19:
012C 00D0 rcall pop_gset3
012E .dbline 0 ; func end
012E 0895 ret
0130 .dbsym r ptr 20 pc
0130 .dbsym r y 10 c
0130 .dbsym r x 22 c
0130 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -