📄 ds1302.lst
字号:
_writecom:
com --> R10
13B 92AA ST R10,-Y
13C 2EA0 MOV R10,R16
(0036) }
(0037) }
(0038)
(0039) //写指令
(0040) void writecom(uchar com)
(0041) {
(0042) busy();
13D DFD2 RCALL _busy
(0043) s_ms(500);
13E EF04 LDI R16,0xF4
13F E011 LDI R17,1
140 DFC6 RCALL _s_ms
(0044) PORTA&=~(1<<RS); //RS=0
141 98DD CBI 0x1B,5
(0045) s_ms(500);
142 EF04 LDI R16,0xF4
143 E011 LDI R17,1
144 DFC2 RCALL _s_ms
(0046) PORTA&=~(1<<RW); //RW=0
145 98DE CBI 0x1B,6
(0047) s_ms(500);
146 EF04 LDI R16,0xF4
147 E011 LDI R17,1
148 DFBE RCALL _s_ms
(0048) PORTA|=(1<<EN); //EN=1
149 9ADF SBI 0x1B,7
(0049) s_ms(500);
14A EF04 LDI R16,0xF4
14B E011 LDI R17,1
14C DFBA RCALL _s_ms
(0050) PORTD = com; //输出指令
14D BAA2 OUT 0x12,R10
(0051) s_ms(500);
14E EF04 LDI R16,0xF4
14F E011 LDI R17,1
150 DFB6 RCALL _s_ms
(0052) PORTA&=~(1<<EN); //EN=0
151 98DF CBI 0x1B,7
(0053) s_ms(500);
152 EF04 LDI R16,0xF4
153 E011 LDI R17,1
154 DFB2 RCALL _s_ms
155 90A9 LD R10,Y+
156 9508 RET
(0054) }
(0055)
(0056) //1602初始化
(0057) void LcdInit(void)
(0058) {
(0059) DDRD = 0xff;
_LcdInit:
157 EF8F LDI R24,0xFF
158 BB81 OUT 0x11,R24
(0060) PORTD = 0x00;
159 2422 CLR R2
15A BA22 OUT 0x12,R2
(0061) writecom(0x38);
15B E308 LDI R16,0x38
15C DFDE RCALL _writecom
(0062) s_ms(1000);
15D EE08 LDI R16,0xE8
15E E013 LDI R17,3
15F DFA7 RCALL _s_ms
(0063) writecom(0x01);
160 E001 LDI R16,1
161 DFD9 RCALL _writecom
(0064) s_ms(1000);
162 EE08 LDI R16,0xE8
163 E013 LDI R17,3
164 DFA2 RCALL _s_ms
(0065) s_ms(1000);
165 EE08 LDI R16,0xE8
166 E013 LDI R17,3
167 DF9F RCALL _s_ms
(0066) s_ms(1000);
168 EE08 LDI R16,0xE8
169 E013 LDI R17,3
16A DF9C RCALL _s_ms
(0067) s_ms(1000);
16B EE08 LDI R16,0xE8
16C E013 LDI R17,3
16D DF99 RCALL _s_ms
(0068) s_ms(1000);
16E EE08 LDI R16,0xE8
16F E013 LDI R17,3
170 DF96 RCALL _s_ms
(0069) s_ms(1000);
171 EE08 LDI R16,0xE8
172 E013 LDI R17,3
173 DF93 RCALL _s_ms
(0070) s_ms(1000);
174 EE08 LDI R16,0xE8
175 E013 LDI R17,3
176 DF90 RCALL _s_ms
(0071) writecom(0x02);
177 E002 LDI R16,2
178 DFC2 RCALL _writecom
(0072) s_ms(1000);
179 EE08 LDI R16,0xE8
17A E013 LDI R17,3
17B DF8B RCALL _s_ms
(0073) writecom(0x06);
17C E006 LDI R16,6
17D DFBD RCALL _writecom
(0074) s_ms(1000);
17E EE08 LDI R16,0xE8
17F E013 LDI R17,3
180 DF86 RCALL _s_ms
(0075) writecom(0x0c);
181 E00C LDI R16,0xC
182 DFB8 RCALL _writecom
(0076) s_ms(1000);
183 EE08 LDI R16,0xE8
184 E013 LDI R17,3
185 DF81 RCALL _s_ms
(0077) writecom(0x38);
186 E308 LDI R16,0x38
187 DFB3 RCALL _writecom
(0078) s_ms(1000);
188 EE08 LDI R16,0xE8
189 E013 LDI R17,3
18A CF7C RJMP _s_ms
_writedata:
data --> R10
18B 92AA ST R10,-Y
18C 2EA0 MOV R10,R16
(0079) }
(0080)
(0081) //写数据
(0082) void writedata(uchar data)
(0083) {
(0084) busy();
18D DF82 RCALL _busy
(0085) s_ms(500);
18E EF04 LDI R16,0xF4
18F E011 LDI R17,1
190 DF76 RCALL _s_ms
(0086) PORTA|=(1<<RS); //RS=1
191 9ADD SBI 0x1B,5
(0087) s_ms(500);
192 EF04 LDI R16,0xF4
193 E011 LDI R17,1
194 DF72 RCALL _s_ms
(0088) PORTA&=~(1<<RW); //RW=0
195 98DE CBI 0x1B,6
(0089) s_ms(500);
196 EF04 LDI R16,0xF4
197 E011 LDI R17,1
198 DF6E RCALL _s_ms
(0090) PORTA|=(1<<EN); //EN=1
199 9ADF SBI 0x1B,7
(0091) s_ms(500);
19A EF04 LDI R16,0xF4
19B E011 LDI R17,1
19C DF6A RCALL _s_ms
(0092) PORTD = data; //输出数据
19D BAA2 OUT 0x12,R10
(0093) s_ms(500);
19E EF04 LDI R16,0xF4
19F E011 LDI R17,1
1A0 DF66 RCALL _s_ms
(0094) PORTA&=~(1<<EN); //EN=0
1A1 98DF CBI 0x1B,7
(0095) s_ms(500);
1A2 EF04 LDI R16,0xF4
1A3 E011 LDI R17,1
1A4 DF62 RCALL _s_ms
1A5 90A9 LD R10,Y+
1A6 9508 RET
_readdata:
temp --> R10
1A7 92AA ST R10,-Y
(0096) }
(0097)
(0098)
(0099) //读数据
(0100) uchar readdata(void)
(0101) {
(0102) uchar temp;
(0103) busy();
1A8 DF67 RCALL _busy
(0104) s_ms(500);
1A9 EF04 LDI R16,0xF4
1AA E011 LDI R17,1
1AB DF5B RCALL _s_ms
(0105) PORTA|=(1<<RS); //RS=1
1AC 9ADD SBI 0x1B,5
(0106) s_ms(500);
1AD EF04 LDI R16,0xF4
1AE E011 LDI R17,1
1AF DF57 RCALL _s_ms
(0107) PORTA|=(1<<RW); //RW=1
1B0 9ADE SBI 0x1B,6
(0108) s_ms(500);
1B1 EF04 LDI R16,0xF4
1B2 E011 LDI R17,1
1B3 DF53 RCALL _s_ms
(0109) PORTA|=(1<<EN); //EN=1
1B4 9ADF SBI 0x1B,7
(0110) s_ms(500);
1B5 EF04 LDI R16,0xF4
1B6 E011 LDI R17,1
1B7 DF4F RCALL _s_ms
(0111) DDRD=0x00; //A端口变输入
1B8 2422 CLR R2
1B9 BA21 OUT 0x11,R2
(0112) s_ms(500);
1BA EF04 LDI R16,0xF4
1BB E011 LDI R17,1
1BC DF4A RCALL _s_ms
(0113) temp = PIND; //读A端口
1BD B2A0 IN R10,0x10
(0114) s_ms(500);
1BE EF04 LDI R16,0xF4
1BF E011 LDI R17,1
1C0 DF46 RCALL _s_ms
(0115) DDRD=0xff; //A端口变输出
1C1 EF8F LDI R24,0xFF
1C2 BB81 OUT 0x11,R24
(0116) s_ms(500);
1C3 EF04 LDI R16,0xF4
1C4 E011 LDI R17,1
1C5 DF41 RCALL _s_ms
(0117) PORTA&=~(1<<EN); //EN=0
1C6 98DF CBI 0x1B,7
(0118) s_ms(500);
1C7 EF04 LDI R16,0xF4
1C8 E011 LDI R17,1
1C9 DF3D RCALL _s_ms
(0119) return temp;
1CA 2D0A MOV R16,R10
1CB 90A9 LD R10,Y+
1CC 9508 RET
_WriteCGRAM:
t --> R10
i --> R20
pBuffer --> R22
num --> R10
1CD 940E 03A0 CALL push_xgsetF00C
1CF 01B9 MOVW R22,R18
1D0 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);
1D1 E400 LDI R16,0x40
1D2 DF68 RCALL _writecom
(0132) PORTA|=(1<<RS);
1D3 9ADD SBI 0x1B,5
(0133) PORTA&=~(1<<RW);
1D4 98DE CBI 0x1B,6
(0134) for(i=num;i!=0;i--)
1D5 01A5 MOVW R20,R10
1D6 C00A RJMP 0x01E1
(0135) {
(0136) t = *pBuffer;
1D7 01FB MOVW R30,R22
1D8 80A0 LDD R10,Z+0
1D9 80B1 LDD R11,Z+1
(0137) PORTA|=(1<<EN);
1DA 9ADF SBI 0x1B,7
(0138) PORTD = t;
1DB BAA2 OUT 0x12,R10
(0139) PORTA&=~(1<<EN);
1DC 98DF CBI 0x1B,7
(0140) pBuffer++;
1DD 5F6E SUBI R22,0xFE
1DE 4F7F SBCI R23,0xFF
1DF 5041 SUBI R20,1
1E0 4050 SBCI R21,0
1E1 3040 CPI R20,0
1E2 0745 CPC R20,R21
1E3 F799 BNE 0x01D7
1E4 940C 03A7 JMP pop_xgsetF00C
_WriteMenu:
t --> R10
i --> R22
pBuffer --> R20
1E6 940E 03A0 CALL push_xgsetF00C
1E8 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); //数据地址
1E9 E800 LDI R16,0x80
1EA DF50 RCALL _writecom
(0154)
(0155) PORTA|=(1<<RS);
1EB 9ADD SBI 0x1B,5
(0156) PORTA&=~(1<<RW);
1EC 98DE CBI 0x1B,6
(0157) s_ms(50);
1ED E302 LDI R16,0x32
1EE E010 LDI R17,0
1EF DF17 RCALL _s_ms
(0158) for(i=0;i<16;i++)
1F0 2766 CLR R22
1F1 C00B RJMP 0x01FD
(0159) {
(0160) t = *pBuffer;
1F2 01FA MOVW R30,R20
1F3 80A0 LDD R10,Z+0
(0161) PORTD = t;
1F4 BAA2 OUT 0x12,R10
(0162) PORTA|=(1<<EN);
1F5 9ADF SBI 0x1B,7
(0163) s_ms(50);
1F6 E302 LDI R16,0x32
1F7 E010 LDI R17,0
1F8 DF0E RCALL _s_ms
(0164) PORTA&=~(1<<EN);
1F9 98DF CBI 0x1B,7
(0165) pBuffer++;
1FA 5F4F SUBI R20,0xFF
1FB 4F5F SBCI R21,0xFF
1FC 9563 INC R22
1FD 3160 CPI R22,0x10
1FE F398 BCS 0x01F2
(0166) }
(0167) writecom(0xC0);
1FF EC00 LDI R16,0xC0
200 DF3A RCALL _writecom
(0168)
(0169) PORTA|=(1<<RS);
201 9ADD SBI 0x1B,5
(0170) PORTA&=~(1<<RW);
202 98DE CBI 0x1B,6
(0171) s_ms(50);
203 E302 LDI R16,0x32
204 E010 LDI R17,0
205 DF01 RCALL _s_ms
(0172) for(i=0;i<16;i++)
206 2766 CLR R22
207 C00B RJMP 0x0213
(0173) {
(0174) t = *pBuffer;
208 01FA MOVW R30,R20
209 80A0 LDD R10,Z+0
(0175) PORTD = t;
20A BAA2 OUT 0x12,R10
(0176) PORTA|=(1<<EN);
20B 9ADF SBI 0x1B,7
(0177) s_ms(50);
20C E302 LDI R16,0x32
20D E010 LDI R17,0
20E DEF8 RCALL _s_ms
(0178) PORTA&=~(1<<EN);
20F 98DF CBI 0x1B,7
(0179) pBuffer++;
210 5F4F SUBI R20,0xFF
211 4F5F SBCI R21,0xFF
212 9563 INC R22
213 3160 CPI R22,0x10
214 F398 BCS 0x0208
215 940C 03A7 JMP pop_xgsetF00C
_WriteNum:
num --> R20
col --> R10
row --> R22
217 940E 03A0 CALL push_xgsetF00C
219 0159 MOVW R10,R18
21A 01B8 MOVW R22,R16
21B 814E LDD R20,Y+6
21C 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;
21D 3061 CPI R22,1
21E E0E0 LDI R30,0
21F 077E CPC R23,R30
220 F421 BNE 0x0225
221 01B5 MOVW R22,R10
222 5860 SUBI R22,0x80
223 4F7F SBCI R23,0xFF
224 C003 RJMP 0x0228
(0192) else row = 0xC0 + col;
225 01B5 MOVW R22,R10
226 5460 SUBI R22,0x40
227 4F7F SBCI R23,0xFF
(0193) writecom(row);
228 2F06 MOV R16,R22
229 DF11 RCALL _writecom
(0194) if (num<=0 | num>9) num =0x30;
22A 3040 CPI R20,0
22B 0745 CPC R20,R21
22C F421 BNE 0x0231
22D E081 LDI R24,1
22E E090 LDI R25,0
22F 015C MOVW R10,R24
230 C002 RJMP 0x0233
231 24AA CLR R10
232 24BB CLR R11
233 E089 LDI R24,0x9
234 E090 LDI R25,0
235 1784 CP R24,R20
236 0795 CPC R25,R21
237 F418 BCC 0x023B
238 E061 LDI R22,1
239 E070 LDI R23,0
23A C002 RJMP 0x023D
23B 2766 CLR R22
23C 2777 CLR R23
23D 0115 MOVW R2,R10
23E 2A26 OR R2,R22
23F 2A37 OR R3,R23
240 2022 TST R2
241 F411 BNE 0x0244
242 2033 TST R3
243 F019 BEQ 0x0247
244 E340 LDI R20,0x30
245 E050 LDI R21,0
246 C002 RJMP 0x0249
(0195) else num = 0x30 + num;
247 5D40 SUBI R20,0xD0
248 4F5F SBCI R21,0xFF
(0196)
(0197) PORTA|=(1<<RS);
249 9ADD SBI 0x1B,5
(0198) s_ms(500);
24A EF04 LDI R16,0xF4
24B E011 LDI R17,1
24C DEBA RCALL _s_ms
(0199) PORTA&=~(1<<RW);
24D 98DE CBI 0x1B,6
(0200) s_ms(500);
24E EF04 LDI R16,0xF4
24F E011 LDI R17,1
250 DEB6 RCALL _s_ms
(0201) PORTD = num;
251 BB42 OUT 0x12,R20
(0202) s_ms(500);
252 EF04 LDI R16,0xF4
253 E011 LDI R17,1
254 DEB2 RCALL _s_ms
(0203) PORTA|=(1<<EN);
255 9ADF SBI 0x1B,7
(0204) s_ms(500);
256 EF04 LDI R16,0xF4
257 E011 LDI R17,1
258 DEAE RCALL _s_ms
(0205) PORTA&=~(1<<EN);
259 98DF CBI 0x1B,7
(0206) s_ms(500);
25A EF04 LDI R16,0xF4
25B E011 LDI R17,1
25C DEAA RCALL _s_ms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -