⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302_18b20_1602.lst

📁 这是一个用温度计和时钟程序,芯片是ATmega16,电路稳定,绝对好用而且易懂
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -