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

📄 1602b_lcd.lis

📁 iccavr下
💻 LIS
字号:
                        .module _1602B_LCD.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\电子资料\avrtest\1602六线接法练习\1602B_LCD.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 23
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "1602LCD.h"
 0000           ; 
 0000           ; 
 0000           ; unsigned data_temp;
 0000           ; /**********************************************************
 0000           ; 光标命令
 0000           ; LCD_write_char(0x0e,0);    //光标开
 0000           ; LCD_write_char(0x0d,0);    //光标所在字符闪烁  
 0000           ; LCD_write_char(0x0c,0);    //光标关  
 0000           ; **********************************************************/
 0000           ; /**********************************************************
 0000           ; TC1602B LCD DISPLAY
 0000           ; 建立时间:2003年11月9号
 0000           ; 修改日期:2003年11月14号
 0000           ; LCD_write函数功能:当command=1时,向LCD写入数据,否则向LCD写
 0000           ;                    入命令
 0000           ; LCD第一行显示寄存器地址:0X80-0X8F
 0000           ; LCD第二行显示寄存器地址:0XC0-0XCF
 0000           ; **********************************************************/
 0000           ; void LCD_init(void)
 0000           ;   {
 0000                   .dbline 24
 0000           ;     LCD_write_char(0,0x28);      //4bit test
 0000 28E2              ldi R18,40
 0002 30E0              ldi R19,0
 0004 0027              clr R16
 0006 1127              clr R17
 0008 0FD0              xcall _LCD_write_char
 000A                   .dbline 25
 000A           ;     LCD_write_char(0,0x0c);      //显示开
 000A 2CE0              ldi R18,12
 000C 30E0              ldi R19,0
 000E 0027              clr R16
 0010 1127              clr R17
 0012 0AD0              xcall _LCD_write_char
 0014                   .dbline 26
 0014           ;     LCD_write_char(0,0x01);      //显示清屏
 0014 21E0              ldi R18,1
 0016 30E0              ldi R19,0
 0018 0027              clr R16
 001A 1127              clr R17
 001C 05D0              xcall _LCD_write_char
 001E                   .dbline 27
 001E           ;       delay_nms(2);
 001E 02E0              ldi R16,2
 0020 10E0              ldi R17,0
 0022 0E940000          xcall _delay_nms
 0026                   .dbline -2
 0026           L1:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbend
 0028                   .dbfunc e LCD_write_char _LCD_write_char fV
 0028           ;           data -> R20,R21
 0028           ;        command -> R22,R23
                        .even
 0028           _LCD_write_char::
 0028 0E940000          xcall push_gset2
 002C A901              movw R20,R18
 002E B801              movw R22,R16
 0030                   .dbline -1
 0030                   .dbline 41
 0030           ;   }
 0030           ; /*-----------------------------------------------------------------------
 0030           ; LCD_write_char    : 英文字符串显示函数
 0030           ; 
 0030           ; 输入参数:*s      :英文字符串指针;
 0030           ;           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
 0030           ;                     LCD第一行显示寄存器地址:0X80-0X8F
 0030           ;                     LCD第一行显示寄存器地址:0XC0-0XCF
 0030           ; 
 0030           ; 编写日期          :2003-11-19 
 0030           ; 最后修改日期      :2004-8-19                 
 0030           ; -----------------------------------------------------------------------*/
 0030           ; void LCD_write_char(unsigned command,unsigned data)
 0030           ;   {       
 0030                   .dbline 42
 0030           ;     if (command == 0)
 0030 6030              cpi R22,0
 0032 6707              cpc R22,R23
 0034 11F4              brne L3
 0036           X0:
 0036                   .dbline 43
 0036           ;       LCD_RS_PORT &= ~LCD_RS;   //RS=0
 0036 DA98              cbi 0x1b,2
 0038 01C0              xjmp L4
 003A           L3:
 003A                   .dbline 45
 003A           ;       else
 003A           ;     LCD_RS_PORT |= LCD_RS;    //RS=1
 003A DA9A              sbi 0x1b,2
 003C           L4:
 003C                   .dbline 47
 003C           ;       
 003C           ;     data_temp = data;
 003C 50930100          sts _data_temp+1,R21
 0040 40930000          sts _data_temp,R20
 0044                   .dbline 48
 0044           ;     LCD_Write_half_char();
 0044 19D0              xcall _LCD_Write_half_char
 0046                   .dbline 49
 0046           ;       data_temp = data;
 0046 50930100          sts _data_temp+1,R21
 004A 40930000          sts _data_temp,R20
 004E                   .dbline 50
 004E           ;       data_temp=data_temp << 4;
 004E 1A01              movw R2,R20
 0050 220C              lsl R2
 0052 331C              rol R3
 0054 220C              lsl R2
 0056 331C              rol R3
 0058 220C              lsl R2
 005A 331C              rol R3
 005C 220C              lsl R2
 005E 331C              rol R3
 0060 30920100          sts _data_temp+1,R3
 0064 20920000          sts _data_temp,R2
 0068                   .dbline 51
 0068           ;     LCD_Write_half_char();
 0068 07D0              xcall _LCD_Write_half_char
 006A                   .dbline 52
 006A           ;       delay_nus(100);  
 006A 04E6              ldi R16,100
 006C 10E0              ldi R17,0
 006E 0E940000          xcall _delay_nus
 0072                   .dbline -2
 0072           L2:
 0072 0E940000          xcall pop_gset2
 0076                   .dbline 0 ; func end
 0076 0895              ret
 0078                   .dbsym r data 20 i
 0078                   .dbsym r command 22 i
 0078                   .dbend
 0078                   .dbfunc e LCD_Write_half_char _LCD_Write_half_char fV
                        .even
 0078           _LCD_Write_half_char::
 0078                   .dbline -1
 0078                   .dbline 56
 0078           ;   }
 0078           ; /*---------写高4bit到LCD----*/
 0078           ; void LCD_Write_half_char(void)
 0078           ;   {
 0078                   .dbline 57
 0078           ;      LCD_EN_PORT &= ~LCD_EN;
 0078 DB98              cbi 0x1b,3
 007A                   .dbline 58
 007A           ;        delay_nus(4);
 007A 04E0              ldi R16,4
 007C 10E0              ldi R17,0
 007E 0E940000          xcall _delay_nus
 0082                   .dbline 59
 0082           ;        LCD_DATA_PORT &= 0X0f; //portd4~7=0 
 0082 8BB3              in R24,0x1b
 0084 8F70              andi R24,15
 0086 8BBB              out 0x1b,R24
 0088                   .dbline 60
 0088           ;        LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
 0088 80910000          lds R24,_data_temp
 008C 90910100          lds R25,_data_temp+1
 0090 807F              andi R24,240
 0092 9070              andi R25,0
 0094 2BB2              in R2,0x1b
 0096 3324              clr R3
 0098 282A              or R2,R24
 009A 392A              or R3,R25
 009C 2BBA              out 0x1b,R2
 009E                   .dbline 61
 009E           ;        LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
 009E DB9A              sbi 0x1b,3
 00A0                   .dbline 62
 00A0           ;        delay_nus(4);
 00A0 04E0              ldi R16,4
 00A2 10E0              ldi R17,0
 00A4 0E940000          xcall _delay_nus
 00A8                   .dbline 63
 00A8           ;      LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
 00A8 DB98              cbi 0x1b,3
 00AA                   .dbline 64
 00AA           ;        LCD_DATA_PORT &= 0X0f; 
 00AA 8BB3              in R24,0x1b
 00AC 8F70              andi R24,15
 00AE 8BBB              out 0x1b,R24
 00B0                   .dbline 65
 00B0           ;        delay_nus(4); 
 00B0 04E0              ldi R16,4
 00B2 10E0              ldi R17,0
 00B4 0E940000          xcall _delay_nus
 00B8                   .dbline -2
 00B8           L5:
 00B8                   .dbline 0 ; func end
 00B8 0895              ret
 00BA                   .dbend
 00BA                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 00BA           ;        address -> R20
 00BA           ;              y -> R20
 00BA           ;              x -> R22
                        .even
 00BA           _LCD_set_xy::
 00BA 0E940000          xcall push_gset2
 00BE 422F              mov R20,R18
 00C0 602F              mov R22,R16
 00C2                   .dbline -1
 00C2                   .dbline 79
 00C2           ;    }
 00C2           ; 
 00C2           ; /*-----------------------------------------------------------------------
 00C2           ; LCD_set_xy        : 设置LCD显示的起始位置
 00C2           ; 
 00C2           ; 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
 00C2           ;                     LCD第一行显示寄存器地址:0X80-0X8F
 00C2           ;                     LCD第一行显示寄存器地址:0XC0-0XCF
 00C2           ; 
 00C2           ; 编写日期          :2004-8-19 
 00C2           ; 最后修改日期      :2004-8-19                 
 00C2           ; -----------------------------------------------------------------------*/
 00C2           ; void LCD_set_xy( unsigned char x, unsigned char y )
 00C2           ;   {
 00C2                   .dbline 81
 00C2           ;     unsigned char address;
 00C2           ;     if (y == 0) address = 0x80 + x;
 00C2 4423              tst R20
 00C4 19F4              brne L7
 00C6                   .dbline 81
 00C6 462F              mov R20,R22
 00C8 4058              subi R20,128    ; addi 128
 00CA 02C0              xjmp L8
 00CC           L7:
 00CC                   .dbline 83
 00CC           ;     else 
 00CC           ;        address = 0xc0 + x;
 00CC 462F              mov R20,R22
 00CE 4054              subi R20,64    ; addi 192
 00D0           L8:
 00D0                   .dbline 84
 00D0           ;     LCD_write_char(0,address);
 00D0 242F              mov R18,R20
 00D2 3327              clr R19
 00D4 0027              clr R16
 00D6 1127              clr R17
 00D8 A7DF              xcall _LCD_write_char
 00DA                   .dbline -2
 00DA           L6:
 00DA 0E940000          xcall pop_gset2
 00DE                   .dbline 0 ; func end
 00DE 0895              ret
 00E0                   .dbsym r address 20 c
 00E0                   .dbsym r y 20 c
 00E0                   .dbsym r x 22 c
 00E0                   .dbend
 00E0                   .dbfunc e LCD_write_string _LCD_write_string fV
 00E0           ;              s -> R20,R21
 00E0           ;              Y -> R10
 00E0           ;              X -> R22
                        .even
 00E0           _LCD_write_string::
 00E0 0E940000          xcall push_gset3
 00E4 A22E              mov R10,R18
 00E6 602F              mov R22,R16
 00E8 4E81              ldd R20,y+6
 00EA 5F81              ldd R21,y+7
 00EC                   .dbline -1
 00EC                   .dbline 96
 00EC           ;   }
 00EC           ; /*-----------------------------------------------------------------------
 00EC           ; LCD_write_string  : 英文字符串显示函数
 00EC           ; 
 00EC           ; 输入参数:*s      :英文字符串指针;
 00EC           ;           X、Y    : 显示字符串的位置
 00EC           ; 
 00EC           ; 编写日期          :2004-8-19 
 00EC           ; 最后修改日期      :2004-8-19                 
 00EC           ; -----------------------------------------------------------------------*/
 00EC           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
 00EC           ;   {
 00EC                   .dbline 97
 00EC           ;     LCD_set_xy( X, Y );
 00EC 2A2D              mov R18,R10
 00EE 062F              mov R16,R22
 00F0 E4DF              xcall _LCD_set_xy
 00F2 08C0              xjmp L11
 00F4           L10:
 00F4                   .dbline 100
 00F4                   .dbline 101
 00F4 FA01              movw R30,R20
 00F6 2081              ldd R18,z+0
 00F8 3327              clr R19
 00FA 01E0              ldi R16,1
 00FC 10E0              ldi R17,0
 00FE 94DF              xcall _LCD_write_char
 0100                   .dbline 102
 0100 4F5F              subi R20,255  ; offset = 1
 0102 5F4F              sbci R21,255
 0104                   .dbline 103
 0104           L11:
 0104                   .dbline 99
 0104           ;     
 0104           ;     while (*s) 
 0104 FA01              movw R30,R20
 0106 2080              ldd R2,z+0
 0108 2220              tst R2
 010A A1F7              brne L10
 010C                   .dbline -2
 010C           L9:
 010C 0E940000          xcall pop_gset3
 0110                   .dbline 0 ; func end
 0110 0895              ret
 0112                   .dbsym r s 20 pc
 0112                   .dbsym r Y 10 c
 0112                   .dbsym r X 22 c
 0112                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile G:\电子资料\avrtest\1602六线接法练习\1602B_LCD.c
 0000           _data_temp::
 0000                   .blkb 2
 0002                   .dbsym e data_temp _data_temp i

⌨️ 快捷键说明

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