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

📄 15ds1302.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    004A EFCF      LDI	R28,0xFF
    004B E1D0      LDI	R29,0x10
    004C BFCD      OUT	0x3D,R28
    004D BFDE      OUT	0x3E,R29
    004E 51C0      SUBI	R28,0x10
    004F 40D0      SBCI	R29,0
    0050 EA0A      LDI	R16,0xAA
    0051 8308      STD	Y+0,R16
    0052 2400      CLR	R0
    0053 E0E8      LDI	R30,0x8
    0054 E0F1      LDI	R31,1
    0055 E011      LDI	R17,1
    0056 30E8      CPI	R30,0x8
    0057 07F1      CPC	R31,R17
    0058 F011      BEQ	0x005B
    0059 9201      ST	R0,Z+
    005A CFFB      RJMP	0x0056
    005B 8300      STD	Z+0,R16
    005C E8EC      LDI	R30,0x8C
    005D E0F0      LDI	R31,0
    005E E0A0      LDI	R26,0
    005F E0B1      LDI	R27,1
    0060 E010      LDI	R17,0
    0061 39E4      CPI	R30,0x94
    0062 07F1      CPC	R31,R17
    0063 F021      BEQ	0x0068
    0064 95C8      LPM
    0065 9631      ADIW	R30,1
    0066 920D      ST	R0,X+
    0067 CFF9      RJMP	0x0061
    0068 940E019C  CALL	_main
_exit:
    006A CFFF      RJMP	_exit
_ds1302_write_byte:
  i                    --> R20
  d                    --> R18
  addr                 --> R16
    006B 940E0260  CALL	push_gset1
FILE: E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\ds1302.c
(0001) /*
(0002) DS1302时钟芯片驱动函数
(0003) 
(0004) 	DS1302是产品中最常用的时钟芯片,此文件中的代码可以嵌入项目中使用。
(0005) 
(0006) */
(0007) 
(0008) #include "iom128v.h"
(0009) 
(0010) /*复位脚*/
(0011) #define RST_CLR	PORTD &= ~(1 << PD7)/*电平置低*/
(0012) #define RST_SET	PORTD |= (1 << PD7)/*电平置高*/
(0013) #define RST_IN	DDRD &= ~(1 << PD7)/*方向输入*/
(0014) #define RST_OUT	DDRD |= (1 << PD7)/*方向输出*/
(0015) 
(0016) /*双向数据*/
(0017) #define IO_CLR	PORTD &= ~(1 << PD6)/*电平置低*/
(0018) #define IO_SET	PORTD |= (1 << PD6)/*电平置高*/
(0019) #define IO_R	PIND & (1 << PD6)/*电平读取*/
(0020) #define IO_IN	DDRD &= ~(1 << PD6)/*方向输入*/
(0021) #define IO_OUT	DDRD |= (1 << PD6)/*方向输出*/
(0022) 
(0023) /*时钟信号*/
(0024) #define SCK_CLR	PORTD &= ~(1 << PD5)/*时钟信号*/
(0025) #define SCK_SET	PORTD |= (1 << PD5)/*电平置高*/
(0026) #define SCK_IN	DDRD &= ~(1 << PD5)/*方向输入*/
(0027) #define SCK_OUT	DDRD |= (1 << PD5)/*方向输出*/
(0028) 
(0029) #define ds1302_sec_add			0x80		//秒数据地址
(0030) #define ds1302_min_add			0x82		//分数据地址
(0031) #define ds1302_hr_add			0x84		//时数据地址
(0032) #define ds1302_date_add			0x86		//日数据地址
(0033) #define ds1302_month_add		0x88		//月数据地址
(0034) #define ds1302_day_add			0x8a		//星期数据地址
(0035) #define ds1302_year_add			0x8c		//年数据地址
(0036) #define ds1302_control_add		0x8e		//控制数据地址
(0037) #define ds1302_charger_add		0x90 					 
(0038) #define ds1302_clkburst_add		0xbe
(0039) 
(0040) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0041) 
(0042) /*向DS1302写入一字节数据*/
(0043) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0044) 
(0045) 	unsigned char i;
(0046) 	RST_SET;					/*启动DS1302总线*/
    006D 9A97      SBI	0x12,7
