📄 ds18b20.lst
字号:
125 E011 LDI R17,1
126 DFD0 RCALL _s_ms
127 2344 TST R20
128 F721 BNE 0x010D
129 9149 LD R20,Y+
12A 9508 RET
_writecom:
com --> R10
12B 92AA ST R10,-Y
12C 2EA0 MOV R10,R16
(0036) }
(0037) }
(0038)
(0039) //写指令
(0040) void writecom(uchar com)
(0041) {
(0042) busy();
12D DFD2 RCALL _busy
(0043) s_ms(500);
12E EF04 LDI R16,0xF4
12F E011 LDI R17,1
130 DFC6 RCALL _s_ms
(0044) PORTA&=~(1<<RS); //RS=0
131 98DD CBI 0x1B,5
(0045) s_ms(500);
132 EF04 LDI R16,0xF4
133 E011 LDI R17,1
134 DFC2 RCALL _s_ms
(0046) PORTA&=~(1<<RW); //RW=0
135 98DE CBI 0x1B,6
(0047) s_ms(500);
136 EF04 LDI R16,0xF4
137 E011 LDI R17,1
138 DFBE RCALL _s_ms
(0048) PORTA|=(1<<EN); //EN=1
139 9ADF SBI 0x1B,7
(0049) s_ms(500);
13A EF04 LDI R16,0xF4
13B E011 LDI R17,1
13C DFBA RCALL _s_ms
(0050) PORTD = com; //输出指令
13D BAA2 OUT 0x12,R10
(0051) s_ms(500);
13E EF04 LDI R16,0xF4
13F E011 LDI R17,1
140 DFB6 RCALL _s_ms
(0052) PORTA&=~(1<<EN); //EN=0
141 98DF CBI 0x1B,7
(0053) s_ms(500);
142 EF04 LDI R16,0xF4
143 E011 LDI R17,1
144 DFB2 RCALL _s_ms
145 90A9 LD R10,Y+
146 9508 RET
(0054) }
(0055)
(0056) //1602初始化
(0057) void LcdInit(void)
(0058) {
(0059) DDRD = 0xff;
_LcdInit:
147 EF8F LDI R24,0xFF
148 BB81 OUT 0x11,R24
(0060) PORTD = 0x00;
149 2422 CLR R2
14A BA22 OUT 0x12,R2
(0061) writecom(0x38);
14B E308 LDI R16,0x38
14C DFDE RCALL _writecom
(0062) s_ms(1000);
14D EE08 LDI R16,0xE8
14E E013 LDI R17,3
14F DFA7 RCALL _s_ms
(0063) writecom(0x01);
150 E001 LDI R16,1
151 DFD9 RCALL _writecom
(0064) s_ms(1000);
152 EE08 LDI R16,0xE8
153 E013 LDI R17,3
154 DFA2 RCALL _s_ms
(0065) s_ms(1000);
155 EE08 LDI R16,0xE8
156 E013 LDI R17,3
157 DF9F RCALL _s_ms
(0066) s_ms(1000);
158 EE08 LDI R16,0xE8
159 E013 LDI R17,3
15A DF9C RCALL _s_ms
(0067) s_ms(1000);
15B EE08 LDI R16,0xE8
15C E013 LDI R17,3
15D DF99 RCALL _s_ms
(0068) s_ms(1000);
15E EE08 LDI R16,0xE8
15F E013 LDI R17,3
160 DF96 RCALL _s_ms
(0069) s_ms(1000);
161 EE08 LDI R16,0xE8
162 E013 LDI R17,3
163 DF93 RCALL _s_ms
(0070) s_ms(1000);
164 EE08 LDI R16,0xE8
165 E013 LDI R17,3
166 DF90 RCALL _s_ms
(0071) writecom(0x02);
167 E002 LDI R16,2
168 DFC2 RCALL _writecom
(0072) s_ms(1000);
169 EE08 LDI R16,0xE8
16A E013 LDI R17,3
16B DF8B RCALL _s_ms
(0073) writecom(0x06);
16C E006 LDI R16,6
16D DFBD RCALL _writecom
(0074) s_ms(1000);
16E EE08 LDI R16,0xE8
16F E013 LDI R17,3
170 DF86 RCALL _s_ms
(0075) writecom(0x0c);
171 E00C LDI R16,0xC
172 DFB8 RCALL _writecom
(0076) s_ms(1000);
173 EE08 LDI R16,0xE8
174 E013 LDI R17,3
175 DF81 RCALL _s_ms
(0077) writecom(0x38);
176 E308 LDI R16,0x38
177 DFB3 RCALL _writecom
(0078) s_ms(1000);
178 EE08 LDI R16,0xE8
179 E013 LDI R17,3
17A DF7C RCALL _s_ms
17B 9508 RET
_writedata:
data --> R10
17C 92AA ST R10,-Y
17D 2EA0 MOV R10,R16
(0079) }
(0080)
(0081) //写数据
(0082) void writedata(uchar data)
(0083) {
(0084) busy();
17E DF81 RCALL _busy
(0085) s_ms(500);
17F EF04 LDI R16,0xF4
180 E011 LDI R17,1
181 DF75 RCALL _s_ms
(0086) PORTA|=(1<<RS); //RS=1
182 9ADD SBI 0x1B,5
(0087) s_ms(500);
183 EF04 LDI R16,0xF4
184 E011 LDI R17,1
185 DF71 RCALL _s_ms
(0088) PORTA&=~(1<<RW); //RW=0
186 98DE CBI 0x1B,6
(0089) s_ms(500);
187 EF04 LDI R16,0xF4
188 E011 LDI R17,1
189 DF6D RCALL _s_ms
(0090) PORTA|=(1<<EN); //EN=1
18A 9ADF SBI 0x1B,7
(0091) s_ms(500);
18B EF04 LDI R16,0xF4
18C E011 LDI R17,1
18D DF69 RCALL _s_ms
(0092) PORTD = data; //输出数据
18E BAA2 OUT 0x12,R10
(0093) s_ms(500);
18F EF04 LDI R16,0xF4
190 E011 LDI R17,1
191 DF65 RCALL _s_ms
(0094) PORTA&=~(1<<EN); //EN=0
192 98DF CBI 0x1B,7
(0095) s_ms(500);
193 EF04 LDI R16,0xF4
194 E011 LDI R17,1
195 DF61 RCALL _s_ms
196 90A9 LD R10,Y+
197 9508 RET
_readdata:
temp --> R10
198 92AA ST R10,-Y
(0096) }
(0097)
(0098)
(0099) //读数据
(0100) uchar readdata(void)
(0101) {
(0102) uchar temp;
(0103) busy();
199 DF66 RCALL _busy
(0104) s_ms(500);
19A EF04 LDI R16,0xF4
19B E011 LDI R17,1
19C DF5A RCALL _s_ms
(0105) PORTA|=(1<<RS); //RS=1
19D 9ADD SBI 0x1B,5
(0106) s_ms(500);
19E EF04 LDI R16,0xF4
19F E011 LDI R17,1
1A0 DF56 RCALL _s_ms
(0107) PORTA|=(1<<RW); //RW=1
1A1 9ADE SBI 0x1B,6
(0108) s_ms(500);
1A2 EF04 LDI R16,0xF4
1A3 E011 LDI R17,1
1A4 DF52 RCALL _s_ms
(0109) PORTA|=(1<<EN); //EN=1
1A5 9ADF SBI 0x1B,7
(0110) s_ms(500);
1A6 EF04 LDI R16,0xF4
1A7 E011 LDI R17,1
1A8 DF4E RCALL _s_ms
(0111) DDRD=0x00; //A端口变输入
1A9 2422 CLR R2
1AA BA21 OUT 0x11,R2
(0112) s_ms(500);
1AB EF04 LDI R16,0xF4
1AC E011 LDI R17,1
1AD DF49 RCALL _s_ms
(0113) temp = PIND; //读A端口
1AE B2A0 IN R10,0x10
(0114) s_ms(500);
1AF EF04 LDI R16,0xF4
1B0 E011 LDI R17,1
1B1 DF45 RCALL _s_ms
(0115) DDRD=0xff; //A端口变输出
1B2 EF8F LDI R24,0xFF
1B3 BB81 OUT 0x11,R24
(0116) s_ms(500);
1B4 EF04 LDI R16,0xF4
1B5 E011 LDI R17,1
1B6 DF40 RCALL _s_ms
(0117) PORTA&=~(1<<EN); //EN=0
1B7 98DF CBI 0x1B,7
(0118) s_ms(500);
1B8 EF04 LDI R16,0xF4
1B9 E011 LDI R17,1
1BA DF3C RCALL _s_ms
(0119) return temp;
1BB 2D0A MOV R16,R10
1BC 90A9 LD R10,Y+
1BD 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
1BE 940E 0326 CALL push_xgsetF00C
1C0 01B9 MOVW R22,R18
1C1 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);
1C2 E400 LDI R16,0x40
1C3 DF67 RCALL _writecom
(0132) PORTA|=(1<<RS);
1C4 9ADD SBI 0x1B,5
(0133) PORTA&=~(1<<RW);
1C5 98DE CBI 0x1B,6
(0134) for(i=num;i!=0;i--)
1C6 01A5 MOVW R20,R10
1C7 C00A RJMP 0x01D2
(0135) {
(0136) t = *pBuffer;
1C8 01FB MOVW R30,R22
1C9 90A5 LPM R10,Z+
1CA 90B4 LPM R11,10(Z)
(0137) PORTA|=(1<<EN);
1CB 9ADF SBI 0x1B,7
(0138) PORTD = t;
1CC BAA2 OUT 0x12,R10
(0139) PORTA&=~(1<<EN);
1CD 98DF CBI 0x1B,7
(0140) pBuffer++;
1CE 5F6E SUBI R22,0xFE
1CF 4F7F SBCI R23,0xFF
1D0 5041 SUBI R20,1
1D1 4050 SBCI R21,0
1D2 3040 CPI R20,0
1D3 0745 CPC R20,R21
1D4 F799 BNE 0x01C8
1D5 940C 032D JMP pop_xgsetF00C
_WriteMenu:
t --> R10
i --> R22
pBuffer --> R20
1D7 940E 0326 CALL push_xgsetF00C
1D9 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); //数据地址
1DA E800 LDI R16,0x80
1DB DF4F RCALL _writecom
(0154)
(0155) PORTA|=(1<<RS);
1DC 9ADD SBI 0x1B,5
(0156) PORTA&=~(1<<RW);
1DD 98DE CBI 0x1B,6
(0157) s_ms(50);
1DE E302 LDI R16,0x32
1DF E010 LDI R17,0
1E0 DF16 RCALL _s_ms
(0158) for(i=0;i<16;i++)
1E1 2766 CLR R22
1E2 C00B RJMP 0x01EE
(0159) {
(0160) t = *pBuffer;
1E3 01FA MOVW R30,R20
1E4 90A4 LPM R10,11(Z)
(0161) PORTD = t;
1E5 BAA2 OUT 0x12,R10
(0162) PORTA|=(1<<EN);
1E6 9ADF SBI 0x1B,7
(0163) s_ms(50);
1E7 E302 LDI R16,0x32
1E8 E010 LDI R17,0
1E9 DF0D RCALL _s_ms
(0164) PORTA&=~(1<<EN);
1EA 98DF CBI 0x1B,7
(0165) pBuffer++;
1EB 5F4F SUBI R20,0xFF
1EC 4F5F SBCI R21,0xFF
1ED 9563 INC R22
1EE 3160 CPI R22,0x10
1EF F398 BCS 0x01E3
(0166) }
(0167) writecom(0xC0);
1F0 EC00 LDI R16,0xC0
1F1 DF39 RCALL _writecom
(0168)
(0169) PORTA|=(1<<RS);
1F2 9ADD SBI 0x1B,5
(0170) PORTA&=~(1<<RW);
1F3 98DE CBI 0x1B,6
(0171) s_ms(50);
1F4 E302 LDI R16,0x32
1F5 E010 LDI R17,0
1F6 DF00 RCALL _s_ms
(0172) for(i=0;i<16;i++)
1F7 2766 CLR R22
1F8 C00B RJMP 0x0204
(0173) {
(0174) t = *pBuffer;
1F9 01FA MOVW R30,R20
1FA 90A4 LPM R10,11(Z)
(0175) PORTD = t;
1FB BAA2 OUT 0x12,R10
(0176) PORTA|=(1<<EN);
1FC 9ADF SBI 0x1B,7
(0177) s_ms(50);
1FD E302 LDI R16,0x32
1FE E010 LDI R17,0
1FF DEF7 RCALL _s_ms
(0178) PORTA&=~(1<<EN);
200 98DF CBI 0x1B,7
(0179) pBuffer++;
201 5F4F SUBI R20,0xFF
202 4F5F SBCI R21,0xFF
203 9563 INC R22
204 3160 CPI R22,0x10
205 F398 BCS 0x01F9
206 940C 032D JMP pop_xgsetF00C
_WriteNum:
num --> R20
col --> R10
row --> R22
208 940E 0326 CALL push_xgsetF00C
20A 0159 MOVW R10,R18
20B 01B8 MOVW R22,R16
20C 814E LDD R20,Y+6
20D 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;
20E 3061 CPI R22,1
20F E0E0 LDI R30,0
210 077E CPC R23,R30
211 F421 BNE 0x0216
212 01B5 MOVW R22,R10
213 5860 SUBI R22,0x80
214 4F7F SBCI R23,0xFF
215 C003 RJMP 0x0219
(0192) else row = 0xC0 + col;
216 01B5 MOVW R22,R10
217 5460 SUBI R22,0x40
218 4F7F SBCI R23,0xFF
(0193) writecom(row);
219 2F06 MOV R16,R22
21A DF10 RCALL _writecom
(0194) if (num<=0 | num>9) num =0x30;
21B 3040 CPI R20,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -