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

📄 1602b_lcd.lis

📁 本实验以常见的1602B字符型LCD模块为例
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module _1602B_LCD.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\test6\1602B_LCD.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 21
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; #include "1602LCD.h"
 0000           ; 
 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=0时,向LCD写入数据,否则向LCD写
 0000           ;                    入命令
 0000           ; LCD第一行显示寄存器地址:0X80-0X8F
 0000           ; LCD第二行显示寄存器地址:0XC0-0XCF
 0000           ; **********************************************************/
 0000           ; void LCD_init(void)
 0000           ;   {
 0000                   .dbline 22
 0000           ;     delay_nms(15);
 0000 0FE0              ldi R16,15
 0002 10E0              ldi R17,0
 0004 00D0              rcall _delay_nms
 0006                   .dbline 24
 0006           ;    
 0006           ;     LCD_write_char(0x28,0);      //4bit test
 0006 2227              clr R18
 0008 3327              clr R19
 000A 08E2              ldi R16,40
 000C 10E0              ldi R17,0
 000E 16D0              rcall _LCD_write_char
 0010                   .dbline 25
 0010           ;     LCD_write_char(0x0c,0);      //显示开
 0010 2227              clr R18
 0012 3327              clr R19
 0014 0CE0              ldi R16,12
 0016 10E0              ldi R17,0
 0018 11D0              rcall _LCD_write_char
 001A                   .dbline 26
 001A           ;     LCD_write_char(0x01,0);      //显示清屏
 001A 2227              clr R18
 001C 3327              clr R19
 001E 01E0              ldi R16,1
 0020 10E0              ldi R17,0
 0022 0CD0              rcall _LCD_write_char
 0024                   .dbline 27
 0024           ;     LCD_write_char(0x06,0);      //显示光标移动设置
 0024 2227              clr R18
 0026 3327              clr R19
 0028 06E0              ldi R16,6
 002A 10E0              ldi R17,0
 002C 07D0              rcall _LCD_write_char
 002E                   .dbline -2
 002E           L1:
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbend
 0030                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0030           _LCD_en_write::
 0030                   .dbline -1
 0030                   .dbline 31
 0030           ;   }
 0030           ; 
 0030           ; void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
 0030           ;   {
 0030                   .dbline 32
 0030           ;     LCD_EN_PORT |= LCD_EN;
 0030 AD9A              sbi 0x15,5
 0032                   .dbline 33
 0032           ;     delay_nus(1);
 0032 01E0              ldi R16,1
 0034 10E0              ldi R17,0
 0036 00D0              rcall _delay_nus
 0038                   .dbline 34
 0038           ;     LCD_EN_PORT &= ~LCD_EN;
 0038 AD98              cbi 0x15,5
 003A                   .dbline -2
 003A           L2:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbend
 003C                   .dbfunc e LCD_write_char _LCD_write_char fV
 003C           ;      data_temp -> R22,R23
 003C           ;   command_temp -> R20,R21
 003C           ;           data -> R12,R13
 003C           ;        command -> R10,R11
                        .even
 003C           _LCD_write_char::
 003C 00D0              rcall push_gset4
 003E 6901              movw R12,R18
 0040 5801              movw R10,R16
 0042                   .dbline -1
 0042                   .dbline 49
 0042           ;   }
 0042           ; 
 0042           ; /*-----------------------------------------------------------------------
 0042           ; LCD_write_char    : 英文字符串显示函数
 0042           ; 
 0042           ; 输入参数:*s      :英文字符串指针;
 0042           ;           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
 0042           ;                     LCD第一行显示寄存器地址:0X80-0X8F
 0042           ;                     LCD第一行显示寄存器地址:0XC0-0XCF
 0042           ; 
 0042           ; 编写日期          :2003-11-19 
 0042           ; 最后修改日期      :2004-8-19                 
 0042           ; -----------------------------------------------------------------------*/
 0042           ; void LCD_write_char(unsigned command,unsigned data)
 0042           ;   {
 0042                   .dbline 52
 0042           ;     unsigned command_temp,data_temp;        
 0042           ;    
 0042           ;     command_temp = command;
 0042 A501              movw R20,R10
 0044                   .dbline 53
 0044           ;     data_temp = data;
 0044 B601              movw R22,R12
 0046                   .dbline 55
 0046           ;    
 0046           ;     LCD_wait_Ready();
 0046 4ED0              rcall _LCD_wait_Ready
 0048                   .dbline 57
 0048           ;    
 0048           ;     LCD_RW_PORT &= ~LCD_RW;                 //RW=0
 0048 9398              cbi 0x12,3
 004A                   .dbline 59
 004A           ;    
 004A           ;     if (command == 0)
 004A 4030              cpi R20,0
 004C 4507              cpc R20,R21
 004E 69F4              brne L4
 0050           X0:
 0050                   .dbline 60
 0050           ;       {
 0050                   .dbline 61
 0050           ;        LCD_RS_PORT |= LCD_RS;             //RS=1 
 0050 AC9A              sbi 0x15,4
 0052                   .dbline 62
 0052           ;        LCD_DATA_PORT &= 0X0F;
 0052 82B3              in R24,0x12
 0054 8F70              andi R24,15
 0056 82BB              out 0x12,R24
 0058                   .dbline 63
 0058           ;        LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
 0058 CB01              movw R24,R22
 005A 807F              andi R24,240
 005C 9070              andi R25,0
 005E 22B2              in R2,0x12
 0060 3324              clr R3
 0062 282A              or R2,R24
 0064 392A              or R3,R25
 0066 22BA              out 0x12,R2
 0068                   .dbline 64
 0068           ;       }
 0068 0CC0              rjmp L5
 006A           L4:
 006A                   .dbline 66
 006A           ;     else 
 006A           ;       {
 006A                   .dbline 67
 006A           ;        LCD_RS_PORT &= ~LCD_RS;            //RS=0
 006A AC98              cbi 0x15,4
 006C                   .dbline 68
 006C           ;        LCD_DATA_PORT &= 0X0F;
 006C 82B3              in R24,0x12
 006E 8F70              andi R24,15
 0070 82BB              out 0x12,R24
 0072                   .dbline 69
 0072           ;          LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
 0072 CA01              movw R24,R20
 0074 807F              andi R24,240
 0076 9070              andi R25,0
 0078 22B2              in R2,0x12
 007A 3324              clr R3
 007C 282A              or R2,R24
 007E 392A              or R3,R25
 0080 22BA              out 0x12,R2
 0082                   .dbline 70
 0082           ;       }
 0082           L5:
 0082                   .dbline 71
 0082           ;     LCD_en_write();
 0082 D6DF              rcall _LCD_en_write
 0084                   .dbline 73
 0084           ;    
 0084           ;     command_temp=command_temp << 4;         //send low 4bit
 0084 440F              lsl R20
 0086 551F              rol R21
 0088 440F              lsl R20
 008A 551F              rol R21
 008C 440F              lsl R20
 008E 551F              rol R21
 0090 440F              lsl R20
 0092 551F              rol R21
 0094                   .dbline 74
 0094           ;     data_temp=data_temp       << 4;
 0094 660F              lsl R22
 0096 771F              rol R23
 0098 660F              lsl R22
 009A 771F              rol R23
 009C 660F              lsl R22
 009E 771F              rol R23
 00A0 660F              lsl R22
 00A2 771F              rol R23
 00A4                   .dbline 76
 00A4           ;    
 00A4           ;     LCD_DATA_PORT &= 0X0F;
 00A4 82B3              in R24,0x12
 00A6 8F70              andi R24,15
 00A8 82BB              out 0x12,R24
 00AA                   .dbline 77
 00AA           ;     if (command==0)
 00AA AA20              tst R10
 00AC 59F4              brne L6
 00AE BB20              tst R11
 00B0 49F4              brne L6

⌨️ 快捷键说明

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