📄 test.lst
字号:
(0076) unsigned char data_temp;
(0077)
(0078) data_temp = data;
010B 2D4A MOV R20,R10
(0079)
(0080) //LCD16xx_wait_Ready();
(0081)
(0082)
(0083) if (command == 0) //data
010C 2366 TST R22
010D F411 BNE 0x0110
(0084) LCD_RS_PORT |= LCD_RS; //RS=1
010E 9A96 SBI 0x12,6
010F C001 RJMP 0x0111
(0085) else //command
(0086) LCD_RS_PORT &= ~LCD_RS; //RS=0
0110 9896 CBI 0x12,6
(0087)
(0088) LCD_DATA_PORT &= 0x00;
0111 2422 CLR R2
0112 BA25 OUT 0x15,R2
(0089) LCD_DATA_PORT |= data_temp&0xff; //send high 4bit
0113 2F84 MOV R24,R20
0114 7F8F ANDI R24,0xFF
0115 B225 IN R2,0x15
0116 2A28 OR R2,R24
0117 BA25 OUT 0x15,R2
(0090) LCD16xx_en_write();
0118 DFE3 RCALL _LCD16xx_en_write
(0091)
(0092) LCD_DATA_PORT &= 0x00;
0119 2422 CLR R2
011A BA25 OUT 0x15,R2
(0093) LCD_DATA_PORT |= data_temp&0xff; //send low 4bit
011B 2F84 MOV R24,R20
011C 7F8F ANDI R24,0xFF
011D B225 IN R2,0x15
011E 2A28 OR R2,R24
011F BA25 OUT 0x15,R2
(0094) LCD16xx_en_write();
0120 DFDB RCALL _LCD16xx_en_write
0121 940E0192 CALL pop_gset3
0123 9508 RET
(0095)
(0096) }
(0097)
(0098) void LCD16xx_wait_Ready(void) //等待LCD空闲
(0099) {
(0100) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD16xx_wait_Ready:
0124 98A7 CBI 0x14,7
(0101) LCD_RS_PORT &= ~LCD_RS; //RS=0
0125 9896 CBI 0x12,6
(0102) LCD_EN_PORT |= LCD_EN; //EN=1
0126 9A97 SBI 0x12,7
(0103) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
0127 999F SBIC 0x13,7
0128 C003 RJMP 0x012C
0129 E001 LDI R16,1
012A E010 LDI R17,0
012B C002 RJMP 0x012E
012C 2700 CLR R16
012D 2711 CLR R17
012E 3000 CPI R16,0
012F 0701 CPC R16,R17
0130 F3B1 BEQ 0x0127
(0104) LCD_EN_PORT &= ~LCD_EN; //EN=0
0131 9897 CBI 0x12,7
(0105) LCD_DATA_DDR |= LCD_DATA;
0132 B384 IN R24,0x14
0133 6F8F ORI R24,0xFF
0134 BB84 OUT 0x14,R24
0135 9508 RET
_LCD16xx_set_xy:
address --> R20
y --> R10
x --> R22
0136 940E0199 CALL push_gset3
0138 2EA2 MOV R10,R18
0139 2F60 MOV R22,R16
(0106) }
(0107)
(0108) /*-----------------------------------------------------------------------
(0109) LCD_set_xy : 设置LCD显示的起始位置
(0110)
(0111) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0112) LCD第一行显示寄存器地址:0x80-0x8F
(0113) LCD第一行显示寄存器地址:0xC0-0xCF
(0114) 编写日期 :2006年08月30日
(0115) 最后修改日期 :2006年08月30日
(0116) -----------------------------------------------------------------------*/
(0117) void LCD16xx_set_xy( unsigned char x, unsigned char y )
(0118) {
(0119) unsigned char address;
(0120) if (y == 0)
013A 20AA TST R10
013B F419 BNE 0x013F
(0121) address = 0x80 + x;
013C 2F46 MOV R20,R22
013D 5840 SUBI R20,0x80
013E C011 RJMP 0x0150
(0122) else if(y == 1)
013F 2D8A MOV R24,R10
0140 3081 CPI R24,1
0141 F419 BNE 0x0145
(0123) address = 0xc0 + x;
0142 2F46 MOV R20,R22
0143 5440 SUBI R20,0x40
0144 C00B RJMP 0x0150
(0124) else if(y == 2)
0145 2D8A MOV R24,R10
0146 3082 CPI R24,2
0147 F419 BNE 0x014B
(0125) address = 0x90 + x;
0148 2F46 MOV R20,R22
0149 5740 SUBI R20,0x70
014A C005 RJMP 0x0150
(0126) else if(y == 3)
014B 2D8A MOV R24,R10
014C 3083 CPI R24,3
014D F411 BNE 0x0150
(0127) address = 0xd0 + x;
014E 2F46 MOV R20,R22
014F 5340 SUBI R20,0x30
(0128) LCD16xx_write_char( 1,address );
0150 2F24 MOV R18,R20
0151 E001 LDI R16,1
0152 DFB4 RCALL _LCD16xx_write_char
0153 940E0192 CALL pop_gset3
0155 9508 RET
_LCD16xx_write_string:
s --> R20
Y --> R10
X --> R22
0156 940E0199 CALL push_gset3
0158 2EA2 MOV R10,R18
0159 2F60 MOV R22,R16
015A 814E LDD R20,Y+6
015B 815F LDD R21,Y+7
(0129) }
(0130) /*-----------------------------------------------------------------------
(0131) LCD16xx_write_string : 英文字符串显示函数
(0132)
(0133) 输入参数:*s :英文字符串指针;
(0134) X、Y : 显示字符串的位置
(0135) 编写日期 :2006年08月30日
(0136) 最后修改日期 :2006年08月30日
(0137) -----------------------------------------------------------------------*/
(0138) void LCD16xx_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0139) {
(0140) LCD16xx_set_xy( X, Y );
015C 2D2A MOV R18,R10
015D 2F06 MOV R16,R22
015E DFD7 RCALL _LCD16xx_set_xy
015F C006 RJMP 0x0166
(0141) while (*s)
(0142) {
(0143) LCD16xx_write_char( 0, *s );
0160 01FA MOVW R30,R20
0161 8120 LDD R18,Z+0
0162 2700 CLR R16
0163 DFA3 RCALL _LCD16xx_write_char
(0144) s++;
0164 5F4F SUBI R20,0xFF
0165 4F5F SBCI R21,0xFF
0166 01FA MOVW R30,R20
0167 8020 LDD R2,Z+0
0168 2022 TST R2
0169 F7B1 BNE 0x0160
016A 940E0192 CALL pop_gset3
016C 9508 RET
FILE: G:\avr16\avr16-1020-2\delay.c
(0001) /*--------------------------------------------------*/
(0002) /* AVR-ARM开发网论坛 */
(0003) /* http://www.avrarm.com */
(0004) /* AVR生成代码测试程序 */
(0005) /*--------------------------------------------------*/
(0006) /* 程序由AVR辅助开发工具V2.0.1自动生成 */
(0007) /* AVR系统的处理器为: ATMega16 */
(0008) /* AVR系统的晶振频率: 8.0000 Mhz */
(0009) /*--------------------------------------------------*/
(0010)
(0011) #include <iom16v.h>
(0012) #include "delay.h"
(0013)
(0014) /*-----------------------------------------------------------------------
(0015) delay_us :1us延时函数
(0016) -----------------------------------------------------------------------*/
(0017) void delay_us(void)
(0018) {
(0019) unsigned char t=2;
_delay_us:
t --> R16
016D E002 LDI R16,2
(0020) t--;
016E 950A DEC R16
016F 9508 RET
_delay_nus:
t --> R20
0170 940E019D CALL push_gset1
0172 01A8 MOVW R20,R16
(0021) }
(0022)
(0023) /*-----------------------------------------------------------------------
(0024) delay_nus :长延时函数
(0025)
(0026) 输入参数: t :延时时间 us
(0027) -----------------------------------------------------------------------*/
(0028) void delay_nus(unsigned int t)
(0029) {
0173 C001 RJMP 0x0175
(0030) while (t--)
(0031) delay_us();
0174 DFF8 RCALL _delay_us
0175 011A MOVW R2,R20
0176 5041 SUBI R20,1
0177 4050 SBCI R21,0
0178 2022 TST R2
0179 F7D1 BNE 0x0174
017A 2033 TST R3
017B F7C1 BNE 0x0174
017C 940E01A0 CALL pop_gset1
017E 9508 RET
(0032) }
(0033)
(0034) /*-----------------------------------------------------------------------
(0035) delay_ms :1ms延时函数
(0036) -----------------------------------------------------------------------*/
(0037) void delay_ms(void)
(0038) {
(0039) delay_nus(1000);
_delay_ms:
017F EE08 LDI R16,0xE8
0180 E013 LDI R17,3
0181 DFEE RCALL _delay_nus
0182 9508 RET
_delay_nms:
t --> R20
0183 940E019D CALL push_gset1
0185 01A8 MOVW R20,R16
(0040) }
(0041)
(0042) /*-----------------------------------------------------------------------
(0043) delay_nms :长延时函数
(0044)
(0045) 输入参数: t :延时时间 ms
(0046) -----------------------------------------------------------------------*/
(0047) void delay_nms(unsigned int t)
(0048) {
0186 C001 RJMP 0x0188
(0049) while (t--)
(0050) delay_ms();
FILE: <library>
0187 DFF7 RCALL _delay_ms
0188 011A MOVW R2,R20
0189 5041 SUBI R20,1
018A 4050 SBCI R21,0
018B 2022 TST R2
018C F7D1 BNE 0x0187
018D 2033 TST R3
018E F7C1 BNE 0x0187
018F 940E01A0 CALL pop_gset1
0191 9508 RET
pop_gset3:
0192 E0E4 LDI R30,4
0193 940C01A1 JMP pop
push_gset5:
0195 92FA ST R15,-Y
0196 92EA ST R14,-Y
push_gset4:
0197 92DA ST R13,-Y
0198 92CA ST R12,-Y
push_gset3:
0199 92BA ST R11,-Y
019A 92AA ST R10,-Y
push_gset2:
019B 937A ST R23,-Y
019C 936A ST R22,-Y
push_gset1:
019D 935A ST R21,-Y
019E 934A ST R20,-Y
019F 9508 RET
pop_gset1:
01A0 E0E1 LDI R30,1
pop:
01A1 9149 LD R20,Y+
01A2 9159 LD R21,Y+
01A3 FDE0 SBRC R30,0
01A4 9508 RET
01A5 9169 LD R22,Y+
01A6 9179 LD R23,Y+
01A7 FDE1 SBRC R30,1
01A8 9508 RET
01A9 90A9 LD R10,Y+
01AA 90B9 LD R11,Y+
01AB FDE2 SBRC R30,2
01AC 9508 RET
01AD 90C9 LD R12,Y+
01AE 90D9 LD R13,Y+
01AF FDE3 SBRC R30,3
01B0 9508 RET
01B1 90E9 LD R14,Y+
01B2 90F9 LD R15,Y+
01B3 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -