📄 ds1302_18b20_1602.lst
字号:
(0162) }
(0163) /************************************************
(0164) 函 数 名:Write_1
(0165) 功 能:写一个Bit到DS18B20
(0166) 入口参数:无
(0167) 出口参数:无
(0168) 修改日期:2007.02.16
(0169) ************************************************/
(0170) void Write_1(void)
(0171) {
(0172) Set_low(); //设置成输出模式
_Write_1:
28D 9A8F SBI 0x11,7
28E 9897 CBI 0x12,7
(0173) Delay_us(4);
28F E004 LDI R16,4
290 E010 LDI R17,0
291 DF9E RCALL _Delay_us
(0174) Set_high();
292 9A8F SBI 0x11,7
293 9A97 SBI 0x12,7
(0175) Delay_us(76);
294 E40C LDI R16,0x4C
295 E010 LDI R17,0
296 DF99 RCALL _Delay_us
297 9508 RET
(0176) }
(0177) /**********************************************
(0178) 函 数 名:Write_0
(0179) 功 能:写一个Bit到DS18B20
(0180) 入口参数:无
(0181) 出口参数:无
(0182) 修改日期:2007.02.16
(0183) **********************************************/
(0184) void Write_0(void)
(0185) {
(0186) Set_low();
_Write_0:
298 9A8F SBI 0x11,7
299 9897 CBI 0x12,7
(0187) Delay_us(80);
29A E500 LDI R16,0x50
29B E010 LDI R17,0
29C DF93 RCALL _Delay_us
(0188) Set_high();
29D 9A8F SBI 0x11,7
29E 9A97 SBI 0x12,7
29F 9508 RET
_main:
i --> R20
2A0 9721 SBIW R28,1
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\DS1302_Mega16.c
(0001) /****************************************
(0002) 工 程:DS1302实时时钟+DS18B20+1602液晶6线显示
(0003) 创建日期:2007年3月30日
(0004) 修改日期:2007年3月31日
(0005) 创 建 人:朱海峰
(0006) 邮 箱:ntzhf100@163.com
(0007) Q Q: 543376422
(0008) *****************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include "def.h"
(0012) #include "LCD_1602_4wires.h"
(0013) #include "DS18B20.h"
(0014) /******************************************
(0015) PIN DEFINE:
(0016) /RST PD6
(0017) SCLK PD4
(0018) IO PD5
(0019) ******************************************/
(0020) /***************************************************************
(0021) COMMAND/ADDRESS FORMAT
(0022) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
(0023) 1 RAM/CK A4 A3 A2 A1 A0 R/W
(0024) ***************************************************************/
(0025) // second,mintue,hour,date,month,day,year,control,trickle charge,clock burst
(0026) //adderss: 0 1 2 3 4 5 6 7 8 9
(0027) /**************************************************************/
(0028)
(0029) void Time_Init(const uint8_t *p_time);
(0030) void ChipInit(void);
(0031) void InitDS1302(void);
(0032) void TimeSet(void);
(0033) void ReadTime(void);
(0034) void DisplayTime(void);
(0035) void LCD_display_init(void);
(0036) void Display(uint8_t x, uint8_t y, uint8_t g_data);
(0037) void DS18B20(void);
(0038) //RAM_CLOCK=1,RAM操作;
(0039) //RAM_CLOCK=0,时钟日历操作;
(0040) unsigned char Read_DS1302(uint8_t RAM_CLOCK, uint8_t Address);
(0041) void Write(uint8_t RAM_CLOCK, uint8_t Address, uint8_t Dat);
(0042)
(0043) /*******************************************/
(0044) //second,mintue,hour,date,month,day,year
(0045) const uint8_t Time[]={0x10,0x05,0x23,0x25,0x05,0x05,0x07};
(0046) uint8_t Day[7][4]={{"Mon"},{"Tue"},{"Wed"},{"Thu"},{"Fri"},{"Sat"},{"Sun"}};
(0047) const uint8_t Number[]={'0','1','2','3','4','5','6','7','8','9'};
(0048) unsigned char g_year,g_month,g_date,g_day,g_hour,g_mintue,g_second;
(0049) //uint8_t g_tempeature;
(0050) /******************************************/
(0051) void main(void)
(0052) {
(0053) uint8_t i;
(0054) ChipInit();
2A1 D01C RCALL _ChipInit
(0055) LCD_init();
2A2 DDF8 RCALL _LCD_init
(0056) InitDS1302();
2A3 D028 RCALL _InitDS1302
(0057) Write(0,0x07,0x00); //CLOCK操作,控制寄存器,解除写保护
2A4 2422 CLR R2
2A5 8228 STD Y+0,R2
2A6 E027 LDI R18,7
2A7 2700 CLR R16
2A8 D0EE RCALL _Write
(0058) Time_Init(&Time[0]); //初始化时间
2A9 E704 LDI R16,0x74
2AA E010 LDI R17,0
2AB D024 RCALL _Time_Init
(0059) LCD_display_init();
2AC D03A RCALL _LCD_display_init
2AD C00D RJMP 0x02BB
(0060) while(1)
(0061) {
(0062) for(i=0;i<50;i++)
2AE 2744 CLR R20
2AF C009 RJMP 0x02B9
(0063) {
(0064) ReadTime();
2B0 D050 RCALL _ReadTime
(0065) DisplayTime();
2B1 D089 RCALL _DisplayTime
(0066) if(i == 0)
2B2 2344 TST R20
2B3 F409 BNE 0x02B5
(0067) {
(0068) //BEEP_ON();
(0069) DS18B20();
2B4 D14C RCALL _DS18B20
(0070) //BEEP_OFF();
(0071) }
(0072) Delay_nms(100);
2B5 E604 LDI R16,0x64
2B6 E010 LDI R17,0
2B7 DE7C RCALL _Delay_nms
2B8 9543 INC R20
2B9 3342 CPI R20,0x32
2BA F3A8 BCS 0x02B0
2BB CFF2 RJMP 0x02AE
2BC 9621 ADIW R28,1
2BD 9508 RET
(0073) }
(0074) }
(0075) }
(0076) /******************************************/
(0077) void ChipInit(void)
(0078) {
(0079) NOP();
_ChipInit:
2BE 0000 NOP
(0080) /*********************I/O口初始化**************************/
(0081) LCD_DATA_DDR |= LCD_DATA_MASK; //液晶数据口线
2BF B387 IN R24,0x17
2C0 608F ORI R24,0xF
2C1 BB87 OUT 0x17,R24
(0082) LCD_CONTROL_DDR |= RS|EN; //
2C2 B38A IN R24,0x1A
2C3 608C ORI R24,0xC
2C4 BB8A OUT 0x1A,R24
(0083)
(0084) DS1302_DDR |= RST|SCLK|IO;
2C5 B381 IN R24,0x11
2C6 6388 ORI R24,0x38
2C7 BB81 OUT 0x11,R24
(0085) DS1302_PORT = 0X00;
2C8 2422 CLR R2
2C9 BA22 OUT 0x12,R2
(0086)
(0087) DS18B20_DDR |= DS18B20_IO;
2CA 9A8F SBI 0x11,7
2CB 9508 RET
(0088) /*********************************************************/
(0089) }
(0090) /******************************************/
(0091) void InitDS1302(void)
(0092) {
(0093) CLR_RST();
_InitDS1302:
2CC 9895 CBI 0x12,5
(0094) CLR_SCLK();
2CD 9893 CBI 0x12,3
(0095) CLR_IO();
2CE 9894 CBI 0x12,4
2CF 9508 RET
_Time_Init:
ad --> R10
i --> R22
p_time --> R20
2D0 940E 0465 CALL push_xgsetF00C
2D2 01A8 MOVW R20,R16
2D3 9721 SBIW R28,1
(0096) }
(0097) /****************************************/
(0098) void Time_Init(const uint8_t *p_time)
(0099) {
(0100) uint8_t i,ad=0;
2D4 24AA CLR R10
(0101) for(i=8;i>0;i--)
2D5 E068 LDI R22,0x8
2D6 C00A RJMP 0x02E1
(0102) {
(0103) Write(0,ad,*p_time);
2D7 01FA MOVW R30,R20
2D8 9024 LPM R2,10(Z)
2D9 8228 STD Y+0,R2
2DA 2D2A MOV R18,R10
2DB 2700 CLR R16
2DC D0BA RCALL _Write
(0104) ad++;
2DD 94A3 INC R10
(0105) p_time++;
2DE 5F4F SUBI R20,0xFF
2DF 4F5F SBCI R21,0xFF
2E0 956A DEC R22
2E1 E080 LDI R24,0
2E2 1786 CP R24,R22
2E3 F398 BCS 0x02D7
2E4 9621 ADIW R28,1
2E5 940C 046C JMP pop_xgsetF00C
_LCD_display_init:
2E7 9722 SBIW R28,2
(0106) }
(0107) }
(0108) /******************************************/
(0109) void LCD_display_init(void)
(0110) {
(0111) LCD_write_string(1,1,"20 . .");
2E8 E881 LDI R24,0x81
2E9 E090 LDI R25,0
2EA 8399 STD Y+1,R25
2EB 8388 STD Y+0,R24
2EC E021 LDI R18,1
2ED E001 LDI R16,1
2EE DE07 RCALL _LCD_write_string
(0112) LCD_write_string(3,2,": :");
2EF E78C LDI R24,0x7C
2F0 E090 LDI R25,0
2F1 8399 STD Y+1,R25
2F2 8388 STD Y+0,R24
2F3 E022 LDI R18,2
2F4 E003 LDI R16,3
2F5 DE00 RCALL _LCD_write_string
(0113) LCD_set_xy(15,2);
2F6 E022 LDI R18,2
2F7 E00F LDI R16,0xF
2F8 DDED RCALL _LCD_set_xy
(0114) Units();
2F9 ED2F LDI R18,0xDF
2FA 2700 CLR R16
2FB DDC4 RCALL _LCD_write_byte
2FC E423 LDI R18,0x43
2FD 2700 CLR R16
2FE DDC1 RCALL _LCD_write_byte
2FF 9622 ADIW R28,2
300 9508 RET
_ReadTime:
address --> R20
301 940E 0465 CALL push_xgsetF00C
(0115) }
(0116) /******************************************/
(0117) void ReadTime(void)
(0118) {
(0119) uint8_t address;
(0120) address = 0;
303 2744 CLR R20
(0121) g_second = Read_DS1302(0, address++);
304 2E24 MOV R2,R20
305 5F4F SUBI R20,0xFF
306 2D22 MOV R18,R2
307 2700 CLR R16
308 D0B9 RCALL _Read_DS1302
309 9300 00CA STS g_second,R16
(0122) g_mintue = Read_DS1302(0, address++);
30B 2F64 MOV R22,R20
30C 5F4F SUBI R20,0xFF
30D 2F26 MOV R18,R22
30E 2700 CLR R16
30F D0B2 RCALL _Read_DS1302
310 2EA0 MOV R10,R16
311 92A0 00CB STS g_mintue,R10
(0123) g_hour = Read_DS1302(0, address++);
313 2F64 MOV R22,R20
314 5F4F SUBI R20,0xFF
315 2F26 MOV R18,R22
316 2700 CLR R16
317 D0AA RCALL _Read_DS1302
318 2EA0 MOV R10,R16
319 92A0 00CC STS g_hour,R10
(0124) g_date = Read_DS1302(0, address++);
31B 2F64 MOV R22,R20
31C 5F4F SUBI R20,0xFF
31D 2F26 MOV R18,R22
31E 2700 CLR R16
31F D0A2 RCALL _Read_DS1302
320 2EA0 MOV R10,R16
321 92A0 00CE STS g_date,R10
(0125) g_month = Read_DS1302(0, address++);
323 2F64 MOV R22,R20
324 5F4F SUBI R20,0xFF
325 2F26 MOV R18,R22
326 2700 CLR R16
327 D09A RCALL _Read_DS1302
328 2EA0 MOV R10,R16
329 92A0 00CF STS g_month,R10
(0126) g_day = Read_DS1302(0, address++);
32B 2F64 MOV R22,R20
32C 5F4F SUBI R20,0xFF
32D 2F26 MOV R18,R22
32E 2700 CLR R16
32F D092 RCALL _Read_DS1302
330 2EA0 MOV R10,R16
331 92A0 00CD STS g_day,R10
(0127) g_year = Read_DS1302(0, address);
333 2F24 MOV R18,R20
334 2700 CLR R16
335 D08C RCALL _Read_DS1302
336 2EA0 MOV R10,R16
337 92A0 00D0 STS g_year,R10
339 940C 046C JMP pop_xgsetF00C
_DisplayTime:
33B 9722 SBIW R28,2
(0128) }
(0129) /******************************************/
(0130) void DisplayTime(void)
(0131) {
(0132) Display(3,1,g_year);
33C 9020 00D0 LDS R2,g_year
33E 8228 STD Y+0,R2
33F E021 LDI R18,1
340 E003 LDI R16,3
341 D031 RCALL _Display
(0133) Display(6,1,g_month);
342 9020 00CF LDS R2,g_month
344 8228 STD Y+0,R2
345 E021 LDI R18,1
346 E006 LDI R16,6
347 D02B RCALL _Display
(0134) Display(9,1,g_date);
348 9020 00CE LDS R2,g_date
34A 8228 STD Y+0,R2
34B E021 LDI R18,1
34C E009 LDI R16,0x9
34D D025 RCALL _Display
(0135) Display(1,2,g_hour);
34E 9020 00CC LDS R2,g_hour
350 8228 STD Y+0,R2
351 E022 LDI R18,2
352 E001 LDI R16,1
353 D01F RCALL _Display
(0136) Display(4,2,g_mintue);
354 9020 00CB LDS R2,g_mintue
356 8228 STD Y+0,R2
357 E022 LDI R18,2
358 E004 LDI R16,4
359 D019 RCALL _Display
(0137) Display(7,2,g_second);
35A 9020 00CA LDS R2,g_second
35C 8228 STD Y+0,R2
35D E022 LDI R18,2
35E E007 LDI R16,7
35F D013 RCALL _Display
(0138) LCD_write_string(14,1,&Day[(g_day-1)][0]);
360 E680 LDI R24,0x60
361 E090 LDI R25,0
362 91E0 00CD LDS R30,g_day
364 27FF CLR R31
365 9731 SBIW R30,1
366 0FEE LSL R30
367 1FFF ROL R31
368 0FEE LSL R30
369 1FFF ROL R31
36A 0FE8 ADD R30,R24
36B 1FF9 ADC R31,R25
36C 83F9 STD Y+1,R31
36D 83E8 STD Y+0,R30
36E E021 LDI R18,1
36F E00E LDI R16,0xE
370 DD85 RCALL _LCD_write_string
371 9622 ADIW R28,2
372 9508 RET
_Display:
n --> R12
m --> R10
temp_l --> R20
temp_h --> R22
g_data --> R14
y --> R12
x --> R10
373 940E 0450 CALL push_xgsetF0FC
375 2EC2 MOV R12,R18
376 2EA0 MOV R10,R16
377 84EA LDD R14,Y+10
(0139) }
(0140) /*******************************************/
(0141) void Display(uint8_t x, uint8_t y, uint8_t g_data)
(0142) {
(0143) uint8_t temp_h,temp_l,m,n;
(0144) temp_h = temp_l = g_data;
378 2D4E MOV R20,R14
379 2D6E MOV R22,R14
(0145) temp_h &= 0xf0;
37A 7F60 ANDI R22,0xF0
(0146) temp_h >>= 4;
37B 2F86 MOV R24,R22
37C 9582 SWAP R24
37D 708F ANDI R24,0xF
37E 2F68 MOV R22,R24
(0147) temp_l &= 0x0f;
37F 704F ANDI R20,0xF
(0148) m = x;
(0149) n = y;
(0150) LCD_set_xy(m,n);
380 2D2C MOV R18,R12
381 2D0A MOV R16,R10
382 DD63 RCALL _LCD_set_xy
(0151) LCD_write_byte(0,Number[temp_h]);
383 E78B LDI R24,0x7B
384 E090 LDI R25,0
385 2FE6 MOV R30,R22
386 27FF CLR R31
387 0FE8 ADD R30,R24
388 1FF9 ADC R31,R25
389 9124 LPM R18,0(Z)
38A 2700 CLR R16
38B DD34 RCALL _LCD_write_byte
(0152) LCD_write_byte(0,Number[temp_l]);
38C E78B LDI R24,0x7B
38D E090 LDI R25,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -