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

📄 1602b_lcd.lis

📁 本设计以ATMEL公司生产的AT90S8515作为控制核心
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module _1602B_LCD.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\hujie\1602B_LCD.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 20
 0000           ; // 1602B_LCD.c
 0000           ; //
 0000           ; 
 0000           ; /**********************************************************
 0000           ; /* TC1602B LCD DISPLAY
 0000           ; /* LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
 0000           ;                    入命令
 0000           ; /* LCD第一行显示寄存器地址:0X80-0X8F
 0000           ; /* LCD第二行显示寄存器地址:0XC0-0XCF
 0000           ; /* 光标命令:
 0000           ; /* LCD_write_char(0x0e,0);    //光标开
 0000           ; /* LCD_write_char(0x0d,0);    //光标所在字符闪烁  
 0000           ; /* LCD_write_char(0x0c,0);    //光标关  
 0000           ; **********************************************************/
 0000           ; #include <io8515v.h>
 0000           ; #include <macros.h>
 0000           ; #include "1602LCD.h"
 0000           ; 
 0000           ; void LCD_init(void) 
 0000           ; { 
 0000                   .dbline 21
 0000           ;   LCD_CTRL_DDR|=LCD_RS | LCD_EN | LCD_RW;
 0000 87B3              in R24,0x17
 0002 8E60              ori R24,14
 0004 87BB              out 0x17,R24
 0006                   .dbline 22
 0006           ;   LCD_DATA_DDR|=LCD_DATA;
 0006 87B3              in R24,0x17
 0008 806F              ori R24,240
 000A 87BB              out 0x17,R24
 000C                   .dbline 23
 000C           ;   delay_nms(100); 
 000C 04E6              ldi R16,100
 000E 10E0              ldi R17,0
 0010 00D0              rcall _delay_nms
 0012                   .dbline 24
 0012           ;   LCD_write_char(0x28,0);                                         //功能设置    
 0012 2227              clr R18
 0014 3327              clr R19
 0016 08E2              ldi R16,40
 0018 10E0              ldi R17,0
 001A 21D0              rcall _LCD_write_char
 001C                   .dbline 25
 001C           ;   delay_nus(100); 
 001C 04E6              ldi R16,100
 001E 10E0              ldi R17,0
 0020 00D0              rcall _delay_nus
 0022                   .dbline 26
 0022           ;   LCD_write_char(0x06,0);                                             //显示光标移动设置
 0022 2227              clr R18
 0024 3327              clr R19
 0026 06E0              ldi R16,6
 0028 10E0              ldi R17,0
 002A 19D0              rcall _LCD_write_char
 002C                   .dbline 27
 002C           ;   delay_nus(100);
 002C 04E6              ldi R16,100
 002E 10E0              ldi R17,0
 0030 00D0              rcall _delay_nus
 0032                   .dbline 28
 0032           ;   LCD_write_char(0x01,0);                                             //显示清屏
 0032 2227              clr R18
 0034 3327              clr R19
 0036 01E0              ldi R16,1
 0038 10E0              ldi R17,0
 003A 11D0              rcall _LCD_write_char
 003C                   .dbline 29
 003C           ;   delay_nms(2);
 003C 02E0              ldi R16,2
 003E 10E0              ldi R17,0
 0040 00D0              rcall _delay_nms
 0042                   .dbline 30
 0042           ;   LCD_write_char(0x0C,0);                                             //显示开 
 0042 2227              clr R18
 0044 3327              clr R19
 0046 0CE0              ldi R16,12
 0048 10E0              ldi R17,0
 004A 09D0              rcall _LCD_write_char
 004C                   .dbline 31
 004C           ;   delay_nus(100);
 004C 04E6              ldi R16,100
 004E 10E0              ldi R17,0
 0050                   .dbline -2
 0050                   .dbline 32
 0050           ; }
 0050           L1:
 0050                   .dbline 0 ; func end
 0050 00C0              rjmp _delay_nus
 0052                   .dbend
 0052                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0052           _LCD_en_write::
 0052                   .dbline -1
 0052                   .dbline 35
 0052           ;  
 0052           ; void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
 0052           ;   {
 0052                   .dbline 36
 0052           ;     LCD_EN_PORT |= LCD_EN;
 0052 C39A              sbi 0x18,3
 0054                   .dbline 37
 0054           ;     delay_nus(5);
 0054 05E0              ldi R16,5
 0056 10E0              ldi R17,0
 0058 00D0              rcall _delay_nus
 005A                   .dbline 38
 005A           ;     LCD_EN_PORT &= ~LCD_EN;
 005A C398              cbi 0x18,3
 005C                   .dbline -2
 005C                   .dbline 39
 005C           ;   }
 005C           L2:
 005C                   .dbline 0 ; func end
 005C 0895              ret
 005E                   .dbend
 005E                   .dbfunc e LCD_write_char _LCD_write_char fV
 005E           ;      data_temp -> R22,R23
 005E           ;   command_temp -> R20,R21
 005E           ;           data -> R12,R13
 005E           ;        command -> R10,R11
                        .even
 005E           _LCD_write_char::
 005E 00D0              rcall push_gset4
 0060 C22E              mov R12,R18
 0062 D32E              mov R13,R19
 0064 A02E              mov R10,R16
 0066 B12E              mov R11,R17
 0068                   .dbline -1
 0068                   .dbline 49
 0068           ; 
 0068           ; /****************************************************************
 0068           ; /* LCD_write_char    : 英文字符串显示函数
 0068           ; /* 输入参数:*s      :英文字符串指针?
 0068           ;              X、Y    : 显示字符串的位置,X:0-15,Y:0-1
 0068           ;                      LCD第一行显示寄存器地址:0X80-0X8F
 0068           ;                      LCD第一行显示寄存器地址:0XC0-0XCF               
 0068           ; *****************************************************************/
 0068           ; void LCD_write_char(unsigned command,unsigned data)
 0068           ;   {
 0068                   .dbline 52
 0068           ;     unsigned command_temp,data_temp;        
 0068           ;     
 0068           ;       command_temp = command;
 0068 4A2D              mov R20,R10
 006A 5B2D              mov R21,R11
 006C                   .dbline 53
 006C           ;     data_temp = data;
 006C 6C2D              mov R22,R12
 006E 7D2D              mov R23,R13
 0070                   .dbline 54
 0070           ;     LCD_wait_Ready();
 0070 52D0              rcall _LCD_wait_Ready
 0072                   .dbline 55
 0072           ;     LCD_RW_PORT &= ~LCD_RW;             //RW=0
 0072 C298              cbi 0x18,2
 0074                   .dbline 56
 0074           ;     if (command == 0)
 0074 4030              cpi R20,0
 0076 4507              cpc R20,R21
 0078 71F4              brne L4
 007A           X0:
 007A                   .dbline 57
 007A           ;       {
 007A                   .dbline 58
 007A           ;        LCD_RS_PORT |= LCD_RS;             //RS=1 
 007A C19A              sbi 0x18,1
 007C                   .dbline 59
 007C           ;        LCD_DATA_PORT &= 0X0F;
 007C 88B3              in R24,0x18
 007E 8F70              andi R24,15
 0080 88BB              out 0x18,R24
 0082                   .dbline 60
 0082           ;        LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
 0082 862F              mov R24,R22
 0084 972F              mov R25,R23
 0086 807F              andi R24,240
 0088 9070              andi R25,0
 008A 28B2              in R2,0x18
 008C 3324              clr R3
 008E 282A              or R2,R24
 0090 392A              or R3,R25
 0092 28BA              out 0x18,R2
 0094                   .dbline 61
 0094           ;       }
 0094 0DC0              rjmp L5
 0096           L4:
 0096                   .dbline 63
 0096           ;     else 
 0096           ;       {
 0096                   .dbline 64
 0096           ;        LCD_RS_PORT &= ~LCD_RS;            //RS=0
 0096 C198              cbi 0x18,1
 0098                   .dbline 65
 0098           ;        LCD_DATA_PORT &= 0X0F;
 0098 88B3              in R24,0x18
 009A 8F70              andi R24,15
 009C 88BB              out 0x18,R24
 009E                   .dbline 66
 009E           ;      LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
 009E 842F              mov R24,R20
 00A0 952F              mov R25,R21
 00A2 807F              andi R24,240
 00A4 9070              andi R25,0
 00A6 28B2              in R2,0x18
 00A8 3324              clr R3
 00AA 282A              or R2,R24
 00AC 392A              or R3,R25
 00AE 28BA              out 0x18,R2
 00B0                   .dbline 67
 00B0           ;       }
 00B0           L5:
 00B0                   .dbline 68
 00B0           ;     LCD_en_write();
 00B0 D0DF              rcall _LCD_en_write
 00B2                   .dbline 69
 00B2           ;     command_temp=command_temp << 4;     //send low 4bit
 00B2 440F              lsl R20
 00B4 551F              rol R21
 00B6 440F              lsl R20
 00B8 551F              rol R21
 00BA 440F              lsl R20
 00BC 551F              rol R21
 00BE 440F              lsl R20
 00C0 551F              rol R21
 00C2                   .dbline 70
 00C2           ;     data_temp=data_temp       << 4;
 00C2 660F              lsl R22
 00C4 771F              rol R23
 00C6 660F              lsl R22
 00C8 771F              rol R23
 00CA 660F              lsl R22
 00CC 771F              rol R23
 00CE 660F              lsl R22
 00D0 771F              rol R23
 00D2                   .dbline 71
 00D2           ;     LCD_DATA_PORT &= 0X0F;
 00D2 88B3              in R24,0x18
 00D4 8F70              andi R24,15
 00D6 88BB              out 0x18,R24
 00D8                   .dbline 72
 00D8           ;     if (command==0)
 00D8 AA20              tst R10
 00DA 61F4              brne L6
 00DC BB20              tst R11
 00DE 51F4              brne L6
 00E0           X1:
 00E0                   .dbline 73
 00E0           ;       LCD_DATA_PORT |= data_temp&0xf0;
 00E0 862F              mov R24,R22
 00E2 972F              mov R25,R23
 00E4 807F              andi R24,240
 00E6 9070              andi R25,0
 00E8 28B2              in R2,0x18
 00EA 3324              clr R3
 00EC 282A              or R2,R24
 00EE 392A              or R3,R25
 00F0 28BA              out 0x18,R2
 00F2 09C0              rjmp L7
 00F4           L6:
 00F4                   .dbline 75
 00F4           ;     else
 00F4           ;       LCD_DATA_PORT |= command_temp&0xf0;
 00F4 842F              mov R24,R20
 00F6 952F              mov R25,R21
 00F8 807F              andi R24,240
 00FA 9070              andi R25,0
 00FC 28B2              in R2,0x18
 00FE 3324              clr R3
 0100 282A              or R2,R24
 0102 392A              or R3,R25
 0104 28BA              out 0x18,R2
 0106           L7:
 0106                   .dbline 76
 0106           ;     LCD_en_write();
 0106 A5DF              rcall _LCD_en_write
 0108                   .dbline 77
 0108           ;     LCD_RW_PORT |= LCD_RW;
 0108 C29A              sbi 0x18,2
 010A                   .dbline 78
 010A           ;     LCD_RS_PORT ^= LCD_RS;    
 010A 82E0              ldi R24,2
 010C 28B2              in R2,0x18
 010E 2826              eor R2,R24
 0110 28BA              out 0x18,R2
 0112                   .dbline -2
 0112                   .dbline 79
 0112           ;   }
 0112           L3:
 0112 00D0              rcall pop_gset4
 0114                   .dbline 0 ; func end
 0114 0895              ret
 0116                   .dbsym r data_temp 22 i
 0116                   .dbsym r command_temp 20 i
 0116                   .dbsym r data 12 i
 0116                   .dbsym r command 10 i
 0116                   .dbend
 0116                   .dbfunc e LCD_wait_Ready _LCD_wait_Ready fV
                        .even
 0116           _LCD_wait_Ready::
 0116                   .dbline -1
 0116                   .dbline 82
 0116           ; 
 0116           ; void LCD_wait_Ready(void)                  //等待LCD空闲
 0116           ;   {
 0116                   .dbline 83
 0116           ;     LCD_DATA_DDR &= ~0x80;                 //PB7 I/O口方向设置为输入
 0116 BF98              cbi 0x17,7
 0118                   .dbline 84
 0118           ;     LCD_RW_PORT |= LCD_RW;                 //RW=1
 0118 C29A              sbi 0x18,2
 011A                   .dbline 85
 011A           ;     LCD_RS_PORT &= ~LCD_RS;                //RS=0
 011A C198              cbi 0x18,1
 011C                   .dbline 86
 011C           ;     LCD_EN_PORT |= LCD_EN;                 //EN=1
 011C C39A              sbi 0x18,3
 011E           L9:
 011E                   .dbline 87
 011E           L10:
 011E                   .dbline 87
 011E           ;     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
 011E B799              sbic 0x16,7
 0120 03C0              rjmp L12
 0122 01E0              ldi R16,1
 0124 10E0              ldi R17,0
 0126 02C0              rjmp L13

⌨️ 快捷键说明

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