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

📄 lcd_1602_driver.lis

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module LCD_1602_Driver.c
                        .area data(ram, con, rel)
 0000           _new::
 0000                   .blkb 1
                        .area idata
 0000 20                .byte 32
                        .area data(ram, con, rel)
 0001                   .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
 0001                   .dbsym e new _new c
 0001           _num::
 0001                   .blkb 2
                        .area idata
 0001 0000              .word 0
                        .area data(ram, con, rel)
 0003                   .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
 0003                   .dbsym e num _num i
                        .area text(rom, con, rel)
 0000                   .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.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 "LCD_1602.h"
 0000           ; void delay_nms(unsigned int n);
 0000           ; void delay_nus(unsigned int n);
 0000           ; unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据
 0000           ; unsigned char data[32];//32字节缓存,保存将要写入LCD的数据
 0000           ; unsigned char add;//显存地址标号
 0000           ; unsigned char new=32;//显存标号 
 0000           ; unsigned int num=0;
 0000           ; /**********************************************************
 0000           ; TC1602B LCD DISPLAY
 0000           ; 建立时间:2005年12月12号
 0000           ; 修改日期:2005年12月12号
 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           ;      LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出
 0000 8E9A              sbi 0x11,6
 0002                   .dbline 23
 0002           ;        LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出
 0002 8F9A              sbi 0x11,7
 0004                   .dbline 24
 0004           ;        LCD_D4_DDR|=LCD_D4;//设定数据口为输出 
 0004 8D9A              sbi 0x11,5
 0006                   .dbline 25
 0006           ;        LCD_D5_DDR|=LCD_D5;//设定数据口为输出  
 0006 8C9A              sbi 0x11,4
 0008                   .dbline 26
 0008           ;        LCD_D6_DDR|=LCD_D6;//设定数据口为输出  
 0008 8B9A              sbi 0x11,3
 000A                   .dbline 27
 000A           ;        LCD_D7_DDR|=LCD_D7;//设定数据口为输出
 000A 8A9A              sbi 0x11,2
 000C                   .dbline 29
 000C           ;        
 000C           ;         LCD_EN_PORT&=~LCD_EN;//EN设为低电平
 000C 9698              cbi 0x12,6
 000E                   .dbline 30
 000E           ;         LCD_RS_PORT&=~LCD_RS;//RS设为低电平
 000E 9798              cbi 0x12,7
 0010                   .dbline 31
 0010           ;         LCD_D4_PORT&=~LCD_D4;//数据口置低电平
 0010 9598              cbi 0x12,5
 0012                   .dbline 32
 0012           ;         LCD_D5_PORT&=~LCD_D5;//数据口置低电平
 0012 9498              cbi 0x12,4
 0014                   .dbline 33
 0014           ;         LCD_D6_PORT&=~LCD_D6;//数据口置低电平
 0014 9398              cbi 0x12,3
 0016                   .dbline 34
 0016           ;         LCD_D7_PORT&=~LCD_D7;//数据口置低电平
 0016 9298              cbi 0x12,2
 0018                   .dbline 36
 0018           ;         
 0018           ;     LCD_write_char(0,0x33);      //4bit test
 0018 23E3              ldi R18,51
 001A 30E0              ldi R19,0
 001C 0027              clr R16
 001E 1127              clr R17
 0020 2ED0              rcall _LCD_write_char
 0022                   .dbline 37
 0022           ;       delay_nms(25);
 0022 09E1              ldi R16,25
 0024 10E0              ldi R17,0
 0026 00D0              rcall _delay_nms
 0028                   .dbline 38
 0028           ;       LCD_write_char(0,0x32);
 0028 22E3              ldi R18,50
 002A 30E0              ldi R19,0
 002C 0027              clr R16
 002E 1127              clr R17
 0030 26D0              rcall _LCD_write_char
 0032                   .dbline 39
 0032           ;       delay_nms(15);
 0032 0FE0              ldi R16,15
 0034 10E0              ldi R17,0
 0036 00D0              rcall _delay_nms
 0038                   .dbline 40
 0038           ;       LCD_write_char(0,0x28);
 0038 28E2              ldi R18,40
 003A 30E0              ldi R19,0
 003C 0027              clr R16
 003E 1127              clr R17
 0040 1ED0              rcall _LCD_write_char
 0042                   .dbline 41
 0042           ;       delay_nms(15);
 0042 0FE0              ldi R16,15
 0044 10E0              ldi R17,0
 0046 00D0              rcall _delay_nms
 0048                   .dbline 42
 0048           ;     LCD_write_char(0,0x0C);      //显示开
 0048 2CE0              ldi R18,12
 004A 30E0              ldi R19,0
 004C 0027              clr R16
 004E 1127              clr R17
 0050 16D0              rcall _LCD_write_char
 0052                   .dbline 43
 0052           ;       delay_nms(15);
 0052 0FE0              ldi R16,15
 0054 10E0              ldi R17,0
 0056 00D0              rcall _delay_nms
 0058                   .dbline 44
 0058           ;     LCD_write_char(0,0x01);      //显示清屏
 0058 21E0              ldi R18,1
 005A 30E0              ldi R19,0
 005C 0027              clr R16
 005E 1127              clr R17
 0060 0ED0              rcall _LCD_write_char
 0062                   .dbline 45
 0062           ;       delay_nms(15);
 0062 0FE0              ldi R16,15
 0064 10E0              ldi R17,0
 0066 00D0              rcall _delay_nms
 0068                   .dbline 46
 0068           ;     LCD_write_char(0,0x06);      //显示光标移动设置   
 0068 26E0              ldi R18,6
 006A 30E0              ldi R19,0
 006C 0027              clr R16
 006E 1127              clr R17
 0070 06D0              rcall _LCD_write_char
 0072                   .dbline 47
 0072           ;       LCD_clear();
 0072 68D0              rcall _LCD_clear
 0074                   .dbline 48
 0074           ;       delay_nms(10);
 0074 0AE0              ldi R16,10
 0076 10E0              ldi R17,0
 0078 00D0              rcall _delay_nms
 007A                   .dbline 49
 007A           ;       LCD_init_CGRAM(); 
 007A 2DD3              rcall _LCD_init_CGRAM
 007C                   .dbline -2
 007C           L1:
 007C                   .dbline 0 ; func end
 007C 0895              ret
 007E                   .dbend
 007E                   .dbfunc e LCD_write_char _LCD_write_char fV
 007E           ;           data -> R20,R21
 007E           ;        command -> R22,R23
                        .even
 007E           _LCD_write_char::
 007E 00D0              rcall push_gset2
 0080 A901              movw R20,R18
 0082 B801              movw R22,R16
 0084                   .dbline -1
 0084                   .dbline 57
 0084           ;   }
 0084           ; /*-----------------------------------------------------------------------
 0084           ; LCD_write_char    : 写一个字节到LCD的函数
 0084           ; 编写日期             :2005-12-12 
 0084           ; 最后修改日期      :2005-12-12                
 0084           ; -----------------------------------------------------------------------*/
 0084           ; void LCD_write_char(unsigned command,unsigned data)
 0084           ;   { 
 0084                   .dbline 58
 0084           ;     if (command == 0)
 0084 6030              cpi R22,0
 0086 6707              cpc R22,R23
 0088 11F4              brne L3
 008A           X0:
 008A                   .dbline 59
 008A           ;       LCD_RS_PORT &= ~LCD_RS;   //RS=0  写地址
 008A 9798              cbi 0x12,7
 008C 01C0              rjmp L4
 008E           L3:
 008E                   .dbline 61
 008E           ;       else
 008E           ;     LCD_RS_PORT |= LCD_RS;    //RS=1 写数据
 008E 979A              sbi 0x12,7
 0090           L4:
 0090                   .dbline 63
 0090           ;       
 0090           ;     LCD_write_DATA_PORT(data);//写高4位
 0090 042F              mov R16,R20
 0092 18D0              rcall _LCD_write_DATA_PORT
 0094                   .dbline 64
 0094           ;     LCD_write_DATA_PORT(data<<4);//写低4位
 0094 042F              mov R16,R20
 0096 000F              lsl R16
 0098 111F              rol R17
 009A 000F              lsl R16
 009C 111F              rol R17
 009E 000F              lsl R16
 00A0 111F              rol R17
 00A2 000F              lsl R16
 00A4 111F              rol R17
 00A6 0ED0              rcall _LCD_write_DATA_PORT
 00A8                   .dbline 65
 00A8           ;       delay_nus(250);
 00A8 0AEF              ldi R16,250
 00AA 10E0              ldi R17,0
 00AC 00D0              rcall _delay_nus
 00AE                   .dbline 66
 00AE           ;       num++;//统计向LCD发送的字节数
 00AE 80910100          lds R24,_num
 00B2 90910200          lds R25,_num+1
 00B6 0196              adiw R24,1
 00B8 90930200          sts _num+1,R25
 00BC 80930100          sts _num,R24
 00C0                   .dbline -2
 00C0           L2:
 00C0 00D0              rcall pop_gset2
 00C2                   .dbline 0 ; func end
 00C2 0895              ret
 00C4                   .dbsym r data 20 i
 00C4                   .dbsym r command 22 i
 00C4                   .dbend
 00C4                   .dbfunc e LCD_write_DATA_PORT _LCD_write_DATA_PORT fV
 00C4           ;           data -> R20
                        .even
 00C4           _LCD_write_DATA_PORT::
 00C4 00D0              rcall push_gset1
 00C6 402F              mov R20,R16
 00C8                   .dbline -1
 00C8                   .dbline 76
 00C8           ;   }
 00C8           ; /*-----------------------------------------------------------------------
 00C8           ; LCD_write_DATA_PORT : 写数据到LCD数据口函数
 00C8           ; 
 00C8           ; 输入参数data   :要写入的数据(仅高4位)
 00C8           ; 编写日期          :2005-12-12
 00C8           ; 最后修改日期   :2005-12-12           
 00C8           ; -----------------------------------------------------------------------*/
 00C8           ; void LCD_write_DATA_PORT(unsigned char data)
 00C8           ; {   
 00C8                   .dbline 77
 00C8           ;     if((data>>4)%2)
 00C8 12E0              ldi R17,2
 00CA 042F              mov R16,R20
 00CC 0295              swap R16
 00CE 0F70              andi R16,#0x0F
 00D0 00D0              rcall mod8u
 00D2 0023              tst R16
 00D4 11F0              breq L6
 00D6                   .dbline 78
 00D6           ;         LCD_D4_PORT |=LCD_D4;
 00D6 959A              sbi 0x12,5
 00D8 01C0              rjmp L7
 00DA           L6:
 00DA                   .dbline 80
 00DA           ;       else
 00DA           ;         LCD_D4_PORT &=~LCD_D4;
 00DA 9598              cbi 0x12,5
 00DC           L7:
 00DC                   .dbline 82
 00DC           ;       
 00DC           ;       if((data>>5)%2)
 00DC 12E0              ldi R17,2
 00DE 042F              mov R16,R20
 00E0 0695              lsr R16
 00E2 0695              lsr R16
 00E4 0695              lsr R16
 00E6 0695              lsr R16
 00E8 0695              lsr R16
 00EA 00D0              rcall mod8u
 00EC 0023              tst R16
 00EE 11F0              breq L8
 00F0                   .dbline 83
 00F0           ;         LCD_D5_PORT |=LCD_D5;
 00F0 949A              sbi 0x12,4
 00F2 01C0              rjmp L9
 00F4           L8:
 00F4                   .dbline 85
 00F4           ;       else
 00F4           ;         LCD_D5_PORT &=~LCD_D5;
 00F4 9498              cbi 0x12,4
 00F6           L9:
 00F6                   .dbline 87
 00F6           ;         
 00F6           ;       if((data>>6)%2)
 00F6 12E0              ldi R17,2
 00F8 042F              mov R16,R20
 00FA 0695              lsr R16
 00FC 0695              lsr R16
 00FE 0695              lsr R16
 0100 0695              lsr R16
 0102 0695              lsr R16
 0104 0695              lsr R16
 0106 00D0              rcall mod8u
 0108 0023              tst R16
 010A 11F0              breq L10
 010C                   .dbline 88
 010C           ;         LCD_D6_PORT |=LCD_D6;
 010C 939A              sbi 0x12,3
 010E 01C0              rjmp L11
 0110           L10:
 0110                   .dbline 90
 0110           ;       else
 0110           ;         LCD_D6_PORT &=~LCD_D6;
 0110 9398              cbi 0x12,3
 0112           L11:
 0112                   .dbline 92
 0112           ;         
 0112           ;       if((data>>7)%2)
 0112 12E0              ldi R17,2
 0114 042F              mov R16,R20
 0116 0695              lsr R16
 0118 0695              lsr R16

⌨️ 快捷键说明

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