📄 1820.lst
字号:
__start:
__text_start:
32 E5CF LDI R28,0x5F
33 E0D4 LDI R29,4
34 BFCD OUT 0x3D,R28
35 BFDE OUT 0x3E,R29
36 51CE SUBI R28,0x1E
37 40D0 SBCI R29,0
38 EA0A LDI R16,0xAA
39 8308 STD Y+0,R16
3A 2400 CLR R0
3B E6EB LDI R30,0x6B
3C E0F0 LDI R31,0
3D E010 LDI R17,0
3E 37E1 CPI R30,0x71
3F 07F1 CPC R31,R17
40 F011 BEQ 0x0043
41 9201 ST R0,Z+
42 CFFB RJMP 0x003E
43 8300 STD Z+0,R16
44 E5E8 LDI R30,0x58
45 E0F0 LDI R31,0
46 E6A0 LDI R26,0x60
47 E0B0 LDI R27,0
48 E010 LDI R17,0
49 E000 LDI R16,0
4A BF0B OUT 0x3B,R16
4B 36E3 CPI R30,0x63
4C 07F1 CPC R31,R17
4D F021 BEQ 0x0052
4E 95C8 LPM
4F 9631 ADIW R30,1
50 920D ST R0,X+
51 CFF9 RJMP 0x004B
52 940E 0242 CALL _main
_exit:
54 CFFF RJMP _exit
FILE: D:\DS18B20\lcd.h
(0001) /****************************端口宏定义**************************************/
(0002) //LCD1602端口连接按照下面方式连接,RW接地.
(0003) #define LCD_EN_PORT PORTA
(0004) #define LCD_EN_DDR DDRA
(0005) #define LCD_EN (1<<PA3)
(0006)
(0007) #define LCD_RS_PORT PORTA
(0008) #define LCD_RS_DDR DDRA
(0009) #define LCD_RS (1<<PA1)
(0010)
(0011) #define LCD_RW_PORT PORTA
(0012) #define LCD_RW_DDR DDRA
(0013) #define LCD_RW (1<<PA2)
(0014)
(0015) #define LCD_DATA_PORT PORTA
(0016) #define LCD_DATA_DDR DDRA
(0017) #define LCD_DATA_PIN PINA
(0018) #define LCD_DATA ((1<<4)|(1<<5)|(1<<6)|(1<<7))
(0019) /****************************函数申明****************************************/
(0020) void LCD_init(void);
(0021) void LCD_en_write(void);
(0022) void LCD_WriteControl(unsigned char command);
(0023) void LCD_WriteData(unsigned char data);
(0024) void LCD_Clear(void);
(0025) void LCD_Cursor (char row, char column);
(0026) void LCD_DisplayCharacter (char Char);
(0027) void LCD_DisplayString (char row, char column ,unsigned char *string);
(0028) void LCD_DisplayInt (char row, char column ,unsigned int t);
(0029) void LCD_Displayasc (char row, char column, char asc);
(0030) void LCD_DisplayLong(char row, char column ,unsigned long t);
(0031) void delay_1us(void);
(0032) void delay_nus(unsigned int n);
(0033) void delay_1ms(void);
(0034) void delay_nms(unsigned int n);
(0035) /*******************************液晶初始化***********************************/
(0036) void LCD_init(void) //液晶初始化
(0037) {
(0038) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
55 B38A IN R24,0x1A
56 6F80 ORI R24,0xF0
57 BB8A OUT 0x1A,R24
(0039) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
58 9AD3 SBI 0x1A,3
(0040) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
59 9AD1 SBI 0x1A,1
(0041) LCD_RS_DDR|=LCD_RW; //
5A 9AD2 SBI 0x1A,2
(0042) LCD_WriteControl(0x28);
5B E208 LDI R16,0x28
5C D014 RCALL _LCD_WriteControl
(0043) LCD_en_write();
5D D00D RCALL _LCD_en_write
(0044) delay_nus(40);
5E E208 LDI R16,0x28
5F E010 LDI R17,0
60 D11B RCALL _delay_nus
(0045) LCD_WriteControl(0x28); //4位显示
61 E208 LDI R16,0x28
62 D00E RCALL _LCD_WriteControl
(0046) LCD_WriteControl(0x0c); //显示开
63 E00C LDI R16,0xC
64 D00C RCALL _LCD_WriteControl
(0047) LCD_WriteControl(0x01); //清屏
65 E001 LDI R16,1
66 D00A RCALL _LCD_WriteControl
(0048) delay_nms(2);
67 E002 LDI R16,2
68 E010 LDI R17,0
69 D12B RCALL _delay_nms
6A 9508 RET
(0049) }
(0050) /*******************************液晶使能*************************************/
(0051) void LCD_en_write(void) //液晶使能
(0052) {
(0053) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
6B 9ADB SBI 0x1B,3
(0054) delay_nus(1);
6C E001 LDI R16,1
6D E010 LDI R17,0
6E D10D RCALL _delay_nus
(0055) LCD_EN_PORT&=~LCD_EN;
6F 98DB CBI 0x1B,3
70 9508 RET
_LCD_WriteControl:
command --> R20
71 934A ST R20,-Y
72 2F40 MOV R20,R16
(0056) }
(0057) /*******************************写指令***************************************/
(0058) void LCD_WriteControl(unsigned char command) //写指令
(0059) {
(0060) delay_nus(16);
73 E100 LDI R16,0x10
74 E010 LDI R17,0
75 D106 RCALL _delay_nus
(0061) LCD_RS_PORT&=~LCD_RS; //RS=0
76 98D9 CBI 0x1B,1
(0062) LCD_RW_PORT&=~LCD_RW; //
77 98DA CBI 0x1B,2
(0063) LCD_DATA_PORT&=0X0f; //清高四位
78 B38B IN R24,0x1B
79 708F ANDI R24,0xF
7A BB8B OUT 0x1B,R24
(0064) LCD_DATA_PORT|=command&0xf0; //写高四位
7B 2F84 MOV R24,R20
7C 7F80 ANDI R24,0xF0
7D B22B IN R2,0x1B
7E 2A28 OR R2,R24
7F BA2B OUT 0x1B,R2
(0065) LCD_en_write();
80 DFEA RCALL _LCD_en_write
(0066) command=command<<4; //低四位移到高四位
81 2F84 MOV R24,R20
82 708F ANDI R24,0xF
83 9582 SWAP R24
84 2F48 MOV R20,R24
(0067) LCD_DATA_PORT&=0x0f; //清高四位
85 B38B IN R24,0x1B
86 708F ANDI R24,0xF
87 BB8B OUT 0x1B,R24
(0068) LCD_DATA_PORT|=command&0xf0; //写低四位
88 2F84 MOV R24,R20
89 7F80 ANDI R24,0xF0
8A B22B IN R2,0x1B
8B 2A28 OR R2,R24
8C BA2B OUT 0x1B,R2
(0069) LCD_en_write();
8D DFDD RCALL _LCD_en_write
8E 9149 LD R20,Y+
8F 9508 RET
_LCD_WriteData:
data --> R20
90 934A ST R20,-Y
91 2F40 MOV R20,R16
(0070) }
(0071) /*******************************写数据***************************************/
(0072) void LCD_WriteData(unsigned char data) //写数据
(0073) {
(0074) delay_nus(16);
92 E100 LDI R16,0x10
93 E010 LDI R17,0
94 D0E7 RCALL _delay_nus
(0075) LCD_RS_PORT|=LCD_RS; //RS=1
95 9AD9 SBI 0x1B,1
(0076) LCD_RW_PORT&=~LCD_RW; //
96 98DA CBI 0x1B,2
(0077) LCD_DATA_PORT&=0X0f; //清高四位
97 B38B IN R24,0x1B
98 708F ANDI R24,0xF
99 BB8B OUT 0x1B,R24
(0078) LCD_DATA_PORT|=data&0xf0; //写高四位
9A 2F84 MOV R24,R20
9B 7F80 ANDI R24,0xF0
9C B22B IN R2,0x1B
9D 2A28 OR R2,R24
9E BA2B OUT 0x1B,R2
(0079) LCD_en_write();
9F DFCB RCALL _LCD_en_write
(0080) data=data<<4; //低四位移到高四位
A0 2F84 MOV R24,R20
A1 708F ANDI R24,0xF
A2 9582 SWAP R24
A3 2F48 MOV R20,R24
(0081) LCD_DATA_PORT&=0X0f; //清高四位
A4 B38B IN R24,0x1B
A5 708F ANDI R24,0xF
A6 BB8B OUT 0x1B,R24
(0082) LCD_DATA_PORT|=data&0xf0; //写低四位
A7 2F84 MOV R24,R20
A8 7F80 ANDI R24,0xF0
A9 B22B IN R2,0x1B
AA 2A28 OR R2,R24
AB BA2B OUT 0x1B,R2
(0083) LCD_en_write();
AC DFBE RCALL _LCD_en_write
AD 9149 LD R20,Y+
AE 9508 RET
(0084) }
(0085)
(0086) /*******************************清屏*****************************************/
(0087) void LCD_Clear(void)
(0088) {
(0089) LCD_WriteControl(0x01);
_LCD_Clear:
AF E001 LDI R16,1
B0 DFC0 RCALL _LCD_WriteControl
B1 9508 RET
_LCD_Cursor:
column --> R20
row --> R10
B2 940E 02A3 CALL push_xgsetF00C
B4 2F42 MOV R20,R18
B5 2EA0 MOV R10,R16
(0090) }
(0091)
(0092) void LCD_Cursor (char row, char column)
(0093) {
(0094) switch (row)
B6 2D6A MOV R22,R10
B7 2777 CLR R23
B8 3061 CPI R22,1
B9 E0E0 LDI R30,0
BA 077E CPC R23,R30
BB F029 BEQ 0x00C1
BC 3062 CPI R22,2
BD E0E0 LDI R30,0
BE 077E CPC R23,R30
BF F031 BEQ 0x00C6
C0 C009 RJMP 0x00CA
(0095) {
(0096) case 1: LCD_WriteControl (0x80 + column - 1); break;
C1 2F04 MOV R16,R20
C2 5800 SUBI R16,0x80
C3 5001 SUBI R16,1
C4 DFAC RCALL _LCD_WriteControl
C5 C004 RJMP 0x00CA
(0097) case 2: LCD_WriteControl (0xc0 + column - 1); break;
C6 2F04 MOV R16,R20
C7 5400 SUBI R16,0x40
C8 5001 SUBI R16,1
C9 DFA7 RCALL _LCD_WriteControl
(0098) default: break;
CA 940C 02AA JMP pop_xgsetF00C
_LCD_DisplayCharacter:
Char --> R10
CC 92AA ST R10,-Y
CD 2EA0 MOV R10,R16
(0099) }
(0100) }
(0101)
(0102) void LCD_DisplayCharacter (char Char)
(0103) {
(0104) LCD_WriteData (Char);
CE 2D0A MOV R16,R10
CF DFC0 RCALL _LCD_WriteData
D0 90A9 LD R10,Y+
D1 9508 RET
_LCD_DisplayString:
string --> R10
column --> R14
row --> R12
D2 940E 0292 CALL push_xgset00FC
D4 2EE2 MOV R14,R18
D5 2EC0 MOV R12,R16
D6 80AE LDD R10,Y+6
D7 80BF LDD R11,Y+7
(0105) }
(0106)
(0107) void LCD_DisplayString (char row, char column ,unsigned char *string)
(0108) {
(0109) LCD_Cursor (row, column);
D8 2D2E MOV R18,R14
D9 2D0C MOV R16,R12
DA DFD7 RCALL _LCD_Cursor
DB C004 RJMP 0x00E0
(0110) while (*string)
(0111) LCD_DisplayCharacter (*string++);
DC 01F5 MOVW R30,R10
DD 9101 LD R16,Z+
DE 015F MOVW R10,R30
DF DFEC RCALL _LCD_DisplayCharacter
E0 01F5 MOVW R30,R10
E1 8020 LDD R2,Z+0
E2 2022 TST R2
E3 F7C1 BNE 0x00DC
E4 940C 027C JMP pop_xgset00FC
_LCD_DisplayInt:
n --> R14
j --> R14
str --> R20
a --> Y,+2
i --> R22
t --> R14
column --> R12
row --> R10
E6 940E 028E CALL push_xgsetF0FC
E8 2EC2 MOV R12,R18
E9 2EA0 MOV R10,R16
EA 9727 SBIW R28,7
EB 88E9 LDD R14,Y+17
EC 88FA LDD R15,Y+18
(0112) }
(0113)
(0114) unsigned char ch1[6]; //用于存放INT转换成字符串后的数据
(0115) void LCD_DisplayInt (char row, char column ,unsigned int t)
(0116) {
(0117) unsigned char n;
(0118) unsigned char a[5]; char i, j;
(0119) unsigned char *str=ch1;
ED E64B LDI R20,0x6B
EE E050 LDI R21,0
(0120) a[0]=(t/10000)%10; //取得整数值到数组
EF E120 LDI R18,0x10
F0 E237 LDI R19,0x27
F1 0187 MOVW R16,R14
F2 940E 025D CALL div16u
F4 E02A LDI R18,0xA
F5 E030 LDI R19,0
F6 940E 025B CALL mod16u
F8 830A STD Y+2,R16
(0121) a[1]=(t/1000)%10;
F9 EE28 LDI R18,0xE8
FA E033 LDI R19,3
FB 0187 MOVW R16,R14
FC 940E 025D CALL div16u
FE E02A LDI R18,0xA
FF E030 LDI R19,0
100 940E 025B CALL mod16u
102 830B STD Y+3,R16
(0122) a[2]=(t/100)%10;
103 E624 LDI R18,0x64
104 E030 LDI R19,0
105 0187 MOVW R16,R14
106 940E 025D CALL div16u
108 E02A LDI R18,0xA
109 E030 LDI R19,0
10A 940E 025B CALL mod16u
10C 830C STD Y+4,R16
(0123) a[3]=(t/10)%10;
10D E02A LDI R18,0xA
10E E030 LDI R19,0
10F 0187 MOVW R16,R14
110 940E 025D CALL div16u
112 E02A LDI R18,0xA
113 E030 LDI R19,0
114 940E 025B CALL mod16u
116 830D STD Y+5,R16
(0124) a[4]=(t/1)%10;
117 E02A LDI R18,0xA
118 E030 LDI R19,0
119 0187 MOVW R16,R14
11A 940E 025B CALL mod16u
11C 830E STD Y+6,R16
(0125)
(0126) for(i=0; i<5; i++) //转成ASCII码
11D 2766 CLR R22
11E C00B RJMP 0x012A
(0127) a[i]=a[i]+'0';
11F 01CE MOVW R24,R28
120 9602 ADIW R24,2
121 2E26 MOV R2,R22
122 2433 CLR R3
123 0E28 ADD R2,R24
124 1E39 ADC R3,R25
125 01F1 MOVW R30,R2
126 8180 LDD R24,Z+0
127 5D80 SUBI R24,0xD0
128 8380 STD Z+0,R24
129 9563 INC R22
12A 3065 CPI R22,5
12B F398 BCS 0x011F
(0128) for(i=0; a[i]=='0' && i<=3; i++);
12C 2766 CLR R22
12D C001 RJMP 0x012F
12E 9563 INC R22
12F 01CE MOVW R24,R28
130 9602 ADIW R24,2
131 2FE6 MOV R30,R22
132 27FF CLR R31
133 0FE8 ADD R30,R24
134 1FF9 ADC R31,R25
135 8180 LDD R24,Z+0
136 3380 CPI R24,0x30
137 F419 BNE 0x013B
138 E083 LDI R24,3
139 1786 CP R24,R22
13A F798 BCC 0x012E
(0129) n=5-i;
13B E085 LDI R24,5
13C 2EE8 MOV R14,R24
13D 1AE6 SUB R14,R22
(0130) for(j=5-n; j<i; j++) //填充空格
13E 198E SUB R24,R14
13F 2EE8 MOV R14,R24
140 C006 RJMP 0x0147
(0131) { *str=' '; str++; }
141 E280 LDI R24,0x20
142 01FA MOVW R30,R20
143 8380 STD Z+0,R24
144 5F4F SUBI R20,0xFF
145 4F5F SBCI R21,0xFF
146 94E3 INC R14
147 16E6 CP R14,R22
148 F3C0 BCS 0x0141
(0132) for(; i<5; i++)
149 C00C RJMP 0x0156
(0133) { *str=(char)a[i]; str++; } //加入有效的数字
14A 01CE MOVW R24,R28
14B 9602 ADIW R24,2
14C 2FE6 MOV R30,R22
14D 27FF CLR R31
14E 0FE8 ADD R30,R24
14F 1FF9 ADC R31,R25
150 8020 LDD R2,Z+0
151 01FA MOVW R30,R20
152 8220 STD Z+0,R2
153 5F4F SUBI R20,0xFF
154 4F5F SBCI R21,0xFF
155 9563 INC R22
156 3065 CPI R22,5
157 F390 BCS 0x014A
(0134) *str='\0';
158 2422 CLR R2
159 01FA MOVW R30,R20
15A 8220 STD Z+0,R2
(0135) LCD_DisplayString(row,column,ch1);
15B E68B LDI R24,0x6B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -