📄 ds18b20.lst
字号:
125 DFD0 RCALL _s_ms
126 2344 TST R20
127 F721 BNE 0x010C
128 9149 LD R20,Y+
129 9508 RET
_writecom:
com --> R10
12A 92AA ST R10,-Y
12B 2EA0 MOV R10,R16
(0036) }
(0037) }
(0038)
(0039) //写指令
(0040) void writecom(uchar com)
(0041) {
(0042) busy();
12C DFD2 RCALL _busy
(0043) s_ms(500);
12D EF04 LDI R16,0xF4
12E E011 LDI R17,1
12F DFC6 RCALL _s_ms
(0044) PORTA&=~(1<<RS); //RS=0
130 98DD CBI 0x1B,5
(0045) s_ms(500);
131 EF04 LDI R16,0xF4
132 E011 LDI R17,1
133 DFC2 RCALL _s_ms
(0046) PORTA&=~(1<<RW); //RW=0
134 98DE CBI 0x1B,6
(0047) s_ms(500);
135 EF04 LDI R16,0xF4
136 E011 LDI R17,1
137 DFBE RCALL _s_ms
(0048) PORTA|=(1<<EN); //EN=1
138 9ADF SBI 0x1B,7
(0049) s_ms(500);
139 EF04 LDI R16,0xF4
13A E011 LDI R17,1
13B DFBA RCALL _s_ms
(0050) PORTD = com; //输出指令
13C BAA2 OUT 0x12,R10
(0051) s_ms(500);
13D EF04 LDI R16,0xF4
13E E011 LDI R17,1
13F DFB6 RCALL _s_ms
(0052) PORTA&=~(1<<EN); //EN=0
140 98DF CBI 0x1B,7
(0053) s_ms(500);
141 EF04 LDI R16,0xF4
142 E011 LDI R17,1
143 DFB2 RCALL _s_ms
144 90A9 LD R10,Y+
145 9508 RET
(0054) }
(0055)
(0056) //1602初始化
(0057) void LcdInit(void)
(0058) {
(0059) DDRD = 0xff;
_LcdInit:
146 EF8F LDI R24,0xFF
147 BB81 OUT 0x11,R24
(0060) PORTD = 0x00;
148 2422 CLR R2
149 BA22 OUT 0x12,R2
(0061) writecom(0x38);
14A E308 LDI R16,0x38
14B DFDE RCALL _writecom
(0062) s_ms(1000);
14C EE08 LDI R16,0xE8
14D E013 LDI R17,3
14E DFA7 RCALL _s_ms
(0063) writecom(0x01);
14F E001 LDI R16,1
150 DFD9 RCALL _writecom
(0064) s_ms(1000);
151 EE08 LDI R16,0xE8
152 E013 LDI R17,3
153 DFA2 RCALL _s_ms
(0065) s_ms(1000);
154 EE08 LDI R16,0xE8
155 E013 LDI R17,3
156 DF9F RCALL _s_ms
(0066) s_ms(1000);
157 EE08 LDI R16,0xE8
158 E013 LDI R17,3
159 DF9C RCALL _s_ms
(0067) s_ms(1000);
15A EE08 LDI R16,0xE8
15B E013 LDI R17,3
15C DF99 RCALL _s_ms
(0068) s_ms(1000);
15D EE08 LDI R16,0xE8
15E E013 LDI R17,3
15F DF96 RCALL _s_ms
(0069) s_ms(1000);
160 EE08 LDI R16,0xE8
161 E013 LDI R17,3
162 DF93 RCALL _s_ms
(0070) s_ms(1000);
163 EE08 LDI R16,0xE8
164 E013 LDI R17,3
165 DF90 RCALL _s_ms
(0071) writecom(0x02);
166 E002 LDI R16,2
167 DFC2 RCALL _writecom
(0072) s_ms(1000);
168 EE08 LDI R16,0xE8
169 E013 LDI R17,3
16A DF8B RCALL _s_ms
(0073) writecom(0x06);
16B E006 LDI R16,6
16C DFBD RCALL _writecom
(0074) s_ms(1000);
16D EE08 LDI R16,0xE8
16E E013 LDI R17,3
16F DF86 RCALL _s_ms
(0075) writecom(0x0c);
170 E00C LDI R16,0xC
171 DFB8 RCALL _writecom
(0076) s_ms(1000);
172 EE08 LDI R16,0xE8
173 E013 LDI R17,3
174 DF81 RCALL _s_ms
(0077) writecom(0x38);
175 E308 LDI R16,0x38
176 DFB3 RCALL _writecom
(0078) s_ms(1000);
177 EE08 LDI R16,0xE8
178 E013 LDI R17,3
179 CF7C RJMP _s_ms
_writedata:
data --> R10
17A 92AA ST R10,-Y
17B 2EA0 MOV R10,R16
(0079) }
(0080)
(0081) //写数据
(0082) void writedata(uchar data)
(0083) {
(0084) busy();
17C DF82 RCALL _busy
(0085) s_ms(500);
17D EF04 LDI R16,0xF4
17E E011 LDI R17,1
17F DF76 RCALL _s_ms
(0086) PORTA|=(1<<RS); //RS=1
180 9ADD SBI 0x1B,5
(0087) s_ms(500);
181 EF04 LDI R16,0xF4
182 E011 LDI R17,1
183 DF72 RCALL _s_ms
(0088) PORTA&=~(1<<RW); //RW=0
184 98DE CBI 0x1B,6
(0089) s_ms(500);
185 EF04 LDI R16,0xF4
186 E011 LDI R17,1
187 DF6E RCALL _s_ms
(0090) PORTA|=(1<<EN); //EN=1
188 9ADF SBI 0x1B,7
(0091) s_ms(500);
189 EF04 LDI R16,0xF4
18A E011 LDI R17,1
18B DF6A RCALL _s_ms
(0092) PORTD = data; //输出数据
18C BAA2 OUT 0x12,R10
(0093) s_ms(500);
18D EF04 LDI R16,0xF4
18E E011 LDI R17,1
18F DF66 RCALL _s_ms
(0094) PORTA&=~(1<<EN); //EN=0
190 98DF CBI 0x1B,7
(0095) s_ms(500);
191 EF04 LDI R16,0xF4
192 E011 LDI R17,1
193 DF62 RCALL _s_ms
194 90A9 LD R10,Y+
195 9508 RET
_readdata:
temp --> R10
196 92AA ST R10,-Y
(0096) }
(0097)
(0098)
(0099) //读数据
(0100) uchar readdata(void)
(0101) {
(0102) uchar temp;
(0103) busy();
197 DF67 RCALL _busy
(0104) s_ms(500);
198 EF04 LDI R16,0xF4
199 E011 LDI R17,1
19A DF5B RCALL _s_ms
(0105) PORTA|=(1<<RS); //RS=1
19B 9ADD SBI 0x1B,5
(0106) s_ms(500);
19C EF04 LDI R16,0xF4
19D E011 LDI R17,1
19E DF57 RCALL _s_ms
(0107) PORTA|=(1<<RW); //RW=1
19F 9ADE SBI 0x1B,6
(0108) s_ms(500);
1A0 EF04 LDI R16,0xF4
1A1 E011 LDI R17,1
1A2 DF53 RCALL _s_ms
(0109) PORTA|=(1<<EN); //EN=1
1A3 9ADF SBI 0x1B,7
(0110) s_ms(500);
1A4 EF04 LDI R16,0xF4
1A5 E011 LDI R17,1
1A6 DF4F RCALL _s_ms
(0111) DDRD=0x00; //A端口变输入
1A7 2422 CLR R2
1A8 BA21 OUT 0x11,R2
(0112) s_ms(500);
1A9 EF04 LDI R16,0xF4
1AA E011 LDI R17,1
1AB DF4A RCALL _s_ms
(0113) temp = PIND; //读A端口
1AC B2A0 IN R10,0x10
(0114) s_ms(500);
1AD EF04 LDI R16,0xF4
1AE E011 LDI R17,1
1AF DF46 RCALL _s_ms
(0115) DDRD=0xff; //A端口变输出
1B0 EF8F LDI R24,0xFF
1B1 BB81 OUT 0x11,R24
(0116) s_ms(500);
1B2 EF04 LDI R16,0xF4
1B3 E011 LDI R17,1
1B4 DF41 RCALL _s_ms
(0117) PORTA&=~(1<<EN); //EN=0
1B5 98DF CBI 0x1B,7
(0118) s_ms(500);
1B6 EF04 LDI R16,0xF4
1B7 E011 LDI R17,1
1B8 DF3D RCALL _s_ms
(0119) return temp;
1B9 2D0A MOV R16,R10
1BA 90A9 LD R10,Y+
1BB 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
1BC 940E 0325 CALL push_xgsetF00C
1BE 01B9 MOVW R22,R18
1BF 0158 MOVW R10,R16
(0120) }
(0121)
(0122) //=================================================
(0123) // 描述: 写LCD内部CGRAM函数
(0124) // 入口: ‘num’要写的数据个数
(0125) // ‘pbuffer’要写的数据的首地址
(0126) // 出口: 无
(0127) //================================================
(0128) void WriteCGRAM(uint num, const uint *pBuffer)
(0129) {
(0130) uint i,t;
(0131) writecom(0x40);
1C0 E400 LDI R16,0x40
1C1 DF68 RCALL _writecom
(0132) PORTA|=(1<<RS);
1C2 9ADD SBI 0x1B,5
(0133) PORTA&=~(1<<RW);
1C3 98DE CBI 0x1B,6
(0134) for(i=num;i!=0;i--)
1C4 01A5 MOVW R20,R10
1C5 C00A RJMP 0x01D0
(0135) {
(0136) t = *pBuffer;
1C6 01FB MOVW R30,R22
1C7 80A0 LDD R10,Z+0
1C8 80B1 LDD R11,Z+1
(0137) PORTA|=(1<<EN);
1C9 9ADF SBI 0x1B,7
(0138) PORTD = t;
1CA BAA2 OUT 0x12,R10
(0139) PORTA&=~(1<<EN);
1CB 98DF CBI 0x1B,7
(0140) pBuffer++;
1CC 5F6E SUBI R22,0xFE
1CD 4F7F SBCI R23,0xFF
1CE 5041 SUBI R20,1
1CF 4050 SBCI R21,0
1D0 3040 CPI R20,0
1D1 0745 CPC R20,R21
1D2 F799 BNE 0x01C6
1D3 940C 032C JMP pop_xgsetF00C
_WriteMenu:
t --> R10
i --> R22
pBuffer --> R20
1D5 940E 0325 CALL push_xgsetF00C
1D7 01A8 MOVW R20,R16
(0141) }
(0142)
(0143) }
(0144)
(0145) //=================================================
(0146) //描述:写菜单函数,本程序使用的LCD规格为 16 * 2
(0147) //入口:菜单数组首地址
(0148) //出口:无
(0149) //=================================================
(0150) void WriteMenu(const uchar *pBuffer)
(0151) {
(0152) uchar i,t;
(0153) writecom(0x80); //数据地址
1D8 E800 LDI R16,0x80
1D9 DF50 RCALL _writecom
(0154)
(0155) PORTA|=(1<<RS);
1DA 9ADD SBI 0x1B,5
(0156) PORTA&=~(1<<RW);
1DB 98DE CBI 0x1B,6
(0157) s_ms(50);
1DC E302 LDI R16,0x32
1DD E010 LDI R17,0
1DE DF17 RCALL _s_ms
(0158) for(i=0;i<16;i++)
1DF 2766 CLR R22
1E0 C00B RJMP 0x01EC
(0159) {
(0160) t = *pBuffer;
1E1 01FA MOVW R30,R20
1E2 80A0 LDD R10,Z+0
(0161) PORTD = t;
1E3 BAA2 OUT 0x12,R10
(0162) PORTA|=(1<<EN);
1E4 9ADF SBI 0x1B,7
(0163) s_ms(50);
1E5 E302 LDI R16,0x32
1E6 E010 LDI R17,0
1E7 DF0E RCALL _s_ms
(0164) PORTA&=~(1<<EN);
1E8 98DF CBI 0x1B,7
(0165) pBuffer++;
1E9 5F4F SUBI R20,0xFF
1EA 4F5F SBCI R21,0xFF
1EB 9563 INC R22
1EC 3160 CPI R22,0x10
1ED F398 BCS 0x01E1
(0166) }
(0167) writecom(0xC0);
1EE EC00 LDI R16,0xC0
1EF DF3A RCALL _writecom
(0168)
(0169) PORTA|=(1<<RS);
1F0 9ADD SBI 0x1B,5
(0170) PORTA&=~(1<<RW);
1F1 98DE CBI 0x1B,6
(0171) s_ms(50);
1F2 E302 LDI R16,0x32
1F3 E010 LDI R17,0
1F4 DF01 RCALL _s_ms
(0172) for(i=0;i<16;i++)
1F5 2766 CLR R22
1F6 C00B RJMP 0x0202
(0173) {
(0174) t = *pBuffer;
1F7 01FA MOVW R30,R20
1F8 80A0 LDD R10,Z+0
(0175) PORTD = t;
1F9 BAA2 OUT 0x12,R10
(0176) PORTA|=(1<<EN);
1FA 9ADF SBI 0x1B,7
(0177) s_ms(50);
1FB E302 LDI R16,0x32
1FC E010 LDI R17,0
1FD DEF8 RCALL _s_ms
(0178) PORTA&=~(1<<EN);
1FE 98DF CBI 0x1B,7
(0179) pBuffer++;
1FF 5F4F SUBI R20,0xFF
200 4F5F SBCI R21,0xFF
201 9563 INC R22
202 3160 CPI R22,0x10
203 F398 BCS 0x01F7
204 940C 032C JMP pop_xgsetF00C
_WriteNum:
num --> R20
col --> R10
row --> R22
206 940E 0325 CALL push_xgsetF00C
208 0159 MOVW R10,R18
209 01B8 MOVW R22,R16
20A 814E LDD R20,Y+6
20B 815F LDD R21,Y+7
(0180) }
(0181) }
(0182) //====================================================
(0183) // 描述:在任意位置写数字函数
(0184) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0185) // ’col‘表示要写数字所在的列地址,只能为0--15
(0186) // ‘num’表示要写的数字,只能为0--9
(0187) // 出口:无
(0188) //===================================================
(0189) void WriteNum(uint row,uint col,uint num)
(0190) {
(0191) if (row == 1) row = 0x80 + col;
20C 3061 CPI R22,1
20D E0E0 LDI R30,0
20E 077E CPC R23,R30
20F F421 BNE 0x0214
210 01B5 MOVW R22,R10
211 5860 SUBI R22,0x80
212 4F7F SBCI R23,0xFF
213 C003 RJMP 0x0217
(0192) else row = 0xC0 + col;
214 01B5 MOVW R22,R10
215 5460 SUBI R22,0x40
216 4F7F SBCI R23,0xFF
(0193) writecom(row);
217 2F06 MOV R16,R22
218 DF11 RCALL _writecom
(0194) if (num<=0 | num>9) num =0x30;
219 3040 CPI R20,0
21A 0745 CPC R20,R21
21B F421 BNE 0x0220
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -