📄 1602b_lcd.lis
字号:
.module _1602B_LCD.c
.area text(rom, con, rel)
0000 .dbfile E:\mcu\avr\test\1602_duoji\1602B_LCD.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 17
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "1602LCD.h"
0000 ;
0000 ; /**********************************************************
0000 ; **********************************************************/
0000 ; /**********************************************************
0000 ; TC1602B LCD DISPLAY
0000 ; 建立时间:2003年11月9号
0000 ; 修改日期:2003年11月14号
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 18
0000 ; delay_nms(15);
0000 0FE0 ldi R16,15
0002 10E0 ldi R17,0
0004 0E940000 xcall _delay_nms
0008 .dbline 20
0008 ;
0008 ; LCD_write_char(0x28,0); //4bit test
0008 2227 clr R18
000A 3327 clr R19
000C 08E2 ldi R16,40
000E 10E0 ldi R17,0
0010 17D0 xcall _LCD_write_char
0012 .dbline 21
0012 ; LCD_write_char(0x0f,0); //显示开,显示光标,产生闪烁
0012 2227 clr R18
0014 3327 clr R19
0016 0FE0 ldi R16,15
0018 10E0 ldi R17,0
001A 12D0 xcall _LCD_write_char
001C .dbline 22
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 0DD0 xcall _LCD_write_char
0026 .dbline 23
0026 ; LCD_write_char(0x06,0); //显示光标移动设置
0026 2227 clr R18
0028 3327 clr R19
002A 06E0 ldi R16,6
002C 10E0 ldi R17,0
002E 08D0 xcall _LCD_write_char
0030 .dbline -2
0030 L1:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbend
0032 .dbfunc e LCD_en_write _LCD_en_write fV
.even
0032 _LCD_en_write::
0032 .dbline -1
0032 .dbline 27
0032 ; }
0032 ;
0032 ; void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
0032 ; {
0032 .dbline 28
0032 ; LCD_EN_PORT |= LCD_EN;
0032 959A sbi 0x12,5
0034 .dbline 29
0034 ; delay_nus(1);
0034 01E0 ldi R16,1
0036 10E0 ldi R17,0
0038 0E940000 xcall _delay_nus
003C .dbline 30
003C ; LCD_EN_PORT &= ~LCD_EN;
003C 9598 cbi 0x12,5
003E .dbline -2
003E L2:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e LCD_write_char _LCD_write_char fV
0040 ; data_temp -> R22,R23
0040 ; command_temp -> R20,R21
0040 ; data -> R12,R13
0040 ; command -> R10,R11
.even
0040 _LCD_write_char::
0040 0E940000 xcall push_gset4
0044 6901 movw R12,R18
0046 5801 movw R10,R16
0048 .dbline -1
0048 .dbline 45
0048 ; }
0048 ;
0048 ; /*-----------------------------------------------------------------------
0048 ; LCD_write_char : 英文字符串显示函数
0048 ;
0048 ; 输入参数:*s :英文字符串指针;
0048 ; X、Y : 显示字符串的位置,X:0-15,Y:0-1
0048 ; LCD第一行显示寄存器地址:0X80-0X8F
0048 ; LCD第一行显示寄存器地址:0XC0-0XCF
0048 ;
0048 ; 编写日期 :2003-11-19
0048 ; 最后修改日期 :2004-8-19
0048 ; -----------------------------------------------------------------------*/
0048 ; void LCD_write_char(unsigned command,unsigned data)//把写数据与写指令结合到了一起
0048 ; {
0048 .dbline 48
0048 ; unsigned command_temp,data_temp;
0048 ;
0048 ; command_temp = command;
0048 A501 movw R20,R10
004A .dbline 49
004A ; data_temp = data;
004A B601 movw R22,R12
004C .dbline 51
004C ;
004C ; LCD_wait_Ready();
004C 4FD0 xcall _LCD_wait_Ready
004E .dbline 53
004E ;
004E ; LCD_RW_PORT &= ~LCD_RW; //RW=0
004E 9398 cbi 0x12,3
0050 .dbline 55
0050 ;
0050 ; if (command == 0)
0050 4030 cpi R20,0
0052 4507 cpc R20,R21
0054 69F4 brne L4
0056 X0:
0056 .dbline 56
0056 ; {
0056 .dbline 57
0056 ; LCD_RS_PORT |= LCD_RS; //RS=1
0056 949A sbi 0x12,4
0058 .dbline 58
0058 ; LCD_DATA_PORT &= 0X0F;
0058 88B3 in R24,0x18
005A 8F70 andi R24,15
005C 88BB out 0x18,R24
005E .dbline 59
005E ; LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
005E CB01 movw R24,R22
0060 807F andi R24,240
0062 9070 andi R25,0
0064 28B2 in R2,0x18
0066 3324 clr R3
0068 282A or R2,R24
006A 392A or R3,R25
006C 28BA out 0x18,R2
006E .dbline 60
006E ; }
006E 0CC0 xjmp L5
0070 L4:
0070 .dbline 62
0070 ; else
0070 ; {
0070 .dbline 63
0070 ; LCD_RS_PORT &= ~LCD_RS; //RS=0
0070 9498 cbi 0x12,4
0072 .dbline 64
0072 ; LCD_DATA_PORT &= 0X0F;
0072 88B3 in R24,0x18
0074 8F70 andi R24,15
0076 88BB out 0x18,R24
0078 .dbline 65
0078 ; LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
0078 CA01 movw R24,R20
007A 807F andi R24,240
007C 9070 andi R25,0
007E 28B2 in R2,0x18
0080 3324 clr R3
0082 282A or R2,R24
0084 392A or R3,R25
0086 28BA out 0x18,R2
0088 .dbline 66
0088 ; }
0088 L5:
0088 .dbline 67
0088 ; LCD_en_write();
0088 D4DF xcall _LCD_en_write
008A .dbline 69
008A ;
008A ; command_temp=command_temp << 4; //send low 4bit
008A 440F lsl R20
008C 551F rol R21
008E 440F lsl R20
0090 551F rol R21
0092 440F lsl R20
0094 551F rol R21
0096 440F lsl R20
0098 551F rol R21
009A .dbline 70
009A ; data_temp=data_temp << 4;
009A 660F lsl R22
009C 771F rol R23
009E 660F lsl R22
00A0 771F rol R23
00A2 660F lsl R22
00A4 771F rol R23
00A6 660F lsl R22
00A8 771F rol R23
00AA .dbline 72
00AA ;
00AA ; LCD_DATA_PORT &= 0X0F;
00AA 88B3 in R24,0x18
00AC 8F70 andi R24,15
00AE 88BB out 0x18,R24
00B0 .dbline 73
00B0 ; if (command==0)
00B0 AA20 tst R10
00B2 59F4 brne L6
00B4 BB20 tst R11
00B6 49F4 brne L6
00B8 X1:
00B8 .dbline 74
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -