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

📄 lcd.lis

📁 PC通过串口控制LCD1602显示!MCU为AVR单片机!
💻 LIS
字号:
                        .module lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\我的设计\delphi\uartdispy\mcu\lcd.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; /*********************************Copyright (c)*********************************
 0000           ; **                              
 0000           ; ** 文   件   名: LCD.c
 0000           ; ** 最后修改日期: 2005年06月8日
 0000           ; ** 描        述: 1602液晶驱动函数
 0000           ; ** 版      本: V1.0
 0000           ; ** 主  控  芯 片:M16  晶振频率:8 MHZ
 0000           ; *******************************************************************************/
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #include "function.h"
 0000           ; #include "define.h"
 0000           ; #include "defineLCD.h"
 0000           ; /******************************************************************************
 0000           ; 
 0000           ; 
 0000           ;                                函数定义
 0000           ; 
 0000           ; ******************************************************************************/
 0000           ; 
 0000           ; void LCD_init(void)       //液晶初始化
 0000           ; {
 0000                   .dbline 23
 0000           ;  delay_nms(15);
 0000 0FE0              ldi R16,15
 0002 10E0              ldi R17,0
 0004 0E940000          xcall _delay_nms
 0008                   .dbline 24
 0008           ;  LCD_write_char(0x28,0);  //4位显示
 0008 2227              clr R18
 000A 3327              clr R19
 000C 08E2              ldi R16,40
 000E 10E0              ldi R17,0
 0010 3ED0              xcall _LCD_write_char
 0012                   .dbline 25
 0012           ;  LCD_write_char(0x0c,0);  //显示开
 0012 2227              clr R18
 0014 3327              clr R19
 0016 0CE0              ldi R16,12
 0018 10E0              ldi R17,0
 001A 39D0              xcall _LCD_write_char
 001C                   .dbline 26
 001C           ;  LCD_write_char(0x01,0);  //清屏
 001C 2227              clr R18
 001E 3327              clr R19
 0020 01E0              ldi R16,1
 0022 10E0              ldi R17,0
 0024 34D0              xcall _LCD_write_char
 0026                   .dbline -2
 0026           L1:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbend
 0028                   .dbfunc e LCD_write_string _LCD_write_string fV
 0028           ;              s -> R20,R21
 0028           ;              Y -> R10
 0028           ;              X -> R22
                        .even
 0028           _LCD_write_string::
 0028 0E940000          xcall push_gset3
 002C A22E              mov R10,R18
 002E 602F              mov R22,R16
 0030 4E81              ldd R20,y+6
 0032 5F81              ldd R21,y+7
 0034                   .dbline -1
 0034                   .dbline 31
 0034           ; }
 0034           ; 
 0034           ; 
 0034           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
 0034           ;   {
 0034                   .dbline 32
 0034           ;     LCD_set_xy( X, Y ); //写地址
 0034 2A2D              mov R18,R10
 0036 062F              mov R16,R22
 0038 10D0              xcall _LCD_set_xy
 003A 08C0              xjmp L4
 003C           L3:
 003C                   .dbline 35
 003C                   .dbline 36
 003C FA01              movw R30,R20
 003E 2081              ldd R18,z+0
 0040 3327              clr R19
 0042 0027              clr R16
 0044 1127              clr R17
 0046 23D0              xcall _LCD_write_char
 0048                   .dbline 37
 0048 4F5F              subi R20,255  ; offset = 1
 004A 5F4F              sbci R21,255
 004C                   .dbline 38
 004C           L4:
 004C                   .dbline 34
 004C           ;     
 004C           ;     while (*s)  // 写显示字符
 004C FA01              movw R30,R20
 004E 2080              ldd R2,z+0
 0050 2220              tst R2
 0052 A1F7              brne L3
 0054                   .dbline -2
 0054           L2:
 0054 0E940000          xcall pop_gset3
 0058                   .dbline 0 ; func end
 0058 0895              ret
 005A                   .dbsym r s 20 pc
 005A                   .dbsym r Y 10 c
 005A                   .dbsym r X 22 c
 005A                   .dbend
 005A                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 005A           ;        address -> R20
 005A           ;              y -> R20
 005A           ;              x -> R22
                        .even
 005A           _LCD_set_xy::
 005A 0E940000          xcall push_gset2
 005E 422F              mov R20,R18
 0060 602F              mov R22,R16
 0062                   .dbline -1
 0062                   .dbline 43
 0062           ;       {
 0062           ;         LCD_write_char( 0, *s );
 0062           ;       s ++;
 0062           ;       }
 0062           ;   }
 0062           ;  
 0062           ; 
 0062           ; void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
 0062           ;   {
 0062                   .dbline 45
 0062           ;     unsigned char address;
 0062           ;     if (y == 0) address = 0x80 + x;
 0062 4423              tst R20
 0064 19F4              brne L7
 0066                   .dbline 45
 0066 462F              mov R20,R22
 0068 4058              subi R20,128    ; addi 128
 006A 02C0              xjmp L8
 006C           L7:
 006C                   .dbline 47
 006C           ;     else 
 006C           ;        address = 0xc0 + x;
 006C 462F              mov R20,R22
 006E 4054              subi R20,64    ; addi 192
 0070           L8:
 0070                   .dbline 48
 0070           ;     LCD_write_char( address, 0 );
 0070 2227              clr R18
 0072 3327              clr R19
 0074 042F              mov R16,R20
 0076 1127              clr R17
 0078 0AD0              xcall _LCD_write_char
 007A                   .dbline -2
 007A           L6:
 007A 0E940000          xcall pop_gset2
 007E                   .dbline 0 ; func end
 007E 0895              ret
 0080                   .dbsym r address 20 c
 0080                   .dbsym r y 20 c
 0080                   .dbsym r x 22 c
 0080                   .dbend
 0080                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0080           _LCD_en_write::
 0080                   .dbline -1
 0080                   .dbline 52
 0080           ;   }
 0080           ;   
 0080           ; void LCD_en_write(void)  //液晶使能
 0080           ;  {
 0080                   .dbline 53
 0080           ;   LCD_EN_PORT|=LCD_EN;
 0080 AF9A              sbi 0x15,7
 0082                   .dbline 54
 0082           ;   delay_nus(1);
 0082 01E0              ldi R16,1
 0084 10E0              ldi R17,0
 0086 0E940000          xcall _delay_nus
 008A                   .dbline 55
 008A           ;   LCD_EN_PORT&=~LCD_EN;
 008A AF98              cbi 0x15,7
 008C                   .dbline -2
 008C           L9:
 008C                   .dbline 0 ; func end
 008C 0895              ret
 008E                   .dbend
 008E                   .dbfunc e LCD_write_char _LCD_write_char fV
 008E           ;      data_temp -> R22,R23
 008E           ;   command_temp -> R20,R21
 008E           ;           data -> R12,R13
 008E           ;        command -> R10,R11
                        .even
 008E           _LCD_write_char::
 008E 0E940000          xcall push_gset4
 0092 6901              movw R12,R18
 0094 5801              movw R10,R16
 0096                   .dbline -1
 0096                   .dbline 59
 0096           ;  }
 0096           ;  
 0096           ; void LCD_write_char(unsigned command,unsigned data) // 写数据
 0096           ; {
 0096                   .dbline 61
 0096           ;  unsigned command_temp,data_temp;
 0096           ;  command_temp=command;
 0096 A501              movw R20,R10
 0098                   .dbline 62
 0098           ;  data_temp=data;
 0098 B601              movw R22,R12
 009A                   .dbline 63
 009A           ;  delay_nus(16);
 009A 00E1              ldi R16,16
 009C 10E0              ldi R17,0
 009E 0E940000          xcall _delay_nus
 00A2                   .dbline 64
 00A2           ;  if(command==0)
 00A2 4030              cpi R20,0
 00A4 4507              cpc R20,R21
 00A6 11F5              brne L11
 00A8           X0:
 00A8                   .dbline 65
 00A8           ;  {
 00A8                   .dbline 66
 00A8           ;   LCD_RS_PORT|=LCD_RS;  //RS=1
 00A8 AE9A              sbi 0x15,6
 00AA                   .dbline 67
 00AA           ;   LCD_DATA_PORT&=0X0f;
 00AA 8BB3              in R24,0x1b
 00AC 8F70              andi R24,15
 00AE 8BBB              out 0x1b,R24
 00B0                   .dbline 68
 00B0           ;   LCD_DATA_PORT|=data_temp&0xf0;  //写高四位
 00B0 CB01              movw R24,R22
 00B2 807F              andi R24,240
 00B4 9070              andi R25,0
 00B6 2BB2              in R2,0x1b
 00B8 3324              clr R3
 00BA 282A              or R2,R24
 00BC 392A              or R3,R25
 00BE 2BBA              out 0x1b,R2
 00C0                   .dbline 69
 00C0           ;   LCD_en_write();
 00C0 DFDF              xcall _LCD_en_write
 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 8BB3              in R24,0x1b
 00D4 8F70              andi R24,15
 00D6 8BBB              out 0x1b,R24
 00D8                   .dbline 72
 00D8           ;   LCD_DATA_PORT|=data_temp&0xf0;   //写低四位
 00D8 CB01              movw R24,R22
 00DA 807F              andi R24,240
 00DC 9070              andi R25,0
 00DE 2BB2              in R2,0x1b
 00E0 3324              clr R3
 00E2 282A              or R2,R24
 00E4 392A              or R3,R25
 00E6 2BBA              out 0x1b,R2
 00E8                   .dbline 73
 00E8           ;   LCD_en_write();
 00E8 CBDF              xcall _LCD_en_write
 00EA                   .dbline 74
 00EA           ;  }
 00EA 21C0              xjmp L12
 00EC           L11:
 00EC                   .dbline 76
 00EC                   .dbline 77
 00EC AE98              cbi 0x15,6
 00EE                   .dbline 78
 00EE 8BB3              in R24,0x1b
 00F0 8F70              andi R24,15
 00F2 8BBB              out 0x1b,R24
 00F4                   .dbline 79
 00F4 CA01              movw R24,R20
 00F6 807F              andi R24,240
 00F8 9070              andi R25,0
 00FA 2BB2              in R2,0x1b
 00FC 3324              clr R3
 00FE 282A              or R2,R24
 0100 392A              or R3,R25
 0102 2BBA              out 0x1b,R2
 0104                   .dbline 80
 0104 BDDF              xcall _LCD_en_write
 0106                   .dbline 81
 0106 440F              lsl R20
 0108 551F              rol R21
 010A 440F              lsl R20
 010C 551F              rol R21
 010E 440F              lsl R20
 0110 551F              rol R21
 0112 440F              lsl R20
 0114 551F              rol R21
 0116                   .dbline 82
 0116 8BB3              in R24,0x1b
 0118 8F70              andi R24,15
 011A 8BBB              out 0x1b,R24
 011C                   .dbline 83
 011C CA01              movw R24,R20
 011E 807F              andi R24,240
 0120 9070              andi R25,0
 0122 2BB2              in R2,0x1b
 0124 3324              clr R3
 0126 282A              or R2,R24
 0128 392A              or R3,R25
 012A 2BBA              out 0x1b,R2
 012C                   .dbline 84
 012C A9DF              xcall _LCD_en_write
 012E                   .dbline 85
 012E           L12:
 012E                   .dbline -2
 012E           L10:
 012E 0E940000          xcall pop_gset4
 0132                   .dbline 0 ; func end
 0132 0895              ret
 0134                   .dbsym r data_temp 22 i
 0134                   .dbsym r command_temp 20 i
 0134                   .dbsym r data 12 i
 0134                   .dbsym r command 10 i
 0134                   .dbend

⌨️ 快捷键说明

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