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

📄 lcd.lis

📁 AVR mega16系列单片机开发程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\单片机源程序\AVR单片机程序\MAGE16\lcd1602\lcd.c
 0000                   .dbfunc e delay _delay fV
 0000           ;              i -> R20,R21
 0000           ;              n -> R16,R17
                        .even
 0000           _delay::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 55
 0004           ; //编译器:ICC-AVR 
 0004           ; //日期: 2007-4-13 20:29:57 
 0004           ; //目标芯片 : ATmega16 
 0004           ; //时钟: 8.0000Mhz 
 0004           ; //版本:VISION 2.0
 0004           ; /*
 0004           ; LCD引脚定义 
 0004           ; 1---GND  
 0004           ; 2---VCC 
 0004           ; 3---VO 
 0004           ; 4---RS 
 0004           ; 5---RW 
 0004           ; 6---EN 
 0004           ; 7到14--D0-D7 
 0004           ; 15--背景灯+ 
 0004           ; 16--背景灯-
 0004           ;  
 0004           ; 下面是AVR与LCD连接信息 
 0004           ; PA1 ->RS 
 0004           ; PA0 ->EN 
 0004           ; GND  ->RW 
 0004           ; PA4 ->D4 
 0004           ; PA5 ->D5 
 0004           ; PA6 ->D6 
 0004           ; PA7 ->D7 
 0004           ; */
 0004           ; 
 0004           ; #include <iom16v.h> 
 0004           ; #include <macros.h> 
 0004           ; 
 0004           ; #define LCD_EN_PORT    PORTA   //数据寄存器,以下2个要设为同一个口 
 0004           ; #define LCD_EN_DDR     DDRA    //数据方向寄存器
 0004           ; #define LCD_RS_PORT    PORTA   //以下2个要设为同一个口 
 0004           ; #define LCD_RS_DDR     DDRA 
 0004           ; #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口 
 0004           ; #define LCD_DATA_DDR   DDRA    //一定要用高4位 
 0004           ; #define LCD_DATA_PIN   PINA    //端口输入引脚
 0004           ; #define LCD_RS         (1<<PA1) //0x04   portA1       out 
 0004           ; #define LCD_EN         (1<<PA0) //0x08   portA0       out 
 0004           ; #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA4/5/6/7 out 
 0004           ; 
 0004           ; #define uchar unsigned char
 0004           ; #define uint unsigned int
 0004           ; 
 0004           ; void LCD_init(void); 
 0004           ; void LCD_en_write(void); 
 0004           ; void LCD_write_command(uchar command) ; 
 0004           ; void LCD_write_data(uchar data); 
 0004           ; void LCD_set_xy (uchar x, uchar y); 
 0004           ; void LCD_write_string(uchar X,uchar Y,uchar *s); 
 0004           ; void LCD_write_char(uchar X,uchar Y,uchar data); 
 0004           ; void delay(uint n);
 0004           ; 
 0004           ; void delay(uint n)       //N ms延时函数 
 0004           ;   { 
 0004 09C0              xjmp L3
 0006           L2:
 0006                   .dbline 58
 0006 4427              clr R20
 0008 5527              clr R21
 000A 02C0              xjmp L8
 000C           L5:
 000C                   .dbline 58
 000C           L6:
 000C                   .dbline 58
 000C 4F5F              subi R20,255  ; offset = 1
 000E 5F4F              sbci R21,255
 0010           L8:
 0010                   .dbline 58
 0010 4D37              cpi R20,125
 0012 E0E0              ldi R30,0
 0014 5E07              cpc R21,R30
 0016 D0F3              brlo L5
 0018           L3:
 0018                   .dbline 57
 0018           ;    uint i;
 0018           ;    while(n--) 
 0018 1801              movw R2,R16
 001A 0150              subi R16,1
 001C 1040              sbci R17,0
 001E 2220              tst R2
 0020 91F7              brne L2
 0022 3320              tst R3
 0024 81F7              brne L2
 0026           X0:
 0026                   .dbline -2
 0026           L1:
 0026 0E940000          xcall pop_gset1
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbsym r i 20 i
 002C                   .dbsym r n 16 i
 002C                   .dbend
 002C                   .dbfunc e LCD_init _LCD_init fV
                        .even
 002C           _LCD_init::
 002C                   .dbline -1
 002C                   .dbline 62
 002C           ;    for (i=0;i<125;i++); 
 002C           ;   } 
 002C           ;   
 002C           ; void LCD_init(void)         //液晶初始化 
 002C           ; { 
 002C                   .dbline 63
 002C           ;   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出 
 002C 8AB3              in R24,0x1a
 002E 806F              ori R24,240
 0030 8ABB              out 0x1a,R24
 0032                   .dbline 64
 0032           ;   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出 
 0032 D09A              sbi 0x1a,0
 0034                   .dbline 65
 0034           ;   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出 
 0034 D19A              sbi 0x1a,1
 0036                   .dbline 66
 0036           ;   LCD_write_command(0x28);  
 0036 08E2              ldi R16,40
 0038 14D0              xcall _LCD_write_command
 003A                   .dbline 67
 003A           ;   LCD_en_write(); 
 003A 0DD0              xcall _LCD_en_write
 003C                   .dbline 68
 003C           ;   delay(40); 
 003C 08E2              ldi R16,40
 003E 10E0              ldi R17,0
 0040 DFDF              xcall _delay
 0042                   .dbline 69
 0042           ;   LCD_write_command(0x28);  //4位显示 
 0042 08E2              ldi R16,40
 0044 0ED0              xcall _LCD_write_command
 0046                   .dbline 70
 0046           ;   LCD_write_command(0x0c);  //显示开 
 0046 0CE0              ldi R16,12
 0048 0CD0              xcall _LCD_write_command
 004A                   .dbline 71
 004A           ;   LCD_write_command(0x01);  //清屏 
 004A 01E0              ldi R16,1
 004C 0AD0              xcall _LCD_write_command
 004E                   .dbline 72
 004E           ;   delay(2); 
 004E 02E0              ldi R16,2
 0050 10E0              ldi R17,0
 0052 D6DF              xcall _delay
 0054                   .dbline -2
 0054           L9:
 0054                   .dbline 0 ; func end
 0054 0895              ret
 0056                   .dbend
 0056                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0056           _LCD_en_write::
 0056                   .dbline -1
 0056                   .dbline 76
 0056           ; } 
 0056           ; 
 0056           ; void LCD_en_write(void)  //液晶使能 
 0056           ; { 
 0056                   .dbline 77
 0056           ;   LCD_EN_PORT|=LCD_EN; 
 0056 D89A              sbi 0x1b,0
 0058                   .dbline 78
 0058           ;   delay(1); 
 0058 01E0              ldi R16,1
 005A 10E0              ldi R17,0
 005C D1DF              xcall _delay
 005E                   .dbline 79
 005E           ;   LCD_EN_PORT&=~LCD_EN; 
 005E D898              cbi 0x1b,0
 0060                   .dbline -2
 0060           L10:
 0060                   .dbline 0 ; func end
 0060 0895              ret
 0062                   .dbend
 0062                   .dbfunc e LCD_write_command _LCD_write_command fV
 0062           ;        command -> R20
                        .even
 0062           _LCD_write_command::
 0062 0E940000          xcall push_gset1
 0066 402F              mov R20,R16
 0068                   .dbline -1
 0068                   .dbline 83
 0068           ; } 
 0068           ; 
 0068           ; void LCD_write_command(uchar command) //写指令 
 0068           ; { 
 0068                   .dbline 84
 0068           ;   delay(16); 
 0068 00E1              ldi R16,16
 006A 10E0              ldi R17,0
 006C C9DF              xcall _delay
 006E                   .dbline 85
 006E           ;   LCD_RS_PORT&=~LCD_RS;        //RS=0 
 006E D998              cbi 0x1b,1
 0070                   .dbline 86
 0070           ;   LCD_DATA_PORT&=0X0f;         //清高四位 
 0070 8BB3              in R24,0x1b
 0072 8F70              andi R24,15
 0074 8BBB              out 0x1b,R24
 0076                   .dbline 87
 0076           ;   LCD_DATA_PORT|=command&0xf0; //写高四位 
 0076 842F              mov R24,R20
 0078 807F              andi R24,240
 007A 2BB2              in R2,0x1b
 007C 282A              or R2,R24
 007E 2BBA              out 0x1b,R2
 0080                   .dbline 88
 0080           ;   LCD_en_write(); 
 0080 EADF              xcall _LCD_en_write
 0082                   .dbline 89
 0082           ;   command=command<<4;          //低四位移到高四位 
 0082 842F              mov R24,R20
 0084 8F70              andi R24,#0x0F
 0086 8295              swap R24
 0088 482F              mov R20,R24
 008A                   .dbline 90
 008A           ;   LCD_DATA_PORT&=0x0f;         //清高四位 
 008A 8BB3              in R24,0x1b
 008C 8F70              andi R24,15
 008E 8BBB              out 0x1b,R24
 0090                   .dbline 91
 0090           ;   LCD_DATA_PORT|=command&0xf0; //写低四位 
 0090 842F              mov R24,R20
 0092 807F              andi R24,240
 0094 2BB2              in R2,0x1b
 0096 282A              or R2,R24
 0098 2BBA              out 0x1b,R2
 009A                   .dbline 92
 009A           ;   LCD_en_write(); 
 009A DDDF              xcall _LCD_en_write
 009C                   .dbline -2
 009C           L11:
 009C 0E940000          xcall pop_gset1
 00A0                   .dbline 0 ; func end
 00A0 0895              ret
 00A2                   .dbsym r command 20 c
 00A2                   .dbend
 00A2                   .dbfunc e LCD_write_data _LCD_write_data fV
 00A2           ;           data -> R20
                        .even
 00A2           _LCD_write_data::
 00A2 0E940000          xcall push_gset1
 00A6 402F              mov R20,R16
 00A8                   .dbline -1
 00A8                   .dbline 97
 00A8           ;    
 00A8           ; } 
 00A8           ; 
 00A8           ; void LCD_write_data(uchar data) //写数据 
 00A8           ; { 
 00A8                   .dbline 98
 00A8           ;   delay(16); 
 00A8 00E1              ldi R16,16
 00AA 10E0              ldi R17,0
 00AC A9DF              xcall _delay
 00AE                   .dbline 99
 00AE           ;   LCD_RS_PORT|=LCD_RS;       //RS=1 
 00AE D99A              sbi 0x1b,1
 00B0                   .dbline 100
 00B0           ;   LCD_DATA_PORT&=0X0f;       //清高四位 
 00B0 8BB3              in R24,0x1b
 00B2 8F70              andi R24,15

⌨️ 快捷键说明

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