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

📄 lcd.lis

📁 基于AVR单片机的lm1602字符液晶模块显示的C代码
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\avr\测试\lcd1\lcd.c
 0000                   .dbfunc e LCD16xx_init _LCD16xx_init fV
                        .even
 0000           _LCD16xx_init::
 0000                   .dbline -1
 0000                   .dbline 32
 0000           ; /*--------------------------------------------------*/
 0000           ; /*             AVR-ARM开发网论坛                    */
 0000           ; /*           http://www.avrarm.com                  */
 0000           ; /*            AVR生成代码测试程序                   */
 0000           ; /*--------------------------------------------------*/
 0000           ; /*     程序由AVR辅助开发工具V2.1.1自动生成          */
 0000           ; /*     AVR系统的处理器为:   ATMega16               */
 0000           ; /*     AVR系统的晶振频率:   1.0000 Mhz             */
 0000           ; /*--------------------------------------------------*/
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "lcd.h"
 0000           ; #include "delay.h"
 0000           ; 
 0000           ; /**********************************************************
 0000           ; 光标命令
 0000           ; LCD16xx_write_char(1,0x0e);    //光标开
 0000           ; LCD16xx_write_char(1,0x0d);    //光标所在字符闪烁
 0000           ; LCD16xx_write_char(1,0x0c);    //光标关
 0000           ; **********************************************************/
 0000           ; /**********************************************************
 0000           ; TC16xxB LCD DISPLAY
 0000           ; 建立时间:2006年08月30日
 0000           ; 修改日期:2006年08月30日
 0000           ; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
 0000           ;                    入命令
 0000           ; LCD第一行显示寄存器地址:0x80-0x8F
 0000           ; LCD第二行显示寄存器地址:0xC0-0xCF
 0000           ; **********************************************************/
 0000           ; void LCD16xx_init(void)
 0000           ; {
 0000                   .dbline 33
 0000           ;     LCD_DATA_DDR |=  LCD_DATA;
 0000 81B3              in R24,0x11
 0002 806F              ori R24,240
 0004 81BB              out 0x11,R24
 0006                   .dbline 34
 0006           ;     LCD_EN_DDR   |=  LCD_EN;
 0006 D09A              sbi 0x1a,0
 0008                   .dbline 35
 0008           ;     LCD_RS_DDR   |=  LCD_RS;
 0008 D29A              sbi 0x1a,2
 000A                   .dbline 36
 000A           ;     LCD_RW_DDR   |=  LCD_RW;
 000A D19A              sbi 0x1a,1
 000C                   .dbline 37
 000C           ;     RW_L;
 000C D998              cbi 0x1b,1
 000E                   .dbline 39
 000E           ;       
 000E           ;     LCD_DATA_PORT =  0x20;
 000E 80E2              ldi R24,32
 0010 82BB              out 0x12,R24
 0012                   .dbline 40
 0012           ;     LCD16xx_en_write();
 0012 14D0              xcall _LCD16xx_en_write
 0014                   .dbline 41
 0014           ;     delay_nus(50);
 0014 02E3              ldi R16,50
 0016 10E0              ldi R17,0
 0018 0E940000          xcall _delay_nus
 001C                   .dbline 43
 001C           ;    
 001C           ;     LCD16xx_write_char(1,0x28);      //4bit test
 001C 28E2              ldi R18,40
 001E 01E0              ldi R16,1
 0020 17D0              xcall _LCD16xx_write_char
 0022                   .dbline 44
 0022           ;     delay_nms(5);
 0022 05E0              ldi R16,5
 0024 10E0              ldi R17,0
 0026 0E940000          xcall _delay_nms
 002A                   .dbline 45
 002A           ;     LCD16xx_write_char(1,0x0c);      //显示开
 002A 2CE0              ldi R18,12
 002C 01E0              ldi R16,1
 002E 10D0              xcall _LCD16xx_write_char
 0030                   .dbline 46
 0030           ;     LCD16xx_write_char(1,0x01);      //显示清屏
 0030 21E0              ldi R18,1
 0032 01E0              ldi R16,1
 0034 0DD0              xcall _LCD16xx_write_char
 0036                   .dbline 47
 0036           ;     LCD16xx_write_char(1,0x06);      //显示光标移动设置
 0036 26E0              ldi R18,6
 0038 01E0              ldi R16,1
 003A                   .dbline -2
 003A                   .dbline 48
 003A           ; }
 003A           L1:
 003A                   .dbline 0 ; func end
 003A 0AC0              xjmp _LCD16xx_write_char
 003C                   .dbend
 003C                   .dbfunc e LCD16xx_en_write _LCD16xx_en_write fV
                        .even
 003C           _LCD16xx_en_write::
 003C                   .dbline -1
 003C                   .dbline 51
 003C           ; 
 003C           ; void LCD16xx_en_write(void)          //EN端产生一个高电平脉冲,写LCD
 003C           ; {
 003C                   .dbline 52
 003C           ;     E_H;
 003C D89A              sbi 0x1b,0
 003E                   .dbline 53
 003E           ;     delay_nus(4);                    //如果晶振频率太高,则可相应提高延时
 003E 04E0              ldi R16,4
 0040 10E0              ldi R17,0
 0042 0E940000          xcall _delay_nus
 0046                   .dbline 54
 0046           ;     E_L;
 0046 D898              cbi 0x1b,0
 0048                   .dbline -2
 0048                   .dbline 55
 0048           ; }
 0048           L2:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbend
 004A                   .dbfunc e LCD16xx_clr _LCD16xx_clr fV
                        .even
 004A           _LCD16xx_clr::
 004A                   .dbline -1
 004A                   .dbline 61
 004A           ; 
 004A           ; /************************************************************************/
 004A           ; /* LCD16xx清屏                                                          */
 004A           ; /************************************************************************/
 004A           ; void LCD16xx_clr(void)
 004A           ; {
 004A                   .dbline 62
 004A           ;     LCD16xx_write_char(1,0x01);
 004A 21E0              ldi R18,1
 004C 01E0              ldi R16,1
 004E                   .dbline -2
 004E                   .dbline 63
 004E           ; }
 004E           L3:
 004E                   .dbline 0 ; func end
 004E 00C0              xjmp _LCD16xx_write_char
 0050                   .dbend
 0050                   .dbfunc e LCD16xx_write_char _LCD16xx_write_char fV
 0050           ;          datal -> R20
 0050           ;          datah -> R22
 0050           ;           data -> R20
 0050           ;        command -> R10
                        .even
 0050           _LCD16xx_write_char::
 0050 0E940000          xcall push_gset3
 0054 422F              mov R20,R18
 0056 A02E              mov R10,R16
 0058                   .dbline -1
 0058                   .dbline 76
 0058           ; 
 0058           ; /*-----------------------------------------------------------------------
 0058           ; LCD16xx_write_char    : 英文字符串显示函数
 0058           ; 
 0058           ; 输入参数:*s      :英文字符串指针;
 0058           ;           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
 0058           ;                     LCD第一行显示寄存器地址:0x80-0x8F
 0058           ;                     LCD第一行显示寄存器地址:0xC0-0xCF
 0058           ; 编写日期          :2006年08月30日
 0058           ; 最后修改日期      :2006年08月30日
 0058           ; -----------------------------------------------------------------------*/
 0058           ; void LCD16xx_write_char(unsigned char command,unsigned char data)
 0058           ; {
 0058                   .dbline 79
 0058           ;     unsigned char datah,datal;        
 0058           ; 
 0058           ;     datah = data;
 0058 642F              mov R22,R20
 005A                   .dbline 80
 005A           ;     datal = data<<4 ;
 005A 842F              mov R24,R20
 005C 8F70              andi R24,#0x0F
 005E 8295              swap R24
 0060 482F              mov R20,R24
 0062                   .dbline 84
 0062           ; 
 0062           ;     //LCD16xx_wait_Ready();
 0062           ;    
 0062           ;     RW_L;                                   //RW=0
 0062 D998              cbi 0x1b,1
 0064                   .dbline 85
 0064           ;     if (command == 0)                       //data
 0064 AA20              tst R10
 0066 11F4              brne L5
 0068                   .dbline 86
 0068           ;        RS_H;                                //RS=1
 0068 DA9A              sbi 0x1b,2
 006A 01C0              xjmp L6
 006C           L5:
 006C                   .dbline 88
 006C           ;     else                                    //command
 006C           ;        RS_L;                                //RS=0
 006C DA98              cbi 0x1b,2
 006E           L6:
 006E                   .dbline 90
 006E           ;        
 006E           ;     LCD_DATA_PORT &= 0x0F;
 006E 82B3              in R24,0x12
 0070 8F70              andi R24,15
 0072 82BB              out 0x12,R24
 0074                   .dbline 91
 0074           ;     LCD_DATA_PORT |= datah&0xf0;            //send high 4bit
 0074 862F              mov R24,R22
 0076 807F              andi R24,240
 0078 22B2              in R2,0x12
 007A 282A              or R2,R24
 007C 22BA              out 0x12,R2
 007E                   .dbline 92
 007E           ;     LCD16xx_en_write();
 007E DEDF              xcall _LCD16xx_en_write
 0080                   .dbline 94
 0080           ; 
 0080           ;     LCD_DATA_PORT &= 0x0F;
 0080 82B3              in R24,0x12

⌨️ 快捷键说明

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