📄 1602b_lcd_prj.lst
字号:
__start:
__text_start:
002F E5CF LDI R28,0x5F
0030 E0D4 LDI R29,4
0031 BFCD OUT 0x3D,R28
0032 BFDE OUT 0x3E,R29
0033 51C0 SUBI R28,0x10
0034 40D0 SBCI R29,0
0035 EA0A LDI R16,0xAA
0036 8308 STD Y+0,R16
0037 2400 CLR R0
0038 E9E7 LDI R30,0x97
0039 E0F0 LDI R31,0
003A E010 LDI R17,0
003B 39E7 CPI R30,0x97
003C 07F1 CPC R31,R17
003D F011 BEQ 0x0040
003E 9201 ST R0,Z+
003F CFFB RJMP 0x003B
0040 8300 STD Z+0,R16
0041 E2E6 LDI R30,0x26
0042 E0F0 LDI R31,0
0043 E6A0 LDI R26,0x60
0044 E0B0 LDI R27,0
0045 E010 LDI R17,0
0046 35ED CPI R30,0x5D
0047 07F1 CPC R31,R17
0048 F021 BEQ 0x004D
0049 95C8 LPM
004A 9631 ADIW R30,1
004B 920D ST R0,X+
004C CFF9 RJMP 0x0046
004D D0AE RCALL _main
_exit:
004E CFFF RJMP _exit
FILE: D:\test6\1602B_LCD.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004)
(0005) /**********************************************************
(0006) 光标命令
(0007) LCD_write_char(0x0e,0); //光标开
(0008) LCD_write_char(0x0d,0); //光标所在字符闪烁
(0009) LCD_write_char(0x0c,0); //光标关
(0010) **********************************************************/
(0011) /**********************************************************
(0012) TC1602B LCD DISPLAY
(0013) 建立时间:2003年11月9号
(0014) 修改日期:2003年11月14号
(0015) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0016) 入命令
(0017) LCD第一行显示寄存器地址:0X80-0X8F
(0018) LCD第二行显示寄存器地址:0XC0-0XCF
(0019) **********************************************************/
(0020) void LCD_init(void)
(0021) {
(0022) delay_nms(15);
_LCD_init:
004F E00F LDI R16,0xF
0050 E010 LDI R17,0
0051 D0FD RCALL _delay_nms
(0023)
(0024) LCD_write_char(0x28,0); //4bit test
0052 2722 CLR R18
0053 2733 CLR R19
0054 E208 LDI R16,0x28
0055 E010 LDI R17,0
0056 D016 RCALL _LCD_write_char
(0025) LCD_write_char(0x0c,0); //显示开
0057 2722 CLR R18
0058 2733 CLR R19
0059 E00C LDI R16,0xC
005A E010 LDI R17,0
005B D011 RCALL _LCD_write_char
(0026) LCD_write_char(0x01,0); //显示清屏
005C 2722 CLR R18
005D 2733 CLR R19
005E E001 LDI R16,1
005F E010 LDI R17,0
0060 D00C RCALL _LCD_write_char
(0027) LCD_write_char(0x06,0); //显示光标移动设置
0061 2722 CLR R18
0062 2733 CLR R19
0063 E006 LDI R16,6
0064 E010 LDI R17,0
0065 D007 RCALL _LCD_write_char
0066 9508 RET
(0028) }
(0029)
(0030) void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0031) {
(0032) LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
0067 9AAD SBI 0x15,5
(0033) delay_nus(1);
0068 E001 LDI R16,1
0069 E010 LDI R17,0
006A D0CD RCALL _delay_nus
(0034) LCD_EN_PORT &= ~LCD_EN;
006B 98AD CBI 0x15,5
006C 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
006D D0F6 RCALL push_gset4
006E 0169 MOVW R12,R18
006F 0158 MOVW R10,R16
(0035) }
(0036)
(0037) /*-----------------------------------------------------------------------
(0038) LCD_write_char : 英文字符串显示函数
(0039)
(0040) 输入参数:*s :英文字符串指针;
(0041) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0042) LCD第一行显示寄存器地址:0X80-0X8F
(0043) LCD第一行显示寄存器地址:0XC0-0XCF
(0044)
(0045) 编写日期 :2003-11-19
(0046) 最后修改日期 :2004-8-19
(0047) -----------------------------------------------------------------------*/
(0048) void LCD_write_char(unsigned command,unsigned data)
(0049) {
(0050) unsigned command_temp,data_temp;
(0051)
(0052) command_temp = command;
0070 01A5 MOVW R20,R10
(0053) data_temp = data;
0071 01B6 MOVW R22,R12
(0054)
(0055) LCD_wait_Ready();
0072 D04E RCALL _LCD_wait_Ready
(0056)
(0057) LCD_RW_PORT &= ~LCD_RW; //RW=0
0073 9893 CBI 0x12,3
(0058)
(0059) if (command == 0)
0074 3040 CPI R20,0
0075 0745 CPC R20,R21
0076 F469 BNE 0x0084
(0060) {
(0061) LCD_RS_PORT |= LCD_RS; //RS=1
0077 9AAC SBI 0x15,4
(0062) LCD_DATA_PORT &= 0X0F;
0078 B382 IN R24,0x12
0079 708F ANDI R24,0xF
007A BB82 OUT 0x12,R24
(0063) LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
007B 01CB MOVW R24,R22
007C 7F80 ANDI R24,0xF0
007D 7090 ANDI R25,0
007E B222 IN R2,0x12
007F 2433 CLR R3
0080 2A28 OR R2,R24
0081 2A39 OR R3,R25
0082 BA22 OUT 0x12,R2
(0064) }
0083 C00C RJMP 0x0090
(0065) else
(0066) {
(0067) LCD_RS_PORT &= ~LCD_RS; //RS=0
0084 98AC CBI 0x15,4
(0068) LCD_DATA_PORT &= 0X0F;
0085 B382 IN R24,0x12
0086 708F ANDI R24,0xF
0087 BB82 OUT 0x12,R24
(0069) LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
0088 01CA MOVW R24,R20
0089 7F80 ANDI R24,0xF0
008A 7090 ANDI R25,0
008B B222 IN R2,0x12
008C 2433 CLR R3
008D 2A28 OR R2,R24
008E 2A39 OR R3,R25
008F BA22 OUT 0x12,R2
(0070) }
(0071) LCD_en_write();
0090 DFD6 RCALL _LCD_en_write
(0072)
(0073) command_temp=command_temp << 4; //send low 4bit
0091 0F44 LSL R20
0092 1F55 ROL R21
0093 0F44 LSL R20
0094 1F55 ROL R21
0095 0F44 LSL R20
0096 1F55 ROL R21
0097 0F44 LSL R20
0098 1F55 ROL R21
(0074) data_temp=data_temp << 4;
0099 0F66 LSL R22
009A 1F77 ROL R23
009B 0F66 LSL R22
009C 1F77 ROL R23
009D 0F66 LSL R22
009E 1F77 ROL R23
009F 0F66 LSL R22
00A0 1F77 ROL R23
(0075)
(0076) LCD_DATA_PORT &= 0X0F;
00A1 B382 IN R24,0x12
00A2 708F ANDI R24,0xF
00A3 BB82 OUT 0x12,R24
(0077) if (command==0)
00A4 20AA TST R10
00A5 F459 BNE 0x00B1
00A6 20BB TST R11
00A7 F449 BNE 0x00B1
(0078) LCD_DATA_PORT |= data_temp&0xf0;
00A8 01CB MOVW R24,R22
00A9 7F80 ANDI R24,0xF0
00AA 7090 ANDI R25,0
00AB B222 IN R2,0x12
00AC 2433 CLR R3
00AD 2A28 OR R2,R24
00AE 2A39 OR R3,R25
00AF BA22 OUT 0x12,R2
00B0 C008 RJMP 0x00B9
(0079) else
(0080) LCD_DATA_PORT |= command_temp&0xf0;
00B1 01CA MOVW R24,R20
00B2 7F80 ANDI R24,0xF0
00B3 7090 ANDI R25,0
00B4 B222 IN R2,0x12
00B5 2433 CLR R3
00B6 2A28 OR R2,R24
00B7 2A39 OR R3,R25
00B8 BA22 OUT 0x12,R2
(0081) LCD_en_write();
00B9 DFAD RCALL _LCD_en_write
(0082)
(0083) LCD_RW_PORT |= LCD_RW;
00BA 9A93 SBI 0x12,3
(0084)
(0085) LCD_RS_PORT ^= LCD_RS;
00BB E180 LDI R24,0x10
00BC B225 IN R2,0x15
00BD 2628 EOR R2,R24
00BE BA25 OUT 0x15,R2
00BF D0A0 RCALL pop_gset4
00C0 9508 RET
(0086) }
(0087)
(0088) void LCD_wait_Ready(void) //等待LCD空闲
(0089) {
(0090) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
00C1 988F CBI 0x11,7
(0091)
(0092) LCD_RW_PORT |= LCD_RW; //RW=1
00C2 9A93 SBI 0x12,3
(0093)
(0094) LCD_RS_PORT &= ~LCD_RS; //RS=0
00C3 98AC CBI 0x15,4
(0095)
(0096) LCD_EN_PORT |= LCD_EN; //EN=1
00C4 9AAD SBI 0x15,5
(0097)
(0098) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
00C5 9987 SBIC 0x10,7
00C6 C003 RJMP 0x00CA
00C7 E001 LDI R16,1
00C8 E010 LDI R17,0
00C9 C002 RJMP 0x00CC
00CA 2700 CLR R16
00CB 2711 CLR R17
00CC 3000 CPI R16,0
00CD 0701 CPC R16,R17
00CE F3B1 BEQ 0x00C5
(0099)
(0100) LCD_EN_PORT &= ~LCD_EN; //EN=0
00CF 98AD CBI 0x15,5
(0101)
(0102) LCD_DATA_DDR |= 0xf0;
00D0 B381 IN R24,0x11
00D1 6F80 ORI R24,0xF0
00D2 BB81 OUT 0x11,R24
00D3 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00D4 D093 RCALL push_gset2
00D5 2F42 MOV R20,R18
00D6 2F60 MOV R22,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -