📄 test.lst
字号:
__text_start:
__start:
3B E5CF LDI R28,0x5F
3C E0D4 LDI R29,4
3D BFCD OUT 0x3D,R28
3E BFDE OUT 0x3E,R29
3F 51C0 SUBI R28,0x10
40 40D0 SBCI R29,0
41 EA0A LDI R16,0xAA
42 8308 STD Y+0,R16
43 2400 CLR R0
44 E8E2 LDI R30,0x82
45 E0F0 LDI R31,0
46 E010 LDI R17,0
47 3CE6 CPI R30,0xC6
48 07F1 CPC R31,R17
49 F011 BEQ 0x004C
4A 9201 ST R0,Z+
4B CFFB RJMP 0x0047
4C 8300 STD Z+0,R16
4D E5E4 LDI R30,0x54
4E E0F0 LDI R31,0
4F E6A0 LDI R26,0x60
50 E0B0 LDI R27,0
51 E010 LDI R17,0
52 E000 LDI R16,0
53 BF0B OUT 0x3B,R16
54 37E6 CPI R30,0x76
55 07F1 CPC R31,R17
56 F021 BEQ 0x005B
57 95C8 LPM
58 9631 ADIW R30,1
59 920D ST R0,X+
5A CFF9 RJMP 0x0054
5B 940E 0296 CALL _main
_exit:
5D CFFF RJMP _exit
FILE: D:\iccavr\mega16\11\max144\delay.h
(0001) /**********延时函数*****************/
(0002) /*-----------------------------------------------
(0003) delay_us :1us延时函数
(0004) ------------------------------------------------*/
(0005) void delay_us(void)
(0006) {
(0007) asm("nop");
_delay_us:
5E 0000 NOP
5F 9508 RET
_delay_nus:
t --> R20
60 934A ST R20,-Y
61 935A ST R21,-Y
62 01A8 MOVW R20,R16
(0008) }
(0009) /*-----------------------------------------------
(0010) delay_nus :长延时函数
(0011) 输入参数: t :延时时间 us
(0012) ------------------------------------------------*/
(0013) void delay_nus(unsigned int t)
(0014) {
63 C001 RJMP 0x0065
(0015) while(t--)
(0016) delay_us();
64 DFF9 RCALL _delay_us
65 011A MOVW R2,R20
66 5041 SUBI R20,1
67 4050 SBCI R21,0
68 2022 TST R2
69 F7D1 BNE 0x0064
6A 2033 TST R3
6B F7C1 BNE 0x0064
6C 9159 LD R21,Y+
6D 9149 LD R20,Y+
6E 9508 RET
(0017) }
(0018) /*----------------------------------------------
(0019) delay_ms :1ms延时函数
(0020) -----------------------------------------------*/
(0021) void delay_ms(void)
(0022) {
(0023) unsigned int i;
(0024) for(i=0;i<1140;i++);
_delay_ms:
i --> R16
6F 2700 CLR R16
70 2711 CLR R17
71 C002 RJMP 0x0074
72 5F0F SUBI R16,0xFF
73 4F1F SBCI R17,0xFF
74 3704 CPI R16,0x74
75 E0E4 LDI R30,4
76 071E CPC R17,R30
77 F3D0 BCS 0x0072
78 9508 RET
_delay_nms:
t --> R20
79 934A ST R20,-Y
7A 935A ST R21,-Y
7B 01A8 MOVW R20,R16
(0025) }
(0026) /*----------------------------------------------
(0027) delay_nms :长延时函数
(0028) 输入参数: t :延时时间 ms
(0029) -----------------------------------------------*/
(0030) void delay_nms(unsigned int t)
(0031) {
7C C001 RJMP 0x007E
(0032) while(t--)
(0033) delay_ms();
7D DFF1 RCALL _delay_ms
7E 011A MOVW R2,R20
7F 5041 SUBI R20,1
80 4050 SBCI R21,0
81 2022 TST R2
82 F7D1 BNE 0x007D
83 2033 TST R3
84 F7C1 BNE 0x007D
85 9159 LD R21,Y+
86 9149 LD R20,Y+
87 9508 RET
FILE: D:\iccavr\mega16\11\max144\lcd1602.h
(0001) /*-------------------------------------------
(0002) RS----------PC2
(0003) RW----------GND
(0004) EN----------PC3
(0005) D4-D7-------PC4-PC7
(0006) ---------------------------------------------*/
(0007) //定义MCU与LCD的接口
(0008) #define LCD_EN_PORT PORTC
(0009) #define LCD_EN_DDR DDRC
(0010) #define LCD_RS_PORT PORTC
(0011) #define LCD_RS_DDR DDRC
(0012) #define LCD_DATA_PORT PORTC
(0013) #define LCD_DATA_DDR DDRC
(0014) #define LCD_DATA_PIN PINC
(0015) #define LCD_EN 0x08 //portc3 out
(0016) #define LCD_RS 0x04 //portc2 out
(0017) #define LCD_DATA 0xf0 //portc4/5/6/7 out
(0018)
(0019) /*----------------------------------------------------------
(0020) Public function prototypes
(0021) ----------------------------------------------------------*/
(0022) void LCD_init (void);
(0023) void LCD_en_write (void);
(0024) void clear(void);
(0025) void LCD_write_char(unsigned command,unsigned data);
(0026) void LCD_set_xy(unsigned char x, unsigned char y);
(0027)
(0028) /*------------------------------------------------------------
(0029) 函数: lcd1602口线初始化和液晶初始化
(0030) -------------------------------------------------------------*/
(0031) void LCD_init(void) //液晶初始化
(0032) {
(0033) LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
88 B384 IN R24,0x14
89 6F80 ORI R24,0xF0
8A BB84 OUT 0x14,R24
(0034) LCD_EN_DDR|=LCD_EN;
8B 9AA3 SBI 0x14,3
(0035) LCD_RS_DDR|=LCD_RS;
8C 9AA2 SBI 0x14,2
(0036) delay_nms(15);
8D E00F LDI R16,0xF
8E E010 LDI R17,0
8F DFE9 RCALL _delay_nms
(0037) LCD_write_char(0x28,0); //4位显示
90 2722 CLR R18
91 2733 CLR R19
92 E208 LDI R16,0x28
93 E010 LDI R17,0
94 D02A RCALL _LCD_write_char
(0038) delay_nms(15);
95 E00F LDI R16,0xF
96 E010 LDI R17,0
97 DFE1 RCALL _delay_nms
(0039) LCD_write_char(0x0c,0); //显示开
98 2722 CLR R18
99 2733 CLR R19
9A E00C LDI R16,0xC
9B E010 LDI R17,0
9C D022 RCALL _LCD_write_char
(0040) delay_nms(15);
9D E00F LDI R16,0xF
9E E010 LDI R17,0
9F DFD9 RCALL _delay_nms
(0041) LCD_write_char(0x01,0); //清屏
A0 2722 CLR R18
A1 2733 CLR R19
A2 E001 LDI R16,1
A3 E010 LDI R17,0
A4 D01A RCALL _LCD_write_char
(0042) clear();
A5 D06A RCALL _clear
A6 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
A7 940E 0375 CALL push_xgsetF00C
A9 2EA2 MOV R10,R18
AA 2F60 MOV R22,R16
(0043) }
(0044)
(0045) /*------------------------------------------------------------
(0046) 函数: 设置显示地址
(0047) para: x---the display address of a line limit: 0---15
(0048) y---the display line limit 0 or 1
(0049) --------------------------------------------------------------*/
(0050) void LCD_set_xy(unsigned char x, unsigned char y) //写地址函数
(0051) {
(0052) unsigned char address;
(0053) if(y ==0)
AB 20AA TST R10
AC F419 BNE 0x00B0
(0054) address=0x80+x; //the first line
AD 2F46 MOV R20,R22
AE 5840 SUBI R20,0x80
AF C002 RJMP 0x00B2
(0055) else
(0056) address=0xc0+x; //the second line
B0 2F46 MOV R20,R22
B1 5440 SUBI R20,0x40
(0057) LCD_write_char(address,0);
B2 2722 CLR R18
B3 2733 CLR R19
B4 2F04 MOV R16,R20
B5 2711 CLR R17
B6 D008 RCALL _LCD_write_char
B7 940C 037C JMP pop_xgsetF00C
(0058) }
(0059) /*-------------------------------------------------------------
(0060) 函数: lcd1602使能
(0061) *--------------------------------------------------------------*/
(0062) void LCD_en_write(void) //液晶使能
(0063) {
(0064) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
B9 9AAB SBI 0x15,3
(0065) delay_nus(5);
BA E005 LDI R16,5
BB E010 LDI R17,0
BC DFA3 RCALL _delay_nus
(0066) LCD_EN_PORT&=~LCD_EN;
BD 98AB CBI 0x15,3
BE 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
BF 940E 0391 CALL push_xgsetF03C
C1 0169 MOVW R12,R18
C2 0158 MOVW R10,R16
(0067) }
(0068) /*------------------------------------------------------------
(0069) 函数: 写命令或数据到lcd1602
(0070) 参数:command: 0---写数据, 1---写命令
(0071) data: 所要写的命令或数据
(0072) *-------------------------------------------------------------*/
(0073) void LCD_write_char(unsigned command,unsigned data)
(0074) {
(0075) unsigned command_temp,data_temp;
(0076) command_temp=command;
C3 01A5 MOVW R20,R10
(0077) data_temp=data;
C4 01B6 MOVW R22,R12
(0078) delay_nus(25);
C5 E109 LDI R16,0x19
C6 E010 LDI R17,0
C7 DF98 RCALL _delay_nus
(0079) if(command==0)
C8 3040 CPI R20,0
C9 0745 CPC R20,R21
CA F511 BNE 0x00ED
(0080) {
(0081) LCD_RS_PORT|=LCD_RS; //RS=1
CB 9AAA SBI 0x15,2
(0082) LCD_DATA_PORT&=0X0f;
CC B385 IN R24,0x15
CD 708F ANDI R24,0xF
CE BB85 OUT 0x15,R24
(0083) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
CF 01CB MOVW R24,R22
D0 7F80 ANDI R24,0xF0
D1 7090 ANDI R25,0
D2 B225 IN R2,0x15
D3 2433 CLR R3
D4 2A28 OR R2,R24
D5 2A39 OR R3,R25
D6 BA25 OUT 0x15,R2
(0084) LCD_en_write();
D7 DFE1 RCALL _LCD_en_write
(0085) data_temp=data_temp<<4;
D8 0F66 LSL R22
D9 1F77 ROL R23
DA 0F66 LSL R22
DB 1F77 ROL R23
DC 0F66 LSL R22
DD 1F77 ROL R23
DE 0F66 LSL R22
DF 1F77 ROL R23
(0086) LCD_DATA_PORT&=0X0f;
E0 B385 IN R24,0x15
E1 708F ANDI R24,0xF
E2 BB85 OUT 0x15,R24
(0087) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
E3 01CB MOVW R24,R22
E4 7F80 ANDI R24,0xF0
E5 7090 ANDI R25,0
E6 B225 IN R2,0x15
E7 2433 CLR R3
E8 2A28 OR R2,R24
E9 2A39 OR R3,R25
EA BA25 OUT 0x15,R2
(0088) LCD_en_write();
EB DFCD RCALL _LCD_en_write
(0089) }
EC C021 RJMP 0x010E
(0090) else
(0091) {
(0092) LCD_RS_PORT&=~LCD_RS; //RS=0
ED 98AA CBI 0x15,2
(0093) LCD_DATA_PORT&=0X0f;
EE B385 IN R24,0x15
EF 708F ANDI R24,0xF
F0 BB85 OUT 0x15,R24
(0094) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
F1 01CA MOVW R24,R20
F2 7F80 ANDI R24,0xF0
F3 7090 ANDI R25,0
F4 B225 IN R2,0x15
F5 2433 CLR R3
F6 2A28 OR R2,R24
F7 2A39 OR R3,R25
F8 BA25 OUT 0x15,R2
(0095) LCD_en_write();
F9 DFBF RCALL _LCD_en_write
(0096) command_temp=command_temp<<4;
FA 0F44 LSL R20
FB 1F55 ROL R21
FC 0F44 LSL R20
FD 1F55 ROL R21
FE 0F44 LSL R20
FF 1F55 ROL R21
100 0F44 LSL R20
101 1F55 ROL R21
(0097) LCD_DATA_PORT&=0x0f;
102 B385 IN R24,0x15
103 708F ANDI R24,0xF
104 BB85 OUT 0x15,R24
(0098) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
105 01CA MOVW R24,R20
106 7F80 ANDI R24,0xF0
107 7090 ANDI R25,0
108 B225 IN R2,0x15
109 2433 CLR R3
10A 2A28 OR R2,R24
10B 2A39 OR R3,R25
10C BA25 OUT 0x15,R2
(0099) LCD_en_write();
10D DFAB RCALL _LCD_en_write
(0100) }
10E 940C 039A JMP pop_xgsetF03C
_clear:
i --> R20
110 934A ST R20,-Y
(0101) }
(0102) /*-------------------------------------------------------------
(0103) 函数: 清屏lcd1602
(0104) ---------------------------------------------------------------*/
(0105) void clear(void)
(0106) {
(0107) unsigned char i;
(0108) LCD_set_xy(0,0);
111 2722 CLR R18
112 2700 CLR R16
113 DF93 RCALL _LCD_set_xy
(0109) for(i=0;i<16;i++)
114 2744 CLR R20
115 C006 RJMP 0x011C
(0110) LCD_write_char(0,' ');
116 E220 LDI R18,0x20
117 E030 LDI R19,0
118 2700 CLR R16
119 2711 CLR R17
11A DFA4 RCALL _LCD_write_char
11B 9543 INC R20
11C 3140 CPI R20,0x10
11D F3C0 BCS 0x0116
(0111) LCD_set_xy(0,1);
11E E021 LDI R18,1
11F 2700 CLR R16
120 DF86 RCALL _LCD_set_xy
(0112) for(i=0;i<16;i++)
121 2744 CLR R20
122 C006 RJMP 0x0129
(0113) LCD_write_char(0,' ');
123 E220 LDI R18,0x20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -