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

📄 1602.lis

📁 AVR MEGA16 控制 LCD(1602) 显示英文单词
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 0096 D998              cbi 0x1b,1
 0098                   .dbline 127
 0098           ;       lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
 0098 DA98              cbi 0x1b,2
 009A                   .dbline 128
 009A           ;       NOP();
 009A 0000              nop
 009C                   .dbline 129
 009C           ;       lcd_control_port|=lcd_EN;//E=1
 009C DA9A              sbi 0x1b,2
 009E                   .dbline 130
 009E           ;       lcd_data_port=char_data;
 009E 42BB              out 0x12,R20
 00A0                   .dbline 131
 00A0           ;       lcd_control_port&=~lcd_EN;//重设E=0
 00A0 DA98              cbi 0x1b,2
 00A2                   .dbline -2
 00A2                   .dbline 132
 00A2           ; }
 00A2           L9:
 00A2 0E940000          xcall pop_gset1
 00A6                   .dbline 0 ; func end
 00A6 0895              ret
 00A8                   .dbsym r char_data 20 c
 00A8                   .dbend
 00A8                   .dbfunc e wait_enable _wait_enable fV
                        .even
 00A8           _wait_enable::
 00A8                   .dbline -1
 00A8                   .dbline 146
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; 
 00A8           ; //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
 00A8           ; //检测忙信号,等待LCD空闲函数
 00A8           ; void wait_enable(void)
 00A8           ; {
 00A8                   .dbline 147
 00A8           ;       lcd_busy_ddr&=~busy;//设置busy口为输入
 00A8 8F98              cbi 0x11,7
 00AA                   .dbline 148
 00AA           ;       lcd_control_port&=~lcd_RS;//RS=0
 00AA D898              cbi 0x1b,0
 00AC                   .dbline 149
 00AC           ;       lcd_control_port|=lcd_RW;//RW=1
 00AC D99A              sbi 0x1b,1
 00AE                   .dbline 150
 00AE           ;       NOP();
 00AE 0000              nop
 00B0                   .dbline 151
 00B0           ;       lcd_control_port|=lcd_EN;//E=1
 00B0 DA9A              sbi 0x1b,2
 00B2           L11:
 00B2                   .dbline 152
 00B2           L12:
 00B2                   .dbline 152
 00B2           ;       while(lcd_busy_pin&busy);//等待LCD_DB7为0
 00B2 8799              sbic 0x10,7
 00B4 FECF              rjmp L11
 00B6                   .dbline 153
 00B6           ;       lcd_control_port&=~lcd_EN;//重设E=0
 00B6 DA98              cbi 0x1b,2
 00B8                   .dbline 154
 00B8           ;       lcd_busy_ddr|=busy;//设置busy口为输出
 00B8 8F9A              sbi 0x11,7
 00BA                   .dbline -2
 00BA                   .dbline 155
 00BA           ; }
 00BA           L10:
 00BA                   .dbline 0 ; func end
 00BA 0895              ret
 00BC                   .dbend
 00BC                   .dbfunc e display_a_char _display_a_char fV
 00BC           ;   position_tem -> R22
 00BC           ;      char_data -> R20
 00BC           ;       position -> R10
                        .even
 00BC           _display_a_char::
 00BC 0E940000          xcall push_gset3
 00C0 422F              mov R20,R18
 00C2 A02E              mov R10,R16
 00C4                   .dbline -1
 00C4                   .dbline 169
 00C4           ; 
 00C4           ; 
 00C4           ; 
 00C4           ; 
 00C4           ; 
 00C4           ; 
 00C4           ; 
 00C4           ; //指定位置显示一个字符:第一行位置0~15,第二行16~31
 00C4           ; //显示一个字符函数
 00C4           ; //LCD显示字符的位置,我是按附图的坐标安排的,参数position就是指图中的0~31,比如你要在第二行第三个位置显示“s”,你只要display_a_char(18,s)就可以了。 
 00C4           ;  
 00C4           ; // lcd_writecommand是用来指定显示寄存器地址亦即显示的地址的
 00C4           ; void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
 00C4           ; {
 00C4                   .dbline 171
 00C4           ;       unsigned char position_tem;
 00C4           ;       if(position>=0x10)
 00C4 8A2D              mov R24,R10
 00C6 8031              cpi R24,16
 00C8 18F0              brlo L15
 00CA                   .dbline 172
 00CA           ;       position_tem=position+0xb0;//因为LCD第一行显示寄存器地址0X80-0X8F,第二行显示寄存器地址:0XC0-0XCF,所以你的position〉=16位置时,即要写显示寄存器地址position+0xC0-16即是position+0xB0。
 00CA 6A2D              mov R22,R10
 00CC 6055              subi R22,80    ; addi 176
 00CE 02C0              xjmp L16
 00D0           L15:
 00D0                   .dbline 174
 00D0           ;       else
 00D0           ;       position_tem=position+0x80;//第一行显示
 00D0 6A2D              mov R22,R10
 00D2 6058              subi R22,128    ; addi 128
 00D4           L16:
 00D4                   .dbline 175
 00D4           ;       lcd_write_command(position_tem,1);
 00D4 21E0              ldi R18,1
 00D6 062F              mov R16,R22
 00D8 C8DF              xcall _lcd_write_command
 00DA                   .dbline 176
 00DA           ;       lcd_write_data(char_data);
 00DA 042F              mov R16,R20
 00DC D7DF              xcall _lcd_write_data
 00DE                   .dbline -2
 00DE                   .dbline 177
 00DE           ; }
 00DE           L14:
 00DE 0E940000          xcall pop_gset3
 00E2                   .dbline 0 ; func end
 00E2 0895              ret
 00E4                   .dbsym r position_tem 22 c
 00E4                   .dbsym r char_data 20 c
 00E4                   .dbsym r position 10 c
 00E4                   .dbend
 00E4                   .dbfunc e display_a_string _display_a_string fV
 00E4           ;        col_tem -> R20
 00E4           ;              i -> R22
 00E4           ;            ptr -> R10,R11
 00E4           ;            col -> R20
                        .even
 00E4           _display_a_string::
 00E4 0E940000          xcall push_gset3
 00E8 5901              movw R10,R18
 00EA 402F              mov R20,R16
 00EC                   .dbline -1
 00EC                   .dbline 188
 00EC           ; 
 00EC           ; 
 00EC           ; 
 00EC           ; 
 00EC           ; 
 00EC           ; 
 00EC           ; 
 00EC           ; //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
 00EC           ; //显示一行连续字符串函数
 00EC           ; void display_a_string(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
 00EC           ; {
 00EC                   .dbline 190
 00EC           ;       unsigned char col_tem,i;
 00EC           ;       col_tem=col<<4;//若col为1(即在LCD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
 00EC 842F              mov R24,R20
 00EE 8F70              andi R24,#0x0F
 00F0 8295              swap R24
 00F2 482F              mov R20,R24
 00F4                   .dbline 191
 00F4           ;       for(i=0;i<16;i++)
 00F4 6627              clr R22
 00F6 0AC0              xjmp L21
 00F8           L18:
 00F8                   .dbline 192
 00F8 E62F              mov R30,R22
 00FA FF27              clr R31
 00FC EA0D              add R30,R10
 00FE FB1D              adc R31,R11
 0100 2081              ldd R18,z+0
 0102 242E              mov R2,R20
 0104 4F5F              subi R20,255    ; addi 1
 0106 022D              mov R16,R2
 0108 D9DF              xcall _display_a_char
 010A           L19:
 010A                   .dbline 191
 010A 6395              inc R22
 010C           L21:
 010C                   .dbline 191
 010C 6031              cpi R22,16
 010E A0F3              brlo L18
 0110                   .dbline -2
 0110                   .dbline 193
 0110           ;       display_a_char(col_tem++,*(ptr+i));
 0110           ; }
 0110           L17:
 0110 0E940000          xcall pop_gset3
 0114                   .dbline 0 ; func end
 0114 0895              ret
 0116                   .dbsym r col_tem 20 c
 0116                   .dbsym r i 22 c
 0116                   .dbsym r ptr 10 pc
 0116                   .dbsym r col 20 c
 0116                   .dbend
 0116                   .dbfunc e delay_1ms _delay_1ms fV
 0116           ;              i -> R16,R17
                        .even
 0116           _delay_1ms::
 0116                   .dbline -1
 0116                   .dbline 205
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; 
 0116           ; /*---------------------------------------延时函数-------------------------------------*/
 0116           ; //1ms延时函数
 0116           ; void delay_1ms(void)
 0116           ; {
 0116                   .dbline 207
 0116 0027              clr R16
 0118 1127              clr R17
 011A 02C0              xjmp L26
 011C           L23:
 011C                   .dbline 207
 011C           L24:
 011C                   .dbline 207
 011C 0F5F              subi R16,255  ; offset = 1
 011E 1F4F              sbci R17,255
 0120           L26:
 0120                   .dbline 207
 0120           ;       unsigned int i;
 0120           ;       for(i=0;i<600;i++);
 0120 0835              cpi R16,88
 0122 E2E0              ldi R30,2
 0124 1E07              cpc R17,R30
 0126 D0F3              brlo L23
 0128                   .dbline -2
 0128                   .dbline 208
 0128           ; }
 0128           L22:
 0128                   .dbline 0 ; func end
 0128 0895              ret
 012A                   .dbsym r i 16 i
 012A                   .dbend
 012A                   .dbfunc e delay_nms _delay_nms fV
 012A           ;              i -> R20,R21
 012A           ;              n -> R22,R23
                        .even
 012A           _delay_nms::
 012A 0E940000          xcall push_gset2
 012E B801              movw R22,R16
 0130                   .dbline -1
 0130                   .dbline 212
 0130           ; 
 0130           ; //n ms延时函数
 0130           ; void delay_nms(unsigned int n)
 0130           ; {
 0130                   .dbline 214
 0130 4427              clr R20
 0132 5527              clr R21
 0134 03C0              xjmp L31
 0136           L28:
 0136                   .dbline 214
 0136 EFDF              xcall _delay_1ms
 0138           L29:
 0138                   .dbline 214
 0138 4F5F              subi R20,255  ; offset = 1
 013A 5F4F              sbci R21,255
 013C           L31:
 013C                   .dbline 214
 013C           ;       unsigned int i;
 013C           ;       for(i=0;i<n;i++)delay_1ms();
 013C 4617              cp R20,R22
 013E 5707              cpc R21,R23
 0140 D0F3              brlo L28
 0142                   .dbline -2
 0142                   .dbline 215
 0142           ; }
 0142           L27:
 0142 0E940000          xcall pop_gset2
 0146                   .dbline 0 ; func end
 0146 0895              ret
 0148                   .dbsym r i 20 i
 0148                   .dbsym r n 22 i
 0148                   .dbend

⌨️ 快捷键说明

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