(0047) 	
(0048) 	/*写入目标地址:addr*/
(0049) 	IO_OUT;
    006E 9A8E      SBI	0x11,6
(0050) 	addr = addr & 0xFE;/*最低位置零*/
    006F 7F0E      ANDI	R16,0xFE
(0051) 	for (i = 0; i < 8; i ++) {
    0070 2744      CLR	R20
    0071 C009      RJMP	0x007B
(0052) 		if (addr & 0x01) {
    0072 FF00      SBRS	R16,0
    0073 C002      RJMP	0x0076
(0053) 			IO_SET;
    0074 9A96      SBI	0x12,6
(0054) 			}
    0075 C001      RJMP	0x0077
(0055) 		else {
(0056) 			IO_CLR;
    0076 9896      CBI	0x12,6
(0057) 			}
(0058) 		SCK_SET;
    0077 9A95      SBI	0x12,5
(0059) 		SCK_CLR;
    0078 9895      CBI	0x12,5
(0060) 		addr = addr >> 1;
    0079 9506      LSR	R16
    007A 9543      INC	R20
    007B 3048      CPI	R20,0x8
    007C F3A8      BCS	0x0072
(0061) 		}
(0062) 	
(0063) 	/*写入数据:d*/
(0064) 	IO_OUT;
    007D 9A8E      SBI	0x11,6
(0065) 	for (i = 0; i < 8; i ++) {
    007E 2744      CLR	R20
    007F C009      RJMP	0x0089
(0066) 		if (d & 0x01) {
    0080 FF20      SBRS	R18,0
    0081 C002      RJMP	0x0084
(0067) 			IO_SET;
    0082 9A96      SBI	0x12,6
(0068) 			}
    0083 C001      RJMP	0x0085
(0069) 		else {
(0070) 			IO_CLR;
    0084 9896      CBI	0x12,6
(0071) 			}
(0072) 		SCK_SET;
    0085 9A95      SBI	0x12,5
(0073) 		SCK_CLR;
    0086 9895      CBI	0x12,5
(0074) 		d = d >> 1;
    0087 9526      LSR	R18
    0088 9543      INC	R20
    0089 3048      CPI	R20,0x8
    008A F3A8      BCS	0x0080
(0075) 		}
(0076) 	RST_CLR;					/*停止DS1302总线*/
    008B 9897      CBI	0x12,7
    008C 940E0263  CALL	pop_gset1
    008E 9508      RET
_ds1302_read_byte:
  temp                 --> R20
  i                    --> R22
  addr                 --> R16
    008F 940E025E  CALL	push_gset2
