📄 1602b_lcd.lis
字号:
.module _1602B_LCD.c
.area text(rom, con, rel)
0000 .dbfile G:\电子资料\avrtest\1602六线接法练习\1602B_LCD.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 23
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "1602LCD.h"
0000 ;
0000 ;
0000 ; unsigned data_temp;
0000 ; /**********************************************************
0000 ; 光标命令
0000 ; LCD_write_char(0x0e,0); //光标开
0000 ; LCD_write_char(0x0d,0); //光标所在字符闪烁
0000 ; LCD_write_char(0x0c,0); //光标关
0000 ; **********************************************************/
0000 ; /**********************************************************
0000 ; TC1602B LCD DISPLAY
0000 ; 建立时间:2003年11月9号
0000 ; 修改日期:2003年11月14号
0000 ; LCD_write函数功能:当command=1时,向LCD写入数据,否则向LCD写
0000 ; 入命令
0000 ; LCD第一行显示寄存器地址:0X80-0X8F
0000 ; LCD第二行显示寄存器地址:0XC0-0XCF
0000 ; **********************************************************/
0000 ; void LCD_init(void)
0000 ; {
0000 .dbline 24
0000 ; LCD_write_char(0,0x28); //4bit test
0000 28E2 ldi R18,40
0002 30E0 ldi R19,0
0004 0027 clr R16
0006 1127 clr R17
0008 0FD0 xcall _LCD_write_char
000A .dbline 25
000A ; LCD_write_char(0,0x0c); //显示开
000A 2CE0 ldi R18,12
000C 30E0 ldi R19,0
000E 0027 clr R16
0010 1127 clr R17
0012 0AD0 xcall _LCD_write_char
0014 .dbline 26
0014 ; LCD_write_char(0,0x01); //显示清屏
0014 21E0 ldi R18,1
0016 30E0 ldi R19,0
0018 0027 clr R16
001A 1127 clr R17
001C 05D0 xcall _LCD_write_char
001E .dbline 27
001E ; delay_nms(2);
001E 02E0 ldi R16,2
0020 10E0 ldi R17,0
0022 0E940000 xcall _delay_nms
0026 .dbline -2
0026 L1:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbend
0028 .dbfunc e LCD_write_char _LCD_write_char fV
0028 ; data -> R20,R21
0028 ; command -> R22,R23
.even
0028 _LCD_write_char::
0028 0E940000 xcall push_gset2
002C A901 movw R20,R18
002E B801 movw R22,R16
0030 .dbline -1
0030 .dbline 41
0030 ; }
0030 ; /*-----------------------------------------------------------------------
0030 ; LCD_write_char : 英文字符串显示函数
0030 ;
0030 ; 输入参数:*s :英文字符串指针;
0030 ; X、Y : 显示字符串的位置,X:0-15,Y:0-1
0030 ; LCD第一行显示寄存器地址:0X80-0X8F
0030 ; LCD第一行显示寄存器地址:0XC0-0XCF
0030 ;
0030 ; 编写日期 :2003-11-19
0030 ; 最后修改日期 :2004-8-19
0030 ; -----------------------------------------------------------------------*/
0030 ; void LCD_write_char(unsigned command,unsigned data)
0030 ; {
0030 .dbline 42
0030 ; if (command == 0)
0030 6030 cpi R22,0
0032 6707 cpc R22,R23
0034 11F4 brne L3
0036 X0:
0036 .dbline 43
0036 ; LCD_RS_PORT &= ~LCD_RS; //RS=0
0036 DA98 cbi 0x1b,2
0038 01C0 xjmp L4
003A L3:
003A .dbline 45
003A ; else
003A ; LCD_RS_PORT |= LCD_RS; //RS=1
003A DA9A sbi 0x1b,2
003C L4:
003C .dbline 47
003C ;
003C ; data_temp = data;
003C 50930100 sts _data_temp+1,R21
0040 40930000 sts _data_temp,R20
0044 .dbline 48
0044 ; LCD_Write_half_char();
0044 19D0 xcall _LCD_Write_half_char
0046 .dbline 49
0046 ; data_temp = data;
0046 50930100 sts _data_temp+1,R21
004A 40930000 sts _data_temp,R20
004E .dbline 50
004E ; data_temp=data_temp << 4;
004E 1A01 movw R2,R20
0050 220C lsl R2
0052 331C rol R3
0054 220C lsl R2
0056 331C rol R3
0058 220C lsl R2
005A 331C rol R3
005C 220C lsl R2
005E 331C rol R3
0060 30920100 sts _data_temp+1,R3
0064 20920000 sts _data_temp,R2
0068 .dbline 51
0068 ; LCD_Write_half_char();
0068 07D0 xcall _LCD_Write_half_char
006A .dbline 52
006A ; delay_nus(100);
006A 04E6 ldi R16,100
006C 10E0 ldi R17,0
006E 0E940000 xcall _delay_nus
0072 .dbline -2
0072 L2:
0072 0E940000 xcall pop_gset2
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r data 20 i
0078 .dbsym r command 22 i
0078 .dbend
0078 .dbfunc e LCD_Write_half_char _LCD_Write_half_char fV
.even
0078 _LCD_Write_half_char::
0078 .dbline -1
0078 .dbline 56
0078 ; }
0078 ; /*---------写高4bit到LCD----*/
0078 ; void LCD_Write_half_char(void)
0078 ; {
0078 .dbline 57
0078 ; LCD_EN_PORT &= ~LCD_EN;
0078 DB98 cbi 0x1b,3
007A .dbline 58
007A ; delay_nus(4);
007A 04E0 ldi R16,4
007C 10E0 ldi R17,0
007E 0E940000 xcall _delay_nus
0082 .dbline 59
0082 ; LCD_DATA_PORT &= 0X0f; //portd4~7=0
0082 8BB3 in R24,0x1b
0084 8F70 andi R24,15
0086 8BBB out 0x1b,R24
0088 .dbline 60
0088 ; LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
0088 80910000 lds R24,_data_temp
008C 90910100 lds R25,_data_temp+1
0090 807F andi R24,240
0092 9070 andi R25,0
0094 2BB2 in R2,0x1b
0096 3324 clr R3
0098 282A or R2,R24
009A 392A or R3,R25
009C 2BBA out 0x1b,R2
009E .dbline 61
009E ; LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
009E DB9A sbi 0x1b,3
00A0 .dbline 62
00A0 ; delay_nus(4);
00A0 04E0 ldi R16,4
00A2 10E0 ldi R17,0
00A4 0E940000 xcall _delay_nus
00A8 .dbline 63
00A8 ; LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
00A8 DB98 cbi 0x1b,3
00AA .dbline 64
00AA ; LCD_DATA_PORT &= 0X0f;
00AA 8BB3 in R24,0x1b
00AC 8F70 andi R24,15
00AE 8BBB out 0x1b,R24
00B0 .dbline 65
00B0 ; delay_nus(4);
00B0 04E0 ldi R16,4
00B2 10E0 ldi R17,0
00B4 0E940000 xcall _delay_nus
00B8 .dbline -2
00B8 L5:
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbend
00BA .dbfunc e LCD_set_xy _LCD_set_xy fV
00BA ; address -> R20
00BA ; y -> R20
00BA ; x -> R22
.even
00BA _LCD_set_xy::
00BA 0E940000 xcall push_gset2
00BE 422F mov R20,R18
00C0 602F mov R22,R16
00C2 .dbline -1
00C2 .dbline 79
00C2 ; }
00C2 ;
00C2 ; /*-----------------------------------------------------------------------
00C2 ; LCD_set_xy : 设置LCD显示的起始位置
00C2 ;
00C2 ; 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
00C2 ; LCD第一行显示寄存器地址:0X80-0X8F
00C2 ; LCD第一行显示寄存器地址:0XC0-0XCF
00C2 ;
00C2 ; 编写日期 :2004-8-19
00C2 ; 最后修改日期 :2004-8-19
00C2 ; -----------------------------------------------------------------------*/
00C2 ; void LCD_set_xy( unsigned char x, unsigned char y )
00C2 ; {
00C2 .dbline 81
00C2 ; unsigned char address;
00C2 ; if (y == 0) address = 0x80 + x;
00C2 4423 tst R20
00C4 19F4 brne L7
00C6 .dbline 81
00C6 462F mov R20,R22
00C8 4058 subi R20,128 ; addi 128
00CA 02C0 xjmp L8
00CC L7:
00CC .dbline 83
00CC ; else
00CC ; address = 0xc0 + x;
00CC 462F mov R20,R22
00CE 4054 subi R20,64 ; addi 192
00D0 L8:
00D0 .dbline 84
00D0 ; LCD_write_char(0,address);
00D0 242F mov R18,R20
00D2 3327 clr R19
00D4 0027 clr R16
00D6 1127 clr R17
00D8 A7DF xcall _LCD_write_char
00DA .dbline -2
00DA L6:
00DA 0E940000 xcall pop_gset2
00DE .dbline 0 ; func end
00DE 0895 ret
00E0 .dbsym r address 20 c
00E0 .dbsym r y 20 c
00E0 .dbsym r x 22 c
00E0 .dbend
00E0 .dbfunc e LCD_write_string _LCD_write_string fV
00E0 ; s -> R20,R21
00E0 ; Y -> R10
00E0 ; X -> R22
.even
00E0 _LCD_write_string::
00E0 0E940000 xcall push_gset3
00E4 A22E mov R10,R18
00E6 602F mov R22,R16
00E8 4E81 ldd R20,y+6
00EA 5F81 ldd R21,y+7
00EC .dbline -1
00EC .dbline 96
00EC ; }
00EC ; /*-----------------------------------------------------------------------
00EC ; LCD_write_string : 英文字符串显示函数
00EC ;
00EC ; 输入参数:*s :英文字符串指针;
00EC ; X、Y : 显示字符串的位置
00EC ;
00EC ; 编写日期 :2004-8-19
00EC ; 最后修改日期 :2004-8-19
00EC ; -----------------------------------------------------------------------*/
00EC ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
00EC ; {
00EC .dbline 97
00EC ; LCD_set_xy( X, Y );
00EC 2A2D mov R18,R10
00EE 062F mov R16,R22
00F0 E4DF xcall _LCD_set_xy
00F2 08C0 xjmp L11
00F4 L10:
00F4 .dbline 100
00F4 .dbline 101
00F4 FA01 movw R30,R20
00F6 2081 ldd R18,z+0
00F8 3327 clr R19
00FA 01E0 ldi R16,1
00FC 10E0 ldi R17,0
00FE 94DF xcall _LCD_write_char
0100 .dbline 102
0100 4F5F subi R20,255 ; offset = 1
0102 5F4F sbci R21,255
0104 .dbline 103
0104 L11:
0104 .dbline 99
0104 ;
0104 ; while (*s)
0104 FA01 movw R30,R20
0106 2080 ldd R2,z+0
0108 2220 tst R2
010A A1F7 brne L10
010C .dbline -2
010C L9:
010C 0E940000 xcall pop_gset3
0110 .dbline 0 ; func end
0110 0895 ret
0112 .dbsym r s 20 pc
0112 .dbsym r Y 10 c
0112 .dbsym r X 22 c
0112 .dbend
.area bss(ram, con, rel)
0000 .dbfile G:\电子资料\avrtest\1602六线接法练习\1602B_LCD.c
0000 _data_temp::
0000 .blkb 2
0002 .dbsym e data_temp _data_temp i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -