📄 test.lst
字号:
(0022) /**********************************************************
(0023) TC16xxB LCD DISPLAY
(0024) 建立时间:2006年08月30日
(0025) 修改日期:2006年08月30日
(0026) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0027) 入命令
(0028) LCD第一行显示寄存器地址:0x80-0x8F
(0029) LCD第二行显示寄存器地址:0xC0-0xCF
(0030) **********************************************************/
(0031) void LCD16xx_init(void)
(0032) {
(0033) LCD_DATA_DDR |= LCD_DATA;
_LCD16xx_init:
010C B384 IN R24,0x14
010D 6F8F ORI R24,0xFF
010E BB84 OUT 0x14,R24
(0034) LCD_EN_DDR |= LCD_EN;
010F 9A8F SBI 0x11,7
(0035) LCD_RS_DDR |= LCD_RS;
0110 9A8E SBI 0x11,6
(0036)
(0037)
(0038) LCD_DATA_PORT = 0xff;
0111 EF8F LDI R24,0xFF
0112 BB85 OUT 0x15,R24
(0039) LCD16xx_en_write();
0113 D011 RCALL _LCD16xx_en_write
(0040) delay_nus(100);
0114 E604 LDI R16,0x64
0115 E010 LDI R17,0
0116 940E00EA CALL _delay_nus
(0041)
(0042) LCD16xx_write_char(0,0x38); //4bit test
0118 E328 LDI R18,0x38
0119 2700 CLR R16
011A D015 RCALL _LCD16xx_write_char
(0043) LCD16xx_write_char(0,0x0c); //显示开
011B E02C LDI R18,0xC
011C 2700 CLR R16
011D D012 RCALL _LCD16xx_write_char
(0044) LCD16xx_write_char(0,0x01); //显示清屏
011E E021 LDI R18,1
011F 2700 CLR R16
0120 D00F RCALL _LCD16xx_write_char
(0045) LCD16xx_write_char(0,0x06); //显示光标移动设置
0121 E026 LDI R18,6
0122 2700 CLR R16
0123 D00C RCALL _LCD16xx_write_char
0124 9508 RET
(0046) }
(0047)
(0048) void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0049) {
(0050) LCD_EN_PORT |= LCD_EN;
_LCD16xx_en_write:
0125 9A97 SBI 0x12,7
(0051) delay_nus(30); //如果晶振频率太高,则可相应提高延时
0126 E10E LDI R16,0x1E
0127 E010 LDI R17,0
0128 940E00EA CALL _delay_nus
(0052) LCD_EN_PORT &= ~LCD_EN; //时间短的话,数据发不权,出现乱码
012A 9897 CBI 0x12,7
012B 9508 RET
(0053) }
(0054)
(0055) /************************************************************************/
(0056) /* LCD16xx清屏 */
(0057) /************************************************************************/
(0058) void LCD16xx_clr(void)
(0059) {
(0060) LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
012C E021 LDI R18,1
012D E001 LDI R16,1
012E D001 RCALL _LCD16xx_write_char
012F 9508 RET
_LCD16xx_write_char:
data --> R20
command --> R22
0130 940E019A CALL push_gset2
0132 2F42 MOV R20,R18
0133 2F60 MOV R22,R16
(0061) }
(0062)
(0063) /*-----------------------------------------------------------------------
(0064) LCD16xx_write_char : 英文字符串显示函数
(0065)
(0066) 输入参数:*s :英文字符串指针;
(0067) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0068) LCD第一行显示寄存器地址:0x80-0x8F
(0069) LCD第一行显示寄存器地址:0xC0-0xCF
(0070) LCD第三行显示寄存器地址:0x90-0x9F
(0071) LCD第四行显示寄存器地址:0xD0-0xDF
(0072) 编写日期 :2006年08月30日
(0073) 最后修改日期 :2006年08月30日
(0074) -----------------------------------------------------------------------*/
(0075) void LCD16xx_write_char(unsigned char command,unsigned char data)
(0076) {
(0077)
(0078) //LCD16xx_wait_Ready();
(0079)
(0080)
(0081) if (command == 0) //data
0134 2366 TST R22
0135 F411 BNE 0x0138
(0082) LCD_RS_PORT |= LCD_RS; //RS=1
0136 9A96 SBI 0x12,6
0137 C001 RJMP 0x0139
(0083) else //command
(0084) LCD_RS_PORT &= ~LCD_RS; //RS=0
0138 9896 CBI 0x12,6
(0085)
(0086)
(0087) LCD_DATA_PORT &= command;
0139 B225 IN R2,0x15
013A 2226 AND R2,R22
013B BA25 OUT 0x15,R2
(0088) LCD_DATA_PORT |= data&0xff; //send low 4bit
013C 2F84 MOV R24,R20
013D 7F8F ANDI R24,0xFF
013E B225 IN R2,0x15
013F 2A28 OR R2,R24
0140 BA25 OUT 0x15,R2
(0089) LCD16xx_en_write();
0141 DFE3 RCALL _LCD16xx_en_write
0142 940E018E CALL pop_gset2
0144 9508 RET
(0090)
(0091) }
(0092)
(0093) void LCD16xx_wait_Ready(void) //等待LCD空闲
(0094) {
(0095) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD16xx_wait_Ready:
0145 98A7 CBI 0x14,7
(0096) LCD_RS_PORT &= ~LCD_RS; //RS=0
0146 9896 CBI 0x12,6
(0097) LCD_EN_PORT |= LCD_EN; //EN=1
0147 9A97 SBI 0x12,7
(0098) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
0148 999F SBIC 0x13,7
0149 C003 RJMP 0x014D
014A E001 LDI R16,1
014B E010 LDI R17,0
014C C002 RJMP 0x014F
014D 2700 CLR R16
014E 2711 CLR R17
014F 3000 CPI R16,0
0150 0701 CPC R16,R17
0151 F3B1 BEQ 0x0148
(0099) LCD_EN_PORT &= ~LCD_EN; //EN=0
0152 9897 CBI 0x12,7
(0100) LCD_DATA_DDR |= LCD_DATA;
0153 B384 IN R24,0x14
0154 6F8F ORI R24,0xFF
0155 BB84 OUT 0x14,R24
0156 9508 RET
_LCD16xx_set_xy:
address --> R20
y --> R10
x --> R22
0157 940E0198 CALL push_gset3
0159 2EA2 MOV R10,R18
015A 2F60 MOV R22,R16
(0101) }
(0102)
(0103) /*-----------------------------------------------------------------------
(0104) LCD_set_xy : 设置LCD显示的起始位置
(0105)
(0106) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0107) LCD第一行显示寄存器地址:0x80-0x8F
(0108) LCD第一行显示寄存器地址:0xC0-0xCF
(0109) 编写日期 :2006年08月30日
(0110) 最后修改日期 :2006年08月30日
(0111) -----------------------------------------------------------------------*/
(0112) void LCD16xx_set_xy( unsigned char x, unsigned char y )
(0113) {
(0114) unsigned char address;
(0115) if (y == 0)
015B 20AA TST R10
015C F419 BNE 0x0160
(0116) address = 0x81 + x;
015D 2F46 MOV R20,R22
015E 574F SUBI R20,0x7F
015F C011 RJMP 0x0171
(0117) else if(y == 1)
0160 2D8A MOV R24,R10
0161 3081 CPI R24,1
0162 F419 BNE 0x0166
(0118) address = 0xc1 + x;
0163 2F46 MOV R20,R22
0164 534F SUBI R20,0x3F
0165 C00B RJMP 0x0171
(0119) else if(y == 2)
0166 2D8A MOV R24,R10
0167 3082 CPI R24,2
0168 F419 BNE 0x016C
(0120) address = 0x91 + x;
0169 2F46 MOV R20,R22
016A 564F SUBI R20,0x6F
016B C005 RJMP 0x0171
(0121) else if(y == 3)
016C 2D8A MOV R24,R10
016D 3083 CPI R24,3
016E F411 BNE 0x0171
(0122) address = 0xd1 + x;
016F 2F46 MOV R20,R22
0170 524F SUBI R20,0x2F
(0123) LCD16xx_write_char( 1,address );
0171 2F24 MOV R18,R20
0172 E001 LDI R16,1
0173 DFBC RCALL _LCD16xx_write_char
0174 940E0191 CALL pop_gset3
0176 9508 RET
_LCD16xx_write_string:
s --> R20
Y --> R10
X --> R22
0177 940E0198 CALL push_gset3
0179 2EA2 MOV R10,R18
017A 2F60 MOV R22,R16
017B 814E LDD R20,Y+6
017C 815F LDD R21,Y+7
(0124) }
(0125) /*-----------------------------------------------------------------------
(0126) LCD16xx_write_string : 英文字符串显示函数
(0127)
(0128) 输入参数:*s :英文字符串指针;
(0129) X、Y : 显示字符串的位置
(0130) 编写日期 :2006年08月30日
(0131) 最后修改日期 :2006年08月30日
(0132) -----------------------------------------------------------------------*/
(0133) void LCD16xx_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0134) {
(0135) LCD16xx_set_xy( X, Y );
017D 2D2A MOV R18,R10
017E 2F06 MOV R16,R22
017F DFD7 RCALL _LCD16xx_set_xy
0180 C006 RJMP 0x0187
(0136) while (*s)
(0137) {
(0138) LCD16xx_write_char( 0, *s );
0181 01FA MOVW R30,R20
0182 8120 LDD R18,Z+0
0183 2700 CLR R16
0184 DFAB RCALL _LCD16xx_write_char
(0139) s++;
FILE: <library>
0185 5F4F SUBI R20,0xFF
0186 4F5F SBCI R21,0xFF
0187 01FA MOVW R30,R20
0188 8020 LDD R2,Z+0
0189 2022 TST R2
018A F7B1 BNE 0x0181
018B 940E0191 CALL pop_gset3
018D 9508 RET
pop_gset2:
018E E0E2 LDI R30,2
018F 940C01A0 JMP pop
pop_gset3:
0191 E0E4 LDI R30,4
0192 940C01A0 JMP pop
push_gset5:
0194 92FA ST R15,-Y
0195 92EA ST R14,-Y
push_gset4:
0196 92DA ST R13,-Y
0197 92CA ST R12,-Y
push_gset3:
0198 92BA ST R11,-Y
0199 92AA ST R10,-Y
push_gset2:
019A 937A ST R23,-Y
019B 936A ST R22,-Y
push_gset1:
019C 935A ST R21,-Y
019D 934A ST R20,-Y
019E 9508 RET
pop_gset1:
019F E0E1 LDI R30,1
pop:
01A0 9149 LD R20,Y+
01A1 9159 LD R21,Y+
01A2 FDE0 SBRC R30,0
01A3 9508 RET
01A4 9169 LD R22,Y+
01A5 9179 LD R23,Y+
01A6 FDE1 SBRC R30,1
01A7 9508 RET
01A8 90A9 LD R10,Y+
01A9 90B9 LD R11,Y+
01AA FDE2 SBRC R30,2
01AB 9508 RET
01AC 90C9 LD R12,Y+
01AD 90D9 LD R13,Y+
01AE FDE3 SBRC R30,3
01AF 9508 RET
01B0 90E9 LD R14,Y+
01B1 90F9 LD R15,Y+
01B2 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -