-
Notifications
You must be signed in to change notification settings - Fork 1
/
OLDMANALARM.lst
4116 lines (4115 loc) · 129 KB
/
OLDMANALARM.lst
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Interrupt Vectors
00000 940C 0206 JMP __start|__text_start
00024 940C 0719 JMP _uart0_rx_isr
0003C 940C 077D JMP _uart1_rx_isr
Program Code (text area)
__start|__text_start:
00206 EFCF LDI R28,0xFF
00207 E1D0 LDI R29,0x10
00208 BFCD OUT 0x3D,R28
00209 BFDE OUT 0x3E,R29
0020A 51CE SUBI R28,0x1E
0020B 40D0 SBCI R29,0
0020C EA0A LDI R16,0xAA
0020D 8308 ST Y,R16
0020E 2400 CLR R0
0020F E0E5 LDI R30,5
00210 E0F3 LDI R31,3
00211 E015 LDI R17,5
00212 35E3 CPI R30,0x53
00213 07F1 CPC R31,R17
00214 F011 BEQ 0x0217
00215 9201 ST Z+,R0
00216 CFFB RJMP 0x0212
00217 8300 ST Z,R16
00218 E0E7 LDI R30,7
00219 E0F2 LDI R31,2
0021A E0A0 LDI R26,0
0021B E0B1 LDI R27,1
0021C E014 LDI R17,4
0021D E000 LDI R16,0
0021E BF0B OUT 0x3B,R16
0021F 30EC CPI R30,0xC
00220 07F1 CPC R31,R17
00221 F021 BEQ 0x0226
00222 95C8 LPM
00223 9631 ADIW R30,1
00224 920D ST X+,R0
00225 CFF9 RJMP 0x021F
00226 940E 0263 CALL _main
_exit:
00228 CFFF RJMP _exit
FILE: E:\git\AVR\OldManAlarm\main.c
(0001) //DMAVR-128开发板12864型液晶显示实时时钟驱动程序
(0002) //编译环境 编译环境 ICCAVR 7.16A
(0003) //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
(0004) //作者:阿迪 www.avrgcc.com
(0005) //日期:2010.12.112
(0006)
(0007) //***********************************************************************
(0008) // 包含文件
(0009) //***********************************************************************
(0010)
(0011) #include <string.h>
(0012) #include <stdio.h>
(0013) #include <macros.h>
(0014) #include <AVRdef.h>
(0015) #include <iom128v.h>
(0016) #include "DS18B20.h" //温度传感器
(0017) #include "basic.h" //基础函数
(0018) #include "12864time.h" //DS1302时钟
(0019) #include "LCD.h" //12864LCD显示屏
(0020) #include "USART.h"
(0021) #include "SYN7318.h"
(0022) #include "ESP8266.h"
(0023)
(0024) extern uchar RxCharBuf[16];
(0025) extern uchar RxCharNum, RxBufWr, RxBufRd;
(0026) extern uchar TxCharBuf[128];
(0027) extern uchar TxCharNum,TxStrLen;
(0028)
(0029) extern uchar RxCharBuf_wifi[16];
(0030) extern uchar RxCharNum_wifi, RxBufWr_wifi, RxBufRd_wifi;
(0031) extern uchar TxCharBuf_wifi[128];
(0032) extern uchar TxCharNum_wifi,TxStrLen_wifi;
(0033)
(0034)
(0035) //****************************************************************
(0036) // 显示欢迎信息
(0037) //****************************************************************
(0038) void welcomeDisplay(void)
(0039) {
(0040) DisplayCgrom(0x90,"欢迎使用独居老人");
_welcomeDisplay:
00229 E52D LDI R18,0x5D
0022A E031 LDI R19,1
0022B E900 LDI R16,0x90
0022C 940E 06B5 CALL _DisplayCgrom
(0041) delay_nms(100);
0022E E604 LDI R16,0x64
0022F E010 LDI R17,0
00230 940E 0637 CALL _delay_nms
(0042) DisplayCgrom(0x8a,"预警系统");
00232 E524 LDI R18,0x54
00233 E031 LDI R19,1
00234 E80A LDI R16,0x8A
00235 940E 06B5 CALL _DisplayCgrom
(0043) delay_nms(3000);
00237 EB08 LDI R16,0xB8
00238 E01B LDI R17,0xB
00239 940E 0637 CALL _delay_nms
(0044) LCD_clear(); //清屏
0023B 940C 06AF JMP _LCD_clear
(0045) }
(0046)
(0047) //****************************************************************
(0048) // 显示语音模块初始化信息
(0049) //****************************************************************
(0050) void syn7318InitDisplay(void)
(0051) {
(0052) DisplayCgrom(0x90,"语音模块");
_syn7318InitDisplay:
0023D E42B LDI R18,0x4B
0023E E031 LDI R19,1
0023F E900 LDI R16,0x90
00240 940E 06B5 CALL _DisplayCgrom
(0053) delay_nms(100);
00242 E604 LDI R16,0x64
00243 E010 LDI R17,0
00244 940E 0637 CALL _delay_nms
(0054) DisplayCgrom(0x8a,"初始化中");
00246 E422 LDI R18,0x42
00247 E031 LDI R19,1
00248 E80A LDI R16,0x8A
00249 940E 06B5 CALL _DisplayCgrom
(0055) delay_nms(3000);
0024B EB08 LDI R16,0xB8
0024C E01B LDI R17,0xB
0024D 940E 0637 CALL _delay_nms
(0056) LCD_clear(); //清屏
0024F 940C 06AF JMP _LCD_clear
(0057) }
(0058)
(0059)
(0060) //call this routine to initialize all peripherals
(0061) void init_devices(void)
(0062) {
(0063) //stop errant interrupts until set up
(0064) CLI(); //disable all interrupts
_init_devices:
00251 94F8 BCLR 7
(0065) XDIV = 0x00; //xtal divider
00252 2422 CLR R2
00253 BE2C OUT 0x3C,R2
(0066) XMCRA = 0x00; //external memory
00254 9220 006D STS 0x6D,R2
(0067) UART0_Init();
00256 940E 06EC CALL _UART0_Init
(0068) //UART1_Init();
(0069) MCUCR = 0x00;
00258 2422 CLR R2
00259 BE25 OUT 0x35,R2
(0070) EICRA = 0x00; //extended ext ints
0025A 9220 006A STS 0x6A,R2
(0071) EICRB = 0x00; //extended ext ints
0025C BE2A OUT 0x3A,R2
(0072) EIMSK = 0x00;
0025D BE29 OUT 0x39,R2
(0073) TIMSK = 0x00; //timer interrupt sources
0025E BE27 OUT 0x37,R2
(0074) ETIMSK = 0x00; //extended timer interrupt sources
0025F 9220 007D STS 0x7D,R2
(0075) SEI(); //re-enable interrupts
00261 9478 BSET 7
00262 9508 RET
(0076) //all peripherals are now initialized
(0077) }
(0078)
(0079) //***********************************************************************
(0080) // 主程序
(0081) //***********************************************************************
(0082) void main(void)
(0083) {
(0084) // volatile unsigned char temp;
(0085) uchar u8temp;
(0086) uchar command;
(0087) uchar temp;
(0088)
(0089) system_init(); //系统初始化,设置IO口属性
_main:
temp --> R20
command --> R10
u8temp --> R20
00263 940E 0646 CALL _system_init
(0090) delay_nms(100); //延时100ms
00265 E604 LDI R16,0x64
00266 E010 LDI R17,0
00267 940E 0637 CALL _delay_nms
(0091) LCD_init(); //液晶参数初始化设置
00269 940E 06CF CALL _LCD_init
(0092) LCD_clear(); //清屏
0026B 940E 06AF CALL _LCD_clear
(0093)
(0094) ds1302_init(); //DS1302初始化
0026D 940E 03D7 CALL _ds1302_init
(0095) DS18B20_Reset(); //复位D18B20
0026F 940E 04F9 CALL _DS18B20_Reset
(0096) delay_nms(10);
00271 E00A LDI R16,0xA
00272 E010 LDI R17,0
00273 940E 0637 CALL _delay_nms
(0097) //ds1302_write_time(); //向DS1302写初始数据,如年月和时间等
(0098) welcomeDisplay();
00275 DFB3 RCALL _welcomeDisplay
(0099) init_devices();
00276 DFDA RCALL _init_devices
(0100)
(0101) SYN7318_init(); //SYN7318语音识别模块 初始化
00277 940E 079E CALL _SYN7318_init
(0102) syn7318InitDisplay();
00279 DFC3 RCALL _syn7318InitDisplay
(0103)
(0104)
(0105) //updateWords(); //SYN7318语音识别模块 词典更新
(0106) //SYN7318_welcome();
(0107)
(0108) updateWords();
0027A 940E 08DD CALL _updateWords
0027C C0C0 RJMP 0x033D
(0109)
(0110) while(1) {
(0111)
(0112) displayDateTime();
0027D 940E 0411 CALL _displayDateTime
(0113) LCD_write_temperature();
0027F 940E 05B2 CALL _LCD_write_temperature
00281 C021 RJMP 0x02A3
(0114)
(0115) //wifi
(0116) while(RxBufWr_wifi != RxBufRd_wifi) {
(0117) LCD_write_com(0x98);
00282 E908 LDI R16,0x98
00283 940E 065F CALL _LCD_write_com
(0118) delay_nms(2);
00285 E002 LDI R16,2
00286 E010 LDI R17,0
00287 940E 0637 CALL _delay_nms
(0119) u8temp = RxCharBuf_wifi[RxBufRd_wifi];
00289 E182 LDI R24,0x12
0028A E093 LDI R25,3
0028B 91E0 030F LDS R30,RxBufRd_wifi
0028D 27FF CLR R31
0028E 0FE8 ADD R30,R24
0028F 1FF9 ADC R31,R25
00290 8140 LD R20,Z
(0120) RxBufRd_wifi++;
00291 9180 030F LDS R24,RxBufRd_wifi
00293 5F8F SUBI R24,0xFF
00294 9380 030F STS RxBufRd_wifi,R24
(0121) RxBufRd_wifi &= 0x0f;
00296 708F ANDI R24,0xF
00297 9380 030F STS RxBufRd_wifi,R24
(0122) if(u8temp == 0x0d) break;
00299 304D CPI R20,0xD
0029A F409 BNE 0x029C
0029B C00D RJMP 0x02A9
(0123) LCD_write_data(u8temp);
0029C 2F04 MOV R16,R20
0029D 940E 067C CALL _LCD_write_data
(0124) delay_nms(2);
0029F E002 LDI R16,2
002A0 E010 LDI R17,0
002A1 940E 0637 CALL _delay_nms
002A3 9020 030F LDS R2,RxBufRd_wifi
002A5 9030 0310 LDS R3,RxBufWr_wifi
002A7 1432 CP R3,R2
002A8 F6C9 BNE 0x0282
(0125) //DisplayCgrom(0x98, &u8temp);
(0126) }
(0127)
(0128)
(0129) startRecognition();
002A9 940E 0966 CALL _startRecognition
(0130) command = checkSendReturn();
002AB 940E 07C2 CALL _checkSendReturn
002AD 2EA0 MOV R10,R16
(0131)
(0132) switch(command){
002AE 2D4A MOV R20,R10
002AF 2755 CLR R21
002B0 3041 CPI R20,1
002B1 E0E0 LDI R30,0
002B2 075E CPC R21,R30
002B3 F409 BNE 0x02B5
002B4 C04D RJMP 0x0302
002B5 3042 CPI R20,2
002B6 E0E0 LDI R30,0
002B7 075E CPC R21,R30
002B8 F409 BNE 0x02BA
002B9 C054 RJMP 0x030E
002BA 3043 CPI R20,3
002BB E0E0 LDI R30,0
002BC 075E CPC R21,R30
002BD F409 BNE 0x02BF
002BE C07E RJMP 0x033D
002BF 3044 CPI R20,4
002C0 E0E0 LDI R30,0
002C1 075E CPC R21,R30
002C2 F0B9 BEQ 0x02DA
002C3 3045 CPI R20,5
002C4 E0E0 LDI R30,0
002C5 075E CPC R21,R30
002C6 F0E9 BEQ 0x02E4
002C7 3046 CPI R20,6
002C8 E0E0 LDI R30,0
002C9 075E CPC R21,R30
002CA F169 BEQ 0x02F8
002CB 3047 CPI R20,7
002CC E0E0 LDI R30,0
002CD 075E CPC R21,R30
002CE F0F9 BEQ 0x02EE
002CF 3041 CPI R20,1
002D0 E0E0 LDI R30,0
002D1 075E CPC R21,R30
002D2 F40C BGE 0x02D4
002D3 C04E RJMP 0x0322
002D4 3644 CPI R20,0x64
002D5 E0E0 LDI R30,0
002D6 075E CPC R21,R30
002D7 F409 BNE 0x02D9
002D8 C03F RJMP 0x0318
002D9 C048 RJMP 0x0322
(0133) case OVER_TIME :
(0134) break;
(0135) case 0x04 :
(0136) //SYN7318_Error();
(0137) DisplayCgrom(0x88,"语音超时");
002DA E329 LDI R18,0x39
002DB E031 LDI R19,1
002DC E808 LDI R16,0x88
002DD 940E 06B5 CALL _DisplayCgrom
(0138) delay_nms(2);
002DF E002 LDI R16,2
002E0 E010 LDI R17,0
002E1 940E 0637 CALL _delay_nms
(0139) break;
002E3 C059 RJMP 0x033D
(0140) case 0x05 :
(0141) //SYN7318_Error();
(0142) DisplayCgrom(0x88,"识别拒识");
002E4 E320 LDI R18,0x30
002E5 E031 LDI R19,1
002E6 E808 LDI R16,0x88
002E7 940E 06B5 CALL _DisplayCgrom
(0143) delay_nms(2);
002E9 E002 LDI R16,2
002EA E010 LDI R17,0
002EB 940E 0637 CALL _delay_nms
(0144) break;
002ED C04F RJMP 0x033D
(0145) case 0x07 :
(0146) //SYN7318_Error();
(0147) DisplayCgrom(0x88,"识别拒识一");
002EE E225 LDI R18,0x25
002EF E031 LDI R19,1
002F0 E808 LDI R16,0x88
002F1 940E 06B5 CALL _DisplayCgrom
(0148) delay_nms(2);
002F3 E002 LDI R16,2
002F4 E010 LDI R17,0
002F5 940E 0637 CALL _delay_nms
(0149) break;
002F7 C045 RJMP 0x033D
(0150) case 0x06 :
(0151) //SYN7318_Error();
(0152) DisplayCgrom(0x88,"识别内部错误");
002F8 E128 LDI R18,0x18
002F9 E031 LDI R19,1
002FA E808 LDI R16,0x88
002FB 940E 06B5 CALL _DisplayCgrom
(0153) delay_nms(2);
002FD E002 LDI R16,2
002FE E010 LDI R17,0
002FF 940E 0637 CALL _delay_nms
(0154) break;
00301 C03B RJMP 0x033D
(0155) case 1 :
(0156) DisplayCgrom(0x8C,"救命");
00302 E123 LDI R18,0x13
00303 E031 LDI R19,1
00304 E80C LDI R16,0x8C
00305 940E 06B5 CALL _DisplayCgrom
(0157) delay_nms(2);
00307 E002 LDI R16,2
00308 E010 LDI R17,0
00309 940E 0637 CALL _delay_nms
(0158) //wifi_SENDMSG();
(0159) wifi_Restart();
0030B 940E 0983 CALL _wifi_Restart
(0160) break;
0030D C02F RJMP 0x033D
(0161) case 2 :
(0162) DisplayCgrom(0x8C,"哎呦");
0030E E02E LDI R18,0xE
0030F E031 LDI R19,1
00310 E80C LDI R16,0x8C
00311 940E 06B5 CALL _DisplayCgrom
(0163) delay_nms(2);
00313 E002 LDI R16,2
00314 E010 LDI R17,0
00315 940E 0637 CALL _delay_nms
(0164) break;
00317 C025 RJMP 0x033D
(0165) case 100 :
(0166) DisplayCgrom(0x8C,"温度");
00318 E029 LDI R18,0x9
00319 E031 LDI R19,1
0031A E80C LDI R16,0x8C
0031B 940E 06B5 CALL _DisplayCgrom
(0167) delay_nms(2);
0031D E002 LDI R16,2
0031E E010 LDI R17,0
0031F 940E 0637 CALL _delay_nms
(0168) break;
00321 C01B RJMP 0x033D
(0169) default :
(0170) DisplayCgrom(0x8C,"识别成功");
00322 E020 LDI R18,0
00323 E031 LDI R19,1
00324 E80C LDI R16,0x8C
00325 940E 06B5 CALL _DisplayCgrom
(0171) delay_nms(2);
00327 E002 LDI R16,2
00328 E010 LDI R17,0
00329 940E 0637 CALL _delay_nms
(0172) LCD_write_com(0x8C);
0032B E80C LDI R16,0x8C
0032C 940E 065F CALL _LCD_write_com
(0173) delay_nms(2);
0032E E002 LDI R16,2
0032F E010 LDI R17,0
00330 940E 0637 CALL _delay_nms
(0174) temp = (command >> 4) + '0'; //在LCD上写要显示的数据
00332 2D4A MOV R20,R10
00333 9542 SWAP R20
00334 704F ANDI R20,0xF
00335 5D40 SUBI R20,0xD0
(0175) LCD_write_data(temp);
00336 2F04 MOV R16,R20
00337 940E 067C CALL _LCD_write_data
(0176) delay_nms(2);
00339 E002 LDI R16,2
0033A E010 LDI R17,0
0033B 940E 0637 CALL _delay_nms
0033D CF3F RJMP 0x027D
0033E 9508 RET
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
0033F 934A ST -Y,R20
FILE: E:\git\AVR\OldManAlarm\12864time.c
(0001) //DMAVR-128开发板12864型液晶显示实时时钟驱动程序
(0002) //编译环境 编译环境 ICCAVR 7.16A
(0003) //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
(0004) //作者:阿迪 www.avrgcc.com
(0005) //日期:2010.12.112
(0006)
(0007) //***********************************************************************
(0008) // 包含文件
(0009) //***********************************************************************
(0010)
(0011)
(0012)
(0013) #include <iom128v.h>
(0014) #include "12864time.h"
(0015) #include "basic.h"
(0016) #include "LCD.h"
(0017)
(0018) volatile unsigned char time_buf[8] = {0x20,0x14,0x10,0x14,0x22,0x54,0x59,0x05};
(0019)
(0020) //***********************************************************************
(0021) //向DS1302写入一字节数据
(0022) //***********************************************************************
(0023) void ds1302_write_byte(unsigned char addr, unsigned char d)
(0024) {
(0025)
(0026) unsigned char i;
(0027) RST_SET; //启动DS1302总线
00340 9A1F SBI 0x03,7
(0028)
(0029) //写入目标地址:addr
(0030) IO_OUT;
00341 9A16 SBI 0x02,6
(0031) addr = addr & 0xFE; //最低位置零
00342 7F0E ANDI R16,0xFE
(0032) for (i = 0; i < 8; i ++) {
00343 2744 CLR R20
00344 C009 RJMP 0x034E
(0033) if (addr & 0x01) {
00345 FF00 SBRS R16,0
00346 C002 RJMP 0x0349
(0034) IO_SET;
00347 9A1E SBI 0x03,6
(0035) }
00348 C001 RJMP 0x034A
(0036) else {
(0037) IO_CLR;
00349 981E CBI 0x03,6
(0038) }
(0039) SCK_SET;
0034A 9A1D SBI 0x03,5
(0040) SCK_CLR;
0034B 981D CBI 0x03,5
(0041) addr = addr >> 1;
0034C 9506 LSR R16
0034D 9543 INC R20
0034E 3048 CPI R20,0x8
0034F F3A8 BCS 0x0345
(0042) }
(0043)
(0044) //写入数据:d
(0045) IO_OUT;
00350 9A16 SBI 0x02,6
(0046) for (i = 0; i < 8; i ++) {
00351 2744 CLR R20
00352 C009 RJMP 0x035C
(0047) if (d & 0x01) {
00353 FF20 SBRS R18,0
00354 C002 RJMP 0x0357
(0048) IO_SET;
00355 9A1E SBI 0x03,6
(0049) }
00356 C001 RJMP 0x0358
(0050) else {
(0051) IO_CLR;
00357 981E CBI 0x03,6
(0052) }
(0053) SCK_SET;
00358 9A1D SBI 0x03,5
(0054) SCK_CLR;
00359 981D CBI 0x03,5
(0055) d = d >> 1;
0035A 9526 LSR R18
0035B 9543 INC R20
0035C 3048 CPI R20,0x8
0035D F3A8 BCS 0x0353
(0056) }
(0057) RST_CLR; //停止DS1302总线
0035E 981F CBI 0x03,7
0035F 9149 LD R20,Y+
00360 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
00361 934A ST -Y,R20
00362 936A ST -Y,R22
(0058) }
(0059)
(0060) //***********************************************************************
(0061) // 从DS1302读出一字节数据
(0062) //***********************************************************************
(0063) unsigned char ds1302_read_byte(unsigned char addr)
(0064) {
(0065)
(0066) unsigned char i;
(0067) unsigned char temp;
(0068) RST_SET; //启动DS1302总线
00363 9A1F SBI 0x03,7
(0069)
(0070) //写入目标地址:addr
(0071) IO_OUT;
00364 9A16 SBI 0x02,6
(0072) addr = addr | 0x01; //最低位置高
00365 6001 ORI R16,1
(0073) for (i = 0; i < 8; i ++) {
00366 2766 CLR R22
00367 C009 RJMP 0x0371
(0074) if (addr & 0x01) {
00368 FF00 SBRS R16,0
00369 C002 RJMP 0x036C
(0075) IO_SET;
0036A 9A1E SBI 0x03,6
(0076) }
0036B C001 RJMP 0x036D
(0077) else {
(0078) IO_CLR;
0036C 981E CBI 0x03,6
(0079) }
(0080) SCK_SET;
0036D 9A1D SBI 0x03,5
(0081) SCK_CLR;
0036E 981D CBI 0x03,5
(0082) addr = addr >> 1;
0036F 9506 LSR R16
00370 9563 INC R22
00371 3068 CPI R22,0x8
00372 F3A8 BCS 0x0368
(0083) }
(0084)
(0085) /*输出数据:temp*/
(0086) IO_IN;
00373 9816 CBI 0x02,6
(0087) for (i = 0; i < 8; i ++) {
00374 2766 CLR R22
00375 C009 RJMP 0x037F
(0088) temp = temp >> 1;
00376 9546 LSR R20
(0089) if (IO_R) {
00377 9B0E SBIS 0x01,6
00378 C002 RJMP 0x037B
(0090) temp |= 0x80;
00379 6840 ORI R20,0x80
(0091) }
0037A C001 RJMP 0x037C
(0092) else {
(0093) temp &= 0x7F;
0037B 774F ANDI R20,0x7F
(0094) }
(0095) SCK_SET;
0037C 9A1D SBI 0x03,5
(0096) SCK_CLR;
0037D 981D CBI 0x03,5
0037E 9563 INC R22
0037F 3068 CPI R22,0x8
00380 F3A8 BCS 0x0376
(0097) }
(0098)
(0099) RST_CLR; //停止DS1302总线
00381 981F CBI 0x03,7
(0100) return temp;
00382 2F04 MOV R16,R20
00383 9169 LD R22,Y+
00384 9149 LD R20,Y+
00385 9508 RET
(0101) }
(0102)
(0103) //***********************************************************************
(0104) // 向DS302写入时钟数据
(0105) //***********************************************************************
(0106)
(0107) void ds1302_write_time(void)
(0108) {
(0109)
(0110) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
00386 2722 CLR R18
00387 E80E LDI R16,0x8E
00388 DFB6 RCALL _ds1302_write_byte
(0111) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
00389 E820 LDI R18,0x80
0038A E800 LDI R16,0x80
0038B DFB3 RCALL _ds1302_write_byte
(0112) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0113) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
0038C 9120 016F LDS R18,time_buf+1
0038E E80C LDI R16,0x8C
0038F DFAF RCALL _ds1302_write_byte
(0114) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
00390 9120 0170 LDS R18,time_buf+2
00392 E808 LDI R16,0x88
00393 DFAB RCALL _ds1302_write_byte
(0115) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
00394 9120 0171 LDS R18,time_buf+3
00396 E806 LDI R16,0x86
00397 DFA7 RCALL _ds1302_write_byte
(0116) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00398 9120 0175 LDS R18,time_buf+7
0039A E80A LDI R16,0x8A
0039B DFA3 RCALL _ds1302_write_byte
(0117) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
0039C 9120 0172 LDS R18,time_buf+4
0039E E804 LDI R16,0x84
0039F DF9F RCALL _ds1302_write_byte
(0118) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
003A0 9120 0173 LDS R18,time_buf+5
003A2 E802 LDI R16,0x82
003A3 DF9B RCALL _ds1302_write_byte
(0119) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
003A4 9120 0174 LDS R18,time_buf+6
003A6 E800 LDI R16,0x80
003A7 DF97 RCALL _ds1302_write_byte
(0120) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
003A8 9120 0175 LDS R18,time_buf+7
003AA E80A LDI R16,0x8A
003AB DF93 RCALL _ds1302_write_byte
(0121) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
003AC E820 LDI R18,0x80
003AD E80E LDI R16,0x8E
003AE CF90 RJMP _ds1302_write_byte
_ds1302_read_time:
003AF 92AA ST -Y,R10
003B0 934A ST -Y,R20
(0122) }
(0123)
(0124) //***********************************************************************
(0125) // 从DS302读出时钟数据
(0126) //***********************************************************************
(0127)
(0128) void ds1302_read_time(void)
(0129) {
(0130)
(0131) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
003B1 E80C LDI R16,0x8C
003B2 DFAE RCALL _ds1302_read_byte
003B3 9300 016F STS time_buf+1,R16
(0132) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
003B5 E808 LDI R16,0x88
003B6 DFAA RCALL _ds1302_read_byte
003B7 9300 0170 STS time_buf+2,R16
(0133) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
003B9 E806 LDI R16,0x86
003BA DFA6 RCALL _ds1302_read_byte
003BB 2EA0 MOV R10,R16
003BC 92A0 0171 STS time_buf+3,R10
(0134) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
003BE E804 LDI R16,0x84
003BF DFA1 RCALL _ds1302_read_byte
003C0 2EA0 MOV R10,R16
003C1 92A0 0172 STS time_buf+4,R10
(0135) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
003C3 E802 LDI R16,0x82
003C4 DF9C RCALL _ds1302_read_byte
003C5 2EA0 MOV R10,R16
003C6 92A0 0173 STS time_buf+5,R10
(0136) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
003C8 E800 LDI R16,0x80
003C9 DF97 RCALL _ds1302_read_byte
003CA 2F40 MOV R20,R16
003CB 2F84 MOV R24,R20
003CC 778F ANDI R24,0x7F
003CD 9380 0174 STS time_buf+6,R24
(0137) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
003CF E80A LDI R16,0x8A
003D0 DF90 RCALL _ds1302_read_byte
003D1 2EA0 MOV R10,R16
003D2 92A0 0175 STS time_buf+7,R10
003D4 9149 LD R20,Y+
003D5 90A9 LD R10,Y+
003D6 9508 RET
(0138) }
(0139)
(0140) //***********************************************************************
(0141) // DS302初始化函数
(0142) //***********************************************************************
(0143)
(0144) void ds1302_init(void)
(0145) {
(0146)
(0147) RST_CLR; //RST脚置低
_ds1302_init:
003D7 981F CBI 0x03,7
(0148) SCK_CLR; //SCK脚置低
003D8 981D CBI 0x03,5
(0149) RST_OUT; //RST脚设置为输出
003D9 9A17 SBI 0x02,7
(0150) SCK_OUT; //SCK脚设置为输出
003DA 9A15 SBI 0x02,5
003DB 9508 RET
_dayToChina:
day --> R20
003DC 934A ST -Y,R20
003DD 2F40 MOV R20,R16
(0151) }
(0152)
(0153)
(0154)
(0155) //***********************************************************************
(0156) // 数字周转中文周
(0157) //***********************************************************************
(0158) void dayToChina(unsigned char day)
(0159) {
(0160) if(day == 0x01)
003DE 3041 CPI R20,1
003DF F429 BNE 0x03E5
(0161) DisplayCgrom(0x86,"周一");
003E0 E924 LDI R18,0x94
003E1 E031 LDI R19,1
003E2 E806 LDI R16,0x86
003E3 940E 06B5 CALL _DisplayCgrom
(0162) if(day == 0x02)
003E5 3042 CPI R20,2
003E6 F429 BNE 0x03EC
(0163) DisplayCgrom(0x86,"周二");
003E7 E82F LDI R18,0x8F
003E8 E031 LDI R19,1
003E9 E806 LDI R16,0x86
003EA 940E 06B5 CALL _DisplayCgrom
(0164) if(day == 0x03)
003EC 3043 CPI R20,3
003ED F429 BNE 0x03F3
(0165) DisplayCgrom(0x86,"周三");
003EE E82A LDI R18,0x8A
003EF E031 LDI R19,1
003F0 E806 LDI R16,0x86
003F1 940E 06B5 CALL _DisplayCgrom
(0166) if(day == 0x04)
003F3 3044 CPI R20,4
003F4 F429 BNE 0x03FA
(0167) DisplayCgrom(0x86,"周四");
003F5 E825 LDI R18,0x85
003F6 E031 LDI R19,1
003F7 E806 LDI R16,0x86
003F8 940E 06B5 CALL _DisplayCgrom
(0168) if(day == 0x05)
003FA 3045 CPI R20,5
003FB F429 BNE 0x0401
(0169) DisplayCgrom(0x86,"周五");
003FC E820 LDI R18,0x80
003FD E031 LDI R19,1
003FE E806 LDI R16,0x86
003FF 940E 06B5 CALL _DisplayCgrom
(0170) if(day == 0x06)
00401 3046 CPI R20,6
00402 F429 BNE 0x0408
(0171) DisplayCgrom(0x86,"周六");
00403 E72B LDI R18,0x7B
00404 E031 LDI R19,1
00405 E806 LDI R16,0x86
00406 940E 06B5 CALL _DisplayCgrom
(0172) if(day == 0x07)
00408 3047 CPI R20,7
00409 F429 BNE 0x040F
(0173) DisplayCgrom(0x86,"周日");
0040A E726 LDI R18,0x76
0040B E031 LDI R19,1
0040C E806 LDI R16,0x86
0040D 940E 06B5 CALL _DisplayCgrom
0040F 9149 LD R20,Y+
00410 9508 RET
_displayDateTime:
temp --> Y,+0
00411 9721 SBIW R28,1
(0174) }
(0175)
(0176) //***********************************************************************
(0177) // 显示系统时间 年月日、星期
(0178) //***********************************************************************
(0179) void displayDateTime(void)
(0180) {
(0181) volatile unsigned char temp;
(0182) delay_nms(200);
00412 EC08 LDI R16,0xC8
00413 E010 LDI R17,0
00414 940E 0637 CALL _delay_nms
(0183) ds1302_read_time(); //读DS1302数据
00416 DF98 RCALL _ds1302_read_time
(0184)
(0185) LCD_write_com(0x80);
00417 E800 LDI R16,0x80
00418 940E 065F CALL _LCD_write_com
(0186) delay_nms(2);
0041A E002 LDI R16,2
0041B E010 LDI R17,0
0041C 940E 0637 CALL _delay_nms
(0187) temp = (time_buf[0] >> 4) + '0'; //在LCD上写要显示的数据
0041E 9180 016E LDS R24,time_buf
00420 9582 SWAP R24
00421 708F ANDI R24,0xF
00422 5D80 SUBI R24,0xD0
00423 8388 ST Y,R24
(0188) LCD_write_data(temp);
00424 2F08 MOV R16,R24
00425 940E 067C CALL _LCD_write_data
(0189) delay_nms(2);
00427 E002 LDI R16,2
00428 E010 LDI R17,0
00429 940E 0637 CALL _delay_nms
(0190) temp = (time_buf[0] & 0x0F) + '0';
0042B 9180 016E LDS R24,time_buf
0042D 708F ANDI R24,0xF
0042E 5D80 SUBI R24,0xD0
0042F 8388 ST Y,R24
(0191) LCD_write_data(temp);
00430 2F08 MOV R16,R24
00431 940E 067C CALL _LCD_write_data
(0192) delay_nms(2);
00433 E002 LDI R16,2
00434 E010 LDI R17,0
00435 940E 0637 CALL _delay_nms
(0193) temp = (time_buf[1] >> 4) + '0';
00437 9180 016F LDS R24,time_buf+1
00439 9582 SWAP R24
0043A 708F ANDI R24,0xF
0043B 5D80 SUBI R24,0xD0
0043C 8388 ST Y,R24
(0194) LCD_write_data(temp);
0043D 2F08 MOV R16,R24
0043E 940E 067C CALL _LCD_write_data
(0195) delay_nms(2);
00440 E002 LDI R16,2
00441 E010 LDI R17,0
00442 940E 0637 CALL _delay_nms
(0196)
(0197) temp = (time_buf[1] & 0x0F) + '0';
00444 9180 016F LDS R24,time_buf+1
00446 708F ANDI R24,0xF
00447 5D80 SUBI R24,0xD0
00448 8388 ST Y,R24
(0198) LCD_write_data(temp);
00449 2F08 MOV R16,R24
0044A 940E 067C CALL _LCD_write_data
(0199) delay_nms(2);
0044C E002 LDI R16,2
0044D E010 LDI R17,0
0044E 940E 0637 CALL _delay_nms
(0200) LCD_write_data('-');
00450 E20D LDI R16,0x2D
00451 940E 067C CALL _LCD_write_data
(0201) delay_nms(2);
00453 E002 LDI R16,2
00454 E010 LDI R17,0
00455 940E 0637 CALL _delay_nms
(0202)
(0203) temp = (time_buf[2] >> 4) + '0';
00457 9180 0170 LDS R24,time_buf+2
00459 9582 SWAP R24
0045A 708F ANDI R24,0xF
0045B 5D80 SUBI R24,0xD0
0045C 8388 ST Y,R24
(0204) LCD_write_data(temp);
0045D 2F08 MOV R16,R24
0045E 940E 067C CALL _LCD_write_data
(0205) delay_nms(2);
00460 E002 LDI R16,2
00461 E010 LDI R17,0
00462 940E 0637 CALL _delay_nms
(0206) temp = (time_buf[2] & 0x0F) + '0';
00464 9180 0170 LDS R24,time_buf+2
00466 708F ANDI R24,0xF
00467 5D80 SUBI R24,0xD0
00468 8388 ST Y,R24
(0207) LCD_write_data(temp);
00469 2F08 MOV R16,R24
0046A 940E 067C CALL _LCD_write_data
(0208) delay_nms(2);
0046C E002 LDI R16,2
0046D E010 LDI R17,0
0046E 940E 0637 CALL _delay_nms
(0209) LCD_write_data('-');
00470 E20D LDI R16,0x2D
00471 940E 067C CALL _LCD_write_data
(0210) delay_nms(2);
00473 E002 LDI R16,2
00474 E010 LDI R17,0
00475 940E 0637 CALL _delay_nms
(0211)
(0212) temp = (time_buf[3] >> 4) + '0';
00477 9180 0171 LDS R24,time_buf+3
00479 9582 SWAP R24
0047A 708F ANDI R24,0xF
0047B 5D80 SUBI R24,0xD0
0047C 8388 ST Y,R24
(0213) LCD_write_data(temp);
0047D 2F08 MOV R16,R24
0047E 940E 067C CALL _LCD_write_data
(0214) delay_nms(2);
00480 E002 LDI R16,2
00481 E010 LDI R17,0
00482 940E 0637 CALL _delay_nms
(0215) temp = (time_buf[3] & 0x0F) + '0';
00484 9180 0171 LDS R24,time_buf+3
00486 708F ANDI R24,0xF
00487 5D80 SUBI R24,0xD0
00488 8388 ST Y,R24
(0216) LCD_write_data(temp);
00489 2F08 MOV R16,R24
0048A 940E 067C CALL _LCD_write_data
(0217) delay_nms(2);
0048C E002 LDI R16,2
0048D E010 LDI R17,0
0048E 940E 0637 CALL _delay_nms
(0218)
(0219) //显示星期
(0220) dayToChina(time_buf[7]);
00490 9100 0175 LDS R16,time_buf+7
00492 DF49 RCALL _dayToChina
(0221) delay_nms(2);
00493 E002 LDI R16,2
00494 E010 LDI R17,0
00495 940E 0637 CALL _delay_nms
(0222)
(0223)
(0224) LCD_write_com(0x90);
00497 E900 LDI R16,0x90
00498 940E 065F CALL _LCD_write_com
(0225) delay_nms(5);
0049A E005 LDI R16,5
0049B E010 LDI R17,0
0049C 940E 0637 CALL _delay_nms
(0226)
(0227) temp = (time_buf[4] >> 4) + '0';
0049E 9180 0172 LDS R24,time_buf+4
004A0 9582 SWAP R24
004A1 708F ANDI R24,0xF
004A2 5D80 SUBI R24,0xD0
004A3 8388 ST Y,R24
(0228) LCD_write_data(temp);
004A4 2F08 MOV R16,R24
004A5 940E 067C CALL _LCD_write_data
(0229) delay_nms(2);
004A7 E002 LDI R16,2
004A8 E010 LDI R17,0
004A9 940E 0637 CALL _delay_nms
(0230) temp = (time_buf[4] & 0x0F) + '0';
004AB 9180 0172 LDS R24,time_buf+4
004AD 708F ANDI R24,0xF
004AE 5D80 SUBI R24,0xD0
004AF 8388 ST Y,R24