📄 lcd.lis
字号:
0098 0000 nop
009A .dbline 83
009A ; lcd_control_port|=lcd_EN;//E=1
009A C39A sbi 0x18,3
009C .dbline 84
009C ; lcd_data_port=char_data;
009C 45BB out 0x15,R20
009E .dbline 85
009E ; lcd_control_port&=~lcd_EN;//重设E=0
009E C398 cbi 0x18,3
00A0 .dbline -2
00A0 L9:
00A0 0E940000 xcall pop_gset1
00A4 .dbline 0 ; func end
00A4 0895 ret
00A6 .dbsym r char_data 20 c
00A6 .dbend
00A6 .dbfunc e wait_enable _wait_enable fV
.even
00A6 _wait_enable::
00A6 .dbline -1
00A6 .dbline 91
00A6 ; }
00A6 ;
00A6 ; //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
00A6 ; //检测忙信号,等待LCD空闲函数
00A6 ; void wait_enable(void)
00A6 ; {
00A6 .dbline 92
00A6 ; lcd_busy_ddr&=~busy;//设置busy口为输入
00A6 A798 cbi 0x14,7
00A8 .dbline 93
00A8 ; lcd_control_port&=~lcd_RS;//RS=0
00A8 C598 cbi 0x18,5
00AA .dbline 94
00AA ; lcd_control_port|=lcd_RW;//RW=1
00AA C49A sbi 0x18,4
00AC .dbline 95
00AC ; NOP();
00AC 0000 nop
00AE .dbline 96
00AE ; lcd_control_port|=lcd_EN;//E=1
00AE C39A sbi 0x18,3
00B0 L11:
00B0 .dbline 97
00B0 L12:
00B0 .dbline 97
00B0 ; while(lcd_busy_pin&busy);//等待LCD_DB7为0
00B0 9F99 sbic 0x13,7
00B2 FECF rjmp L11
00B4 .dbline 98
00B4 ; lcd_control_port&=~lcd_EN;//重设E=0
00B4 C398 cbi 0x18,3
00B6 .dbline 99
00B6 ; lcd_busy_ddr|=busy;//设置busy口为输出
00B6 A79A sbi 0x14,7
00B8 .dbline -2
00B8 L10:
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbend
00BA .dbfunc e display_a_char _display_a_char fV
00BA ; position_tem -> R22
00BA ; char_data -> R20
00BA ; position -> R10
.even
00BA _display_a_char::
00BA 0E940000 xcall push_gset3
00BE 422F mov R20,R18
00C0 A02E mov R10,R16
00C2 .dbline -1
00C2 .dbline 105
00C2 ; }
00C2 ;
00C2 ; //指定位置显示一个字符:第一行位置0~15,第二行16~31
00C2 ; //显示一个字符函数
00C2 ; void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
00C2 ; {
00C2 .dbline 107
00C2 ; unsigned char position_tem;
00C2 ; if(position>=0x10)
00C2 8A2D mov R24,R10
00C4 8031 cpi R24,16
00C6 18F0 brlo L15
00C8 .dbline 108
00C8 ; position_tem=position+0xb0;
00C8 682F mov R22,R24
00CA 6055 subi R22,80 ; addi 176
00CC 02C0 xjmp L16
00CE L15:
00CE .dbline 110
00CE ; else
00CE ; position_tem=position+0x80;
00CE 6A2D mov R22,R10
00D0 6058 subi R22,128 ; addi 128
00D2 L16:
00D2 .dbline 111
00D2 ; lcd_write_command(position_tem,1);
00D2 21E0 ldi R18,1
00D4 062F mov R16,R22
00D6 C8DF xcall _lcd_write_command
00D8 .dbline 112
00D8 ; lcd_write_data(char_data);
00D8 042F mov R16,R20
00DA D7DF xcall _lcd_write_data
00DC .dbline -2
00DC L14:
00DC 0E940000 xcall pop_gset3
00E0 .dbline 0 ; func end
00E0 0895 ret
00E2 .dbsym r position_tem 22 c
00E2 .dbsym r char_data 20 c
00E2 .dbsym r position 10 c
00E2 .dbend
00E2 .dbfunc e display_a_string _display_a_string fV
00E2 ; col_tem -> R20
00E2 ; i -> R22
00E2 ; ptr -> R10,R11
00E2 ; col -> R20
.even
00E2 _display_a_string::
00E2 0E940000 xcall push_gset3
00E6 5901 movw R10,R18
00E8 402F mov R20,R16
00EA .dbline -1
00EA .dbline 118
00EA ; }
00EA ;
00EA ; //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
00EA ; //显示一行连续字符串函数
00EA ; void display_a_string(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
00EA ; {
00EA .dbline 120
00EA ; unsigned char col_tem,i;
00EA ; col_tem=col<<4;//若col为1(即在LCD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
00EA 842F mov R24,R20
00EC 8F70 andi R24,#0x0F
00EE 8295 swap R24
00F0 482F mov R20,R24
00F2 .dbline 121
00F2 ; for(i=0;i<16;i++)
00F2 6627 clr R22
00F4 0AC0 xjmp L21
00F6 L18:
00F6 .dbline 122
00F6 E62F mov R30,R22
00F8 FF27 clr R31
00FA EA0D add R30,R10
00FC FB1D adc R31,R11
00FE 2081 ldd R18,z+0
0100 242E mov R2,R20
0102 4F5F subi R20,255 ; addi 1
0104 022D mov R16,R2
0106 D9DF xcall _display_a_char
0108 L19:
0108 .dbline 121
0108 6395 inc R22
010A L21:
010A .dbline 121
010A 6031 cpi R22,16
010C A0F3 brlo L18
010E .dbline -2
010E L17:
010E 0E940000 xcall pop_gset3
0112 .dbline 0 ; func end
0112 0895 ret
0114 .dbsym r col_tem 20 c
0114 .dbsym r i 22 c
0114 .dbsym r ptr 10 pc
0114 .dbsym r col 20 c
0114 .dbend
0114 .dbfunc e delay_1ms _delay_1ms fV
0114 ; i -> R16,R17
.even
0114 _delay_1ms::
0114 .dbline -1
0114 .dbline 128
0114 ; display_a_char(col_tem++,*(ptr+i));
0114 ; }
0114 ;
0114 ; /*---------------------------------------延时函数-------------------------------------*/
0114 ; //1ms延时函数
0114 ; void delay_1ms(void)
0114 ; {
0114 .dbline 130
0114 0027 clr R16
0116 1127 clr R17
0118 02C0 xjmp L26
011A L23:
011A .dbline 130
011A L24:
011A .dbline 130
011A 0F5F subi R16,255 ; offset = 1
011C 1F4F sbci R17,255
011E L26:
011E .dbline 130
011E ; unsigned int i;
011E ; for(i=0;i<600;i++);
011E 0835 cpi R16,88
0120 E2E0 ldi R30,2
0122 1E07 cpc R17,R30
0124 D0F3 brlo L23
0126 .dbline -2
0126 L22:
0126 .dbline 0 ; func end
0126 0895 ret
0128 .dbsym r i 16 i
0128 .dbend
0128 .dbfunc e delay_nms _delay_nms fV
0128 ; i -> R20,R21
0128 ; n -> R22,R23
.even
0128 _delay_nms::
0128 0E940000 xcall push_gset2
012C B801 movw R22,R16
012E .dbline -1
012E .dbline 135
012E ; }
012E ;
012E ; //n ms延时函数
012E ; void delay_nms(unsigned int n)
012E ; {
012E .dbline 137
012E 4427 clr R20
0130 5527 clr R21
0132 03C0 xjmp L31
0134 L28:
0134 .dbline 137
0134 EFDF xcall _delay_1ms
0136 L29:
0136 .dbline 137
0136 4F5F subi R20,255 ; offset = 1
0138 5F4F sbci R21,255
013A L31:
013A .dbline 137
013A ; unsigned int i;
013A ; for(i=0;i<n;i++)delay_1ms();
013A 4617 cp R20,R22
013C 5707 cpc R21,R23
013E D0F3 brlo L28
0140 .dbline -2
0140 L27:
0140 0E940000 xcall pop_gset2
0144 .dbline 0 ; func end
0144 0895 ret
0146 .dbsym r i 20 i
0146 .dbsym r n 22 i
0146 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -