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

📄 lcd.lis

📁 基于m16的寻迹寻光小车程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\Administrator\桌面\自动充电小车\自动充电小车\298\lcd.c
 0000                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 0000           _LCD_en_write::
 0000                   .dbline -1
 0000                   .dbline 11
 0000           ; #define _LCD_C_
 0000           ; #include "LCD.h"
 0000           ; #include <iom16v.h>
 0000           ; //==========================================
 0000           ; //函数名称:液晶模块使能
 0000           ; //函数作用: 使能液晶
 0000           ; //入口参数: 无
 0000           ; //返回类型:无
 0000           ; //==========================================
 0000           ; void LCD_en_write(void)
 0000           ; {
 0000                   .dbline 12
 0000           ;   EN_SET;
 0000 C79A              sbi 0x18,7
 0002                   .dbline 13
 0002           ;   delay_nus(4);
 0002 04E0              ldi R16,4
 0004 10E0              ldi R17,0
 0006 0E940000          xcall _delay_nus
 000A                   .dbline 14
 000A           ;   EN_CLR;
 000A C798              cbi 0x18,7
 000C                   .dbline -2
 000C           L1:
 000C                   .dbline 0 ; func end
 000C 0895              ret
 000E                   .dbend
 000E                   .dbfunc e LCD_write_command _LCD_write_command fV
 000E           ;        command -> R20
                        .even
 000E           _LCD_write_command::
 000E 4A93              st -y,R20
 0010 402F              mov R20,R16
 0012                   .dbline -1
 0012                   .dbline 24
 0012           ; }
 0012           ; 
 0012           ; //==========================================
 0012           ; //函数名称:写指令
 0012           ; //函数作用:
 0012           ; //入口参数: 液晶指令command
 0012           ; //返回类型:无
 0012           ; //==========================================
 0012           ; void LCD_write_command(uchar command)
 0012           ; {
 0012                   .dbline 25
 0012           ;   delay_nus( 16 );
 0012 00E1              ldi R16,16
 0014 10E0              ldi R17,0
 0016 0E940000          xcall _delay_nus
 001A                   .dbline 26
 001A           ;   RS_CLR;
 001A C698              cbi 0x18,6
 001C                   .dbline 27
 001C           ;   DB &= 0X0F;           //清高四位
 001C 8BB3              in R24,0x1b
 001E 8F70              andi R24,15
 0020 8BBB              out 0x1b,R24
 0022                   .dbline 28
 0022           ;   DB |= command & 0xf0; //写高四位
 0022 842F              mov R24,R20
 0024 807F              andi R24,240
 0026 2BB2              in R2,0x1b
 0028 282A              or R2,R24
 002A 2BBA              out 0x1b,R2
 002C                   .dbline 29
 002C           ;   LCD_en_write();
 002C E9DF              xcall _LCD_en_write
 002E                   .dbline 30
 002E           ;   command=command << 4;   //低四位移到高四位
 002E 842F              mov R24,R20
 0030 8F70              andi R24,#0x0F
 0032 8295              swap R24
 0034 482F              mov R20,R24
 0036                   .dbline 31
 0036           ;   DB &= 0x0f;             //清高四位
 0036 8BB3              in R24,0x1b
 0038 8F70              andi R24,15
 003A 8BBB              out 0x1b,R24
 003C                   .dbline 32
 003C           ;   DB |= command & 0xf0;   //写低四位
 003C 842F              mov R24,R20
 003E 807F              andi R24,240
 0040 2BB2              in R2,0x1b
 0042 282A              or R2,R24
 0044 2BBA              out 0x1b,R2
 0046                   .dbline 33
 0046           ;   LCD_en_write();
 0046 DCDF              xcall _LCD_en_write
 0048                   .dbline -2
 0048           L2:
 0048                   .dbline 0 ; func end
 0048 4991              ld R20,y+
 004A 0895              ret
 004C                   .dbsym r command 20 c
 004C                   .dbend
 004C                   .dbfunc e LCD_write_data _LCD_write_data fV
 004C           ;           DATA -> R20
                        .even
 004C           _LCD_write_data::
 004C 4A93              st -y,R20
 004E 402F              mov R20,R16
 0050                   .dbline -1
 0050                   .dbline 44
 0050           ;   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
 0050           ; }
 0050           ; 
 0050           ; //==========================================
 0050           ; //函数名称:写数据
 0050           ; //函数作用:
 0050           ; //入口参数: 数据DATA
 0050           ; //返回类型:无
 0050           ; //==========================================
 0050           ; void LCD_write_data(uchar DATA)
 0050           ; {
 0050                   .dbline 45
 0050           ;   delay_nus(16);
 0050 00E1              ldi R16,16
 0052 10E0              ldi R17,0
 0054 0E940000          xcall _delay_nus
 0058                   .dbline 46
 0058           ;   RS_SET;           //RS=1
 0058 C69A              sbi 0x18,6
 005A                   .dbline 47
 005A           ;   DB &= 0X0f;       //清高四位
 005A 8BB3              in R24,0x1b
 005C 8F70              andi R24,15
 005E 8BBB              out 0x1b,R24
 0060                   .dbline 48
 0060           ;   DB |= DATA&0xf0;  //写高四位
 0060 842F              mov R24,R20
 0062 807F              andi R24,240
 0064 2BB2              in R2,0x1b
 0066 282A              or R2,R24
 0068 2BBA              out 0x1b,R2
 006A                   .dbline 49
 006A           ;   LCD_en_write();
 006A CADF              xcall _LCD_en_write
 006C                   .dbline 50
 006C           ;   DATA = DATA << 4; //低四位移到高四位
 006C 842F              mov R24,R20
 006E 8F70              andi R24,#0x0F
 0070 8295              swap R24
 0072 482F              mov R20,R24
 0074                   .dbline 51
 0074           ;   DB &= 0X0f;       //清高四位
 0074 8BB3              in R24,0x1b
 0076 8F70              andi R24,15
 0078 8BBB              out 0x1b,R24
 007A                   .dbline 52
 007A           ;   DB |= DATA&0xf0;  //写低四位
 007A 842F              mov R24,R20
 007C 807F              andi R24,240
 007E 2BB2              in R2,0x1b
 0080 282A              or R2,R24
 0082 2BBA              out 0x1b,R2
 0084                   .dbline 53
 0084           ;   LCD_en_write();
 0084 BDDF              xcall _LCD_en_write
 0086                   .dbline -2
 0086           L3:
 0086                   .dbline 0 ; func end
 0086 4991              ld R20,y+
 0088 0895              ret
 008A                   .dbsym r DATA 20 c
 008A                   .dbend
 008A                   .dbfunc e LCD_init _LCD_init fV
                        .even
 008A           _LCD_init::
 008A                   .dbline -1
 008A                   .dbline 63
 008A           ; }
 008A           ; 
 008A           ; //==========================================
 008A           ; //函数名称:液晶初始化函数
 008A           ; //函数作用:
 008A           ; //入口参数: 无
 008A           ; //返回类型:无
 008A           ; //==========================================
 008A           ; void LCD_init( void )
 008A           ; {
 008A                   .dbline 64
 008A           ;   DB_DDR_OUT;
 008A                   .dbline 64
 008A 8AB3              in R24,0x1a
 008C 806F              ori R24,240
 008E 8ABB              out 0x1a,R24
 0090 87B3              in R24,0x17
 0092 806C              ori R24,192
 0094 87BB              out 0x17,R24
 0096                   .dbline 64
 0096                   .dbline 64
 0096                   .dbline 65
 0096           ;   LCD_write_command(0x28);
 0096 08E2              ldi R16,40
 0098 BADF              xcall _LCD_write_command
 009A                   .dbline 66
 009A           ;   LCD_en_write();           //********总结这里一定要加这液晶使能*********
 009A B2DF              xcall _LCD_en_write
 009C                   .dbline 67
 009C           ;   delay_nus(20);
 009C 04E1              ldi R16,20
 009E 10E0              ldi R17,0
 00A0 0E940000          xcall _delay_nus
 00A4                   .dbline 68
 00A4           ;   LCD_write_command(0x28);  //4位显示
 00A4 08E2              ldi R16,40
 00A6 B3DF              xcall _LCD_write_command
 00A8                   .dbline 69
 00A8           ;   LCD_write_command(0x0c);  //显示开
 00A8 0CE0              ldi R16,12
 00AA B1DF              xcall _LCD_write_command
 00AC                   .dbline 70
 00AC           ;   LCD_write_command(0x01);  //清屏
 00AC 01E0              ldi R16,1
 00AE AFDF              xcall _LCD_write_command
 00B0                   .dbline 71
 00B0           ;   delay_nms(5);             //延时一定要长
 00B0 05E0              ldi R16,5
 00B2 10E0              ldi R17,0
 00B4 0E940000          xcall _delay_nms
 00B8                   .dbline -2
 00B8           L4:
 00B8                   .dbline 0 ; func end
 00B8 0895              ret
 00BA                   .dbend
 00BA                   .dbfunc e LCD_set_rc _LCD_set_rc fV
 00BA           ;        address -> R20
 00BA           ;              c -> R22
 00BA           ;              r -> R10
                        .even
 00BA           _LCD_set_rc::
 00BA 0E940000          xcall push_xgsetF00C
 00BE 622F              mov R22,R18
 00C0 A02E              mov R10,R16
 00C2                   .dbline -1
 00C2                   .dbline 81
 00C2           ; }
 00C2           ; 
 00C2           ; //==========================================
 00C2           ; //函数名称:写地址
 00C2           ; //函数作用:
 00C2           ; //入口参数: 行位置r, 列位置c
 00C2           ; //返回类型:无
 00C2           ; //==========================================
 00C2           ; void LCD_set_rc( uchar r, uchar c )
 00C2           ; {
 00C2                   .dbline 84
 00C2           ;     uchar address;
 00C2           ; 
 00C2           ;     if (r == 1)
 00C2 8A2D              mov R24,R10
 00C4 8130              cpi R24,1
 00C6 19F4              brne L6
 00C8           X0:
 00C8                   .dbline 85
 00C8           ;     address = 0x80 + c;
 00C8 462F              mov R20,R22
 00CA 4058              subi R20,128    ; addi 128
 00CC 05C0              xjmp L7
 00CE           L6:
 00CE                   .dbline 86
 00CE           ;     else if(r == 2)
 00CE 8A2D              mov R24,R10
 00D0 8230              cpi R24,2
 00D2 11F4              brne L8
 00D4           X1:
 00D4                   .dbline 87
 00D4           ;     address = 0xc0 + c;
 00D4 462F              mov R20,R22
 00D6 4054              subi R20,64    ; addi 192
 00D8           L8:
 00D8           L7:
 00D8                   .dbline 89
 00D8           ; 
 00D8           ;     LCD_write_command( address );
 00D8 042F              mov R16,R20
 00DA 99DF              xcall _LCD_write_command
 00DC                   .dbline -2
 00DC           L5:
 00DC                   .dbline 0 ; func end
 00DC 0C940000          xjmp pop_xgsetF00C
 00E0                   .dbsym r address 20 c
 00E0                   .dbsym r c 22 c
 00E0                   .dbsym r r 10 c
 00E0                   .dbend
 00E0                   .dbfunc e LCD_write_string _LCD_write_string fV
 00E0           ;              s -> R20,R21
 00E0           ;              c -> R12
 00E0           ;              r -> R10
                        .even
 00E0           _LCD_write_string::
 00E0 0E940000          xcall push_xgset303C
 00E4 C22E              mov R12,R18
 00E6 A02E              mov R10,R16
 00E8 4E81              ldd R20,y+6
 00EA 5F81              ldd R21,y+7
 00EC                   .dbline -1
 00EC                   .dbline 99
 00EC           ; }
 00EC           ; 
 00EC           ; //==========================================
 00EC           ; //函数名称:写字符串
 00EC           ; //函数作用: 在指定位置写一串字符串
 00EC           ; //入口参数: 行位置r, 列位置c, 字符串*s
 00EC           ; //返回类型:无
 00EC           ; //==========================================
 00EC           ; void LCD_write_string(uchar r, uchar c, uchar *s)
 00EC           ; {
 00EC                   .dbline 100
 00EC           ;     LCD_set_rc( r, c ); //写地址
 00EC 2C2D              mov R18,R12
 00EE 0A2D              mov R16,R10
 00F0 E4DF              xcall _LCD_set_rc
 00F2 05C0              xjmp L12
 00F4           L11:
 00F4                   .dbline 103
 00F4           ; 
 00F4           ;     while( *s )               // 写显示字符
 00F4           ;     {
 00F4                   .dbline 104
 00F4           ;       LCD_write_data( *s );
 00F4 FA01              movw R30,R20
 00F6 0081              ldd R16,z+0
 00F8 A9DF              xcall _LCD_write_data
 00FA                   .dbline 105
 00FA           ;       s++;
 00FA 4F5F              subi R20,255  ; offset = 1
 00FC 5F4F              sbci R21,255
 00FE                   .dbline 106
 00FE           ;     }
 00FE           L12:
 00FE                   .dbline 102
 00FE FA01              movw R30,R20
 0100 2080              ldd R2,z+0

⌨️ 快捷键说明

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