(0077) }
(0078) 
(0079) /*从DS1302读出一字节数据*/
(0080) unsigned char ds1302_read_byte(unsigned char addr) {
(0081) 
(0082) 	unsigned char i;
(0083) 	unsigned char temp;
(0084) 	RST_SET;					/*启动DS1302总线*/
    0091 9A97      SBI	0x12,7
(0085) 
(0086) 	/*写入目标地址:addr*/
(0087) 	IO_OUT;
    0092 9A8E      SBI	0x11,6
(0088) 	addr = addr | 0x01;/*最低位置高*/
    0093 6001      ORI	R16,1
(0089) 	for (i = 0; i < 8; i ++) {
    0094 2766      CLR	R22
    0095 C009      RJMP	0x009F
(0090) 		if (addr & 0x01) {
    0096 FF00      SBRS	R16,0
    0097 C002      RJMP	0x009A
(0091) 			IO_SET;
    0098 9A96      SBI	0x12,6
(0092) 			}
    0099 C001      RJMP	0x009B
(0093) 		else {
(0094) 			IO_CLR;
    009A 9896      CBI	0x12,6
(0095) 			}
(0096) 		SCK_SET;
    009B 9A95      SBI	0x12,5
(0097) 		SCK_CLR;
    009C 9895      CBI	0x12,5
(0098) 		addr = addr >> 1;
    009D 9506      LSR	R16
    009E 9563      INC	R22
    009F 3068      CPI	R22,0x8
    00A0 F3A8      BCS	0x0096
(0099) 		}
(0100) 	
(0101) 	/*输出数据:temp*/
(0102) 	IO_IN;
    00A1 988E      CBI	0x11,6
(0103) 	for (i = 0; i < 8; i ++) {
    00A2 2766      CLR	R22
    00A3 C009      RJMP	0x00AD
(0104) 		temp = temp >> 1;
    00A4 9546      LSR	R20
(0105) 		if (IO_R) {
    00A5 9B86      SBIS	0x10,6
    00A6 C002      RJMP	0x00A9
(0106) 			temp |= 0x80;
    00A7 6840      ORI	R20,0x80
(0107) 			}
    00A8 C001      RJMP	0x00AA
(0108) 		else {
(0109) 			temp &= 0x7F;
    00A9 774F      ANDI	R20,0x7F
(0110) 			}
(0111) 		SCK_SET;
    00AA 9A95      SBI	0x12,5
(0112) 		SCK_CLR;
    00AB 9895      CBI	0x12,5
    00AC 9563      INC	R22
    00AD 3068      CPI	R22,0x8
    00AE F3A8      BCS	0x00A4
(0113) 		}
(0114) 	
(0115) 	RST_CLR;					/*停止DS1302总线*/
    00AF 9897      CBI	0x12,7
(0116) 	return temp;
    00B0 2F04      MOV	R16,R20
    00B1 940E0252  CALL	pop_gset2
    00B3 9508      RET
(0117) }
(0118) 
(0119) /*向DS302写入时钟数据*/
(0120) void ds1302_write_time(void) {
(0121) 
(0122) 	ds1302_write_byte(ds1302_control_add,0x00);			//关闭写保护 
_ds1302_write_time:
    00B4 2722      CLR	R18
    00B5 E80E      LDI	R16,0x8E
    00B6 DFB4      RCALL	_ds1302_write_byte
(0123) 	ds1302_write_byte(ds1302_sec_add,0x80);				//暂停 
    00B7 E820      LDI	R18,0x80
    00B8 E800      LDI	R16,0x80
    00B9 DFB1      RCALL	_ds1302_write_byte
(0124) 	//ds1302_write_byte(ds1302_charger_add,0xa9);			//涓流充电 
(0125) 	ds1302_write_byte(ds1302_year_add,time_buf[1]);		//年 
    00BA 91200101  LDS	R18,time_buf+1
    00BC E80C      LDI	R16,0x8C
    00BD DFAD      RCALL	_ds1302_write_byte
(0126) 	ds1302_write_byte(ds1302_month_add,time_buf[2]);	//月 
    00BE 91200102  LDS	R18,time_buf+2
    00C0 E808      LDI	R16,0x88
    00C1 DFA9      RCALL	_ds1302_write_byte
(0127) 	ds1302_write_byte(ds1302_date_add,time_buf[3]);		//日 
    00C2 91200103  LDS	R18,time_buf+3
    00C4 E806      LDI	R16,0x86
    00C5 DFA5      RCALL	_ds1302_write_byte
(0128) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    00C6 91200107  LDS	R18,0x107
    00C8 E80A      LDI	R16,0x8A
    00C9 DFA1      RCALL	_ds1302_write_byte
(0129) 	ds1302_write_byte(ds1302_hr_add,time_buf[4]);		//时 
    00CA 91200104  LDS	R18,0x104
    00CC E804      LDI	R16,0x84
    00CD DF9D      RCALL	_ds1302_write_byte
(0130) 	ds1302_write_byte(ds1302_min_add,time_buf[5]);		//分
    00CE 91200105  LDS	R18,0x105
    00D0 E802      LDI	R16,0x82
    00D1 DF99      RCALL	_ds1302_write_byte
(0131) 	ds1302_write_byte(ds1302_sec_add,time_buf[6]);		//秒
    00D2 91200106  LDS	R18,0x106
    00D4 E800      LDI	R16,0x80
    00D5 DF95      RCALL	_ds1302_write_byte
(0132) 	ds1302_write_byte(ds1302_day_add,time_buf[7]);		//周 
    00D6 91200107  LDS	R18,0x107
    00D8 E80A      LDI	R16,0x8A
    00D9 DF91      RCALL	_ds1302_write_byte
(0133) 	ds1302_write_byte(ds1302_control_add,0x80);			//打开写保护 
    00DA E820      LDI	R18,0x80
    00DB E80E      LDI	R16,0x8E
    00DC DF8E      RCALL	_ds1302_write_byte
    00DD 9508      RET
(0134) }
(0135) 
(0136) /*从DS302读出时钟数据*/
(0137) void ds1302_read_time(void)  { 
(0138) 
(0139) 	time_buf[1]=ds1302_read_byte(ds1302_year_add);		//年 
_ds1302_read_time:
    00DE E80C      LDI	R16,0x8C
    00DF DFAF      RCALL	_ds1302_read_byte
    00E0 93000101  STS	time_buf+1,R16
(0140) 	time_buf[2]=ds1302_read_byte(ds1302_month_add);		//月 
    00E2 E808      LDI	R16,0x88
    00E3 DFAB      RCALL	_ds1302_read_byte
    00E4 93000102  STS	time_buf+2,R16
(0141) 	time_buf[3]=ds1302_read_byte(ds1302_date_add);		//日 
    00E6 E806      LDI	R16,0x86
    00E7 DFA7      RCALL	_ds1302_read_byte
    00E8 93000103  STS	time_buf+3,R16
(0142) 	time_buf[4]=ds1302_read_byte(ds1302_hr_add);		//时 
    00EA E804      LDI	R16,0x84
    00EB DFA3      RCALL	_ds1302_read_byte
    00EC 93000104  STS	0x104,R16
(0143) 	time_buf[5]=ds1302_read_byte(ds1302_min_add);		//分 
    00EE E802      LDI	R16,0x82
    00EF DF9F      RCALL	_ds1302_read_byte
    00F0 93000105  STS	0x105,R16
(0144) 	time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒 
    00F2 E800      LDI	R16,0x80
    00F3 DF9B      RCALL	_ds1302_read_byte
    00F4 2F80      MOV	R24,R16
    00F5 778F      ANDI	R24,0x7F
    00F6 93800106  STS	0x106,R24
(0145) 	time_buf[7]=ds1302_read_byte(ds1302_day_add);		//周 
    00F8 E80A      LDI	R16,0x8A
    00F9 DF95      RCALL	_ds1302_read_byte
    00FA 93000107  STS	0x107,R16
    00FC 9508      RET
(0146) }
(0147) 
(0148) /*DS302初始化函数*/
(0149) void ds1302_init(void) {
(0150) 	
(0151) 	RST_CLR;			/*RST脚置低*/
_ds1302_init:
    00FD 9897      CBI	0x12,7
(0152) 	SCK_CLR;			/*SCK脚置低*/
    00FE 9895      CBI	0x12,5
(0153) 	RST_OUT;			/*RST脚设置为输出*/
    00FF 9A8F      SBI	0x11,7
(0154) 	SCK_OUT;			/*SCK脚设置为输出*/
    0100 9A8D      SBI	0x11,5
    0101 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\015-DS1302-LCD1602\lcd1602.c
(0001) /*
(0002) 	LCD1602液晶屏驱动模块
(0003) 	1、可直接嵌入到项目中使用
(0004) 	2、晶振频率:1M
(0005) 	3、如晶振提高低层驱动延时要作相应修改
(0006) 
(0007) 	AVR_AFA
(0008) 	www.iccavr.com
(0009) 	程序编写过程中参照了peak的4线显示程序
(0010) 	peak:AVR论坛技术版版主
(0011) */
(0012) 
(0013) #include <iom128v.h>
(0014) 
(0015) #define RS_CLR	PORTC &= ~(1 << PC2)
(0016) #define RS_SET	PORTC |= (1 << PC2)
(0017) 
(0018) #define RW_CLR	PORTC &= ~(1 << PC3)
(0019) #define RW_SET	PORTC |= (1 << PC3)
(0020) 
(0021) #define EN_CLR	PORTC &= ~(1 << PC4)
(0022) #define EN_SET	PORTC |= (1 << PC4)
(0023) 
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026) 
(0027) 	if (n == 0) {
_delay_us:
  n                    --> R16
    0102 3000      CPI	R16,0
    0103 0701      CPC	R16,R17
    0104 F409      BNE	0x0106
(0028) 		return ;
    0105 C006      RJMP	0x010C
(0029) 		}
(0030) 	while (--n);
    0106 01C8      MOVW	R24,R16
    0107 9701      SBIW	R24,1
    0108 018C      MOVW	R16,R24
    0109 3000      CPI	R16,0
    010A 0701      CPC	R16,R17
    010B F7D1      BNE	0x0106
    010C 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    010D 940E025E  CALL	push_gset2
(0031) }
(0032) 
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035) 
(0036) 	unsigned char a, b;
(0037) 	for (a = 1; a < i; a++) {
    010F E041      LDI	R20,1
    0110 C006      RJMP	0x0117
(0038) 		for (b = 1; b; b++) {
    0111 E061      LDI	R22,1
    0112 C001      RJMP	0x0114
    0113 9563      INC	R22
    0114 2366      TST	R22
    0115 F7E9      BNE	0x0113
    0116 9543      INC	R20
    0117 1740      CP	R20,R16
    0118 F3C0      BCS	0x0111
    0119 940E0252  CALL	pop_gset2
    011B 9508      RET
_LCD_write_com:
  com                  --> R20
    011C 940E0260  CALL	push_gset1
    011E 2F40      MOV	R20,R16
(0039) 			;
(0040) 			}
(0041) 		}
(0042) }
(0043) 
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046) 	
(0047) 	RS_CLR;
    011F 98AA      CBI	0x15,2
(0048) 	RW_CLR;
    0120 98AB      CBI	0x15,3
(0049) 	EN_SET;
    0121 9AAC      SBI	0x15,4
(0050) 	PORTA = com;
    0122 BB4B      OUT	0x1B,R20
(0051) 	delay_us(5);
    0123 E005      LDI	R16,5
    0124 E010      LDI	R17,0
    0125 DFDC      RCALL	_delay_us
(0052) 	EN_CLR;
    0126 98AC      CBI	0x15,4
    0127 940E0263  CALL	pop_gset1
    0129 9508      RET
_LCD_write_data:
  data                 --> R20
    012A 940E0260  CALL	push_gset1
    012C 2F40      MOV	R20,R16
(0053) }
(0054) 
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057) 
(0058) 	RS_SET;
    012D 9AAA      SBI	0x15,2
(0059) 	RW_CLR;
    012E 98AB      CBI	0x15,3
(0060) 	EN_SET;
    012F 9AAC      SBI	0x15,4
(0061) 	PORTA = data;
    0130 BB4B      OUT	0x1B,R20
(0062) 	delay_us(5);
    0131 E005      LDI	R16,5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -