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

📄 1602_8563_timer.lst

📁 avr单片机的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0115 E005      LDI	R16,5
    0116 E010      LDI	R17,0
    0117 DF6D      RCALL	_delay_ms
    0118 9508      RET
_locate:
  x                    --> R20
  b                    --> R22
  a                    --> R10
    0119 940E0527  CALL	push_gset3
    011B 2F62      MOV	R22,R18
    011C 2EA0      MOV	R10,R16
(0105) 	}
(0106) 
(0107) //定位指令函数
(0108) void locate(uchar a,uchar b)
(0109)     {
(0110) 	uchar x;
(0111) 	if(a==1)
    011D 2D8A      MOV	R24,R10
    011E 3081      CPI	R24,1
    011F F419      BNE	0x0123
(0112) 	    x=0x80+b-1;
    0120 2F46      MOV	R20,R22
    0121 5840      SUBI	R20,0x80
    0122 5041      SUBI	R20,1
(0113) 	if(a==2)
    0123 2D8A      MOV	R24,R10
    0124 3082      CPI	R24,2
    0125 F419      BNE	0x0129
(0114) 	    x=0xC0+b-1;
    0126 2F46      MOV	R20,R22
    0127 5440      SUBI	R20,0x40
    0128 5041      SUBI	R20,1
(0115) 	lcd_comm(x);
    0129 2F04      MOV	R16,R20
    012A DF92      RCALL	_lcd_comm
(0116) 	delay_ms(5);
    012B E005      LDI	R16,5
    012C E010      LDI	R17,0
    012D DF57      RCALL	_delay_ms
    012E 940E0520  CALL	pop_gset3
    0130 9508      RET
_lcd:
  i                    --> R20
    0131 940E052B  CALL	push_gset1
    0133 2F40      MOV	R20,R16
(0117) 	}
(0118) 
(0119) //显示函数
(0120) void lcd(uchar i)
(0121)     {
(0122) 	lcd_da(i);
    0134 2F04      MOV	R16,R20
    0135 DF62      RCALL	_lcd_da
    0136 940E052E  CALL	pop_gset1
    0138 9508      RET
_xs_lcd:
  s                    --> R20
    0139 940E052B  CALL	push_gset1
    013B 01A8      MOVW	R20,R16
(0123) 	}
(0124)    
(0125) /***********************************
(0126) *       在第一行显示ID头函数	   *
(0127) * 入    口:1显示ID1,2显示ID2	   *
(0128) ***********************************/
(0129) void xs_lcd(char *s)
(0130)     {
    013C C005      RJMP	0x0142
(0131) 	while(*s)
(0132) 	    {
(0133) 		lcd(*s);
    013D 01FA      MOVW	R30,R20
    013E 8100      LDD	R16,Z+0
    013F DFF1      RCALL	_lcd
(0134) 		s++;
    0140 5F4F      SUBI	R20,0xFF
    0141 4F5F      SBCI	R21,0xFF
    0142 01FA      MOVW	R30,R20
    0143 8020      LDD	R2,Z+0
    0144 2022      TST	R2
    0145 F7B9      BNE	0x013D
    0146 940E052E  CALL	pop_gset1
    0148 9508      RET
(0135) 		}
(0136) 	}
(0137) 	
(0138) /***********************************
(0139) *         显示广告语函数	   	   *
(0140) *             tonghe			   *
(0141) *        Tel:028-82834946		   *
(0142) ***********************************/
(0143) void tonghe(void)
(0144)     {
(0145) 	cls();
_tonghe:
    0149 DFC9      RCALL	_cls
(0146) 	locate(1,5);			 	 //写指令:第1行地址
    014A E025      LDI	R18,5
    014B E001      LDI	R16,1
    014C DFCC      RCALL	_locate
(0147) 	xs_lcd("TONGHE");
    014D E90A      LDI	R16,0x9A
    014E E010      LDI	R17,0
    014F DFE9      RCALL	_xs_lcd
(0148) 	locate(2,1);			 	 //写指令:第2行地址
    0150 E021      LDI	R18,1
    0151 E002      LDI	R16,2
    0152 DFC6      RCALL	_locate
(0149) 	xs_lcd("Tel:028-82834946");
    0153 E809      LDI	R16,0x89
    0154 E010      LDI	R17,0
    0155 DFE3      RCALL	_xs_lcd
    0156 9508      RET
FILE: D:\PCF8563\1602_time\TWI_8563.h
(0001) /*******************************************
(0002) *       PCF8563的I2C(TWI)操作函数		   *
(0003) *  文 件 名:TWI_8563.h					   *
(0004) *  函数功能:利用CPU的硬件TWI接口操作	   *
(0005) *  设    计:铜河						   *
(0006) *  修改日期:2007年04月09日				   *
(0007) *  版    本:V1.0						   *
(0008) *  主控芯片:Mega16						   *
(0009) *******************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) //宏定义
(0013) //状态寄存器TWSR各种状态定义
(0014) //主模式启动状态
(0015) #define START			0x08		//启动总线
(0016) #define RESTART			0x10		//重新启动总线
(0017) 
(0018) //主发送模式各种状态
(0019) #define MT_SLA_ACK		0x18		//SLA_W写地址已发送,收到应答位
(0020) #define MT_SLA_NACK		0x20		//SLA_W写地址已发送,收到非应答位
(0021) #define MT_DATA_ACK		0x28		//写入数据已发送,收到应答位
(0022) #define MT_DATA_NACK	0x30		//写入数据已发送,收到应答位
(0023) #define MT_ARB_LOST		0x38		//SLA_W或数据仲裁失败
(0024) 
(0025) //主接收模式各种状态
(0026) #define MR_ARB_LOST		0x38		//
(0027) #define MR_SLA_ACK		0x40		//SLA_R已发送,收到应答位
(0028) #define MR_SLA_NACK		0x48		//SLA_R已发送,收到非应答位
(0029) #define MR_DATA_ACK		0x50		//接收到数据,应答位已返回
(0030) #define MR_DATA_NACK	0x58		//接收到数据,非应答位已返回
(0031) 
(0032) #define SLA_W		0xA2	   		 //PCF8563写从地址
(0033) #define SLA_R		0xA3			 //PCF8563读从地址
(0034) 
(0035) #define start()    	(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0036) #define stop()     	(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0037) #define waitack()	{while(!(TWCR&(1<<TWINT)));}
(0038) #define chkack() 		(TWSR&0xf8)					//check ack
(0039) #define sendack()	(TWCR|=(1<<TWEA))
(0040) #define sendnack()	(TWCR&=~(1<<TWEA))
(0041) #define sendbyte(x)	{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 
(0042) #define rcvnckbyte()	(TWCR=(1<<TWINT)|(1<<TWEN))
(0043) #define rcvackbyte()	(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0044) 
(0045) /* I2C Config */
(0046) #define I2C_ERR			0
(0047) #define I2C_CRR			1
(0048) 
(0049) //简化宏定义
(0050) #define uchar unsigned char
(0051) #define uint unsigned int
(0052) 
(0053) 
(0054) //TWI初始化
(0055) void Twi_Init(void)
(0056)    {
(0057)    TWBR=14;
_Twi_Init:
    0157 E08E      LDI	R24,0xE
    0158 B980      OUT	0x00,R24
(0058)    TWSR=0;
    0159 2422      CLR	R2
    015A B821      OUT	0x01,R2
    015B 9508      RET
(0059)    }
(0060) 
(0061) //写入时间函数
(0062) uchar write_tim(uchar a)
(0063)     {   
(0064)     sendbyte(a);				  //发送
_write_tim:
  a                    --> R16
    015C B903      OUT	0x03,R16
    015D E884      LDI	R24,0x84
    015E BF86      OUT	0x36,R24
(0065) 	waitack();						  //等待写完成
    015F B626      IN	R2,0x36
    0160 FE27      SBRS	R2,7
    0161 CFFD      RJMP	0x015F
(0066) 	if(chkack()!=MT_SLA_ACK)return I2C_ERR;  //检查是否正确写入
    0162 B181      IN	R24,0x01
    0163 7F88      ANDI	R24,0xF8
    0164 3188      CPI	R24,0x18
    0165 F011      BEQ	0x0168
    0166 2700      CLR	R16
    0167 C001      RJMP	0x0169
(0067) 	else return I2C_CRR;
    0168 E001      LDI	R16,1
    0169 9508      RET
(0068) 	}
(0069) //读出时间函数
(0070) uchar read_tim(void)
(0071) 	{
(0072) 	rcvackbyte();					  //接收一字节并返回应答
_read_tim:
    016A EC84      LDI	R24,0xC4
    016B BF86      OUT	0x36,R24
(0073) 	waitack();						  //等待接收完成
    016C B626      IN	R2,0x36
    016D FE27      SBRS	R2,7
    016E CFFD      RJMP	0x016C
(0074) 	if(chkack()!=MR_DATA_ACK)return I2C_ERR; 		  //检查是否接收成功
    016F B181      IN	R24,0x01
    0170 7F88      ANDI	R24,0xF8
    0171 3580      CPI	R24,0x50
    0172 F011      BEQ	0x0175
    0173 2700      CLR	R16
    0174 C001      RJMP	0x0176
(0075) //	    return I2C_ERR;
(0076) 	else
(0077) 		return(TWDR);				  //读出时钟数据
    0175 B103      IN	R16,0x03
    0176 9508      RET
_spk:
  a                    --> R10
  n                    --> R20
  i                    --> R22
    0177 940E0527  CALL	push_gset3
    0179 2F42      MOV	R20,R18
    017A 2F60      MOV	R22,R16
FILE: D:\PCF8563\1602_time\1602_8563.c
(0001) /*************************************
(0002) *         PCF8563时钟程序			 *
(0003) * 文 件 名:1602_8563.c				 *
(0004) * 建立日期:2007年07月04日			 *
(0005) * 设    计:铜河					 *
(0006) * 修改日期:2007年07月08日			 *
(0007) * 版    本:V22.02				 	 *
(0008) * 主控芯片:Mega16L					 *
(0009) * 工作频率:7.3728MHz				 *
(0010) *************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include <stdio.h>
(0014) #include <D:\PCF8563\1602_time\timer_io.h>
(0015) #include <D:\PCF8563\1602_time\delay.h>
(0016) #include <D:\PCF8563\1602_time\lcd1602_4h.h>
(0017) #include <D:\PCF8563\1602_time\TWI_8563.h>
(0018) 
(0019) //数据简化宏定义
(0020) #define uchar unsigned char
(0021) #define uint unsigned int
(0022) 
(0023) //全局变量定义
(0024) uchar timer[8];		  				 //时钟数据
(0025) 
(0026) /**********************************
(0027) *         蜂鸣器发声函数  	  	  *
(0028) * 函数功能:蜂鸣器发出声响		  *
(0029) * 入    口:n 声次数	  		  *
(0030) * 			i 声时长,i*10ms	  *
(0031) * 返    回:无		  			  *
(0032) * 发声频率:固定1KHz 无源		  *
(0033) **********************************/
(0034) void spk(uchar i,uchar n)
(0035)     {
(0036) 	uint a;
(0037) 	for(;n;n--)
    017B C01E      RJMP	0x019A
(0038) 	    {
(0039) 		a=i*10;	   	 		       //计算每声响的长度:MS
    017C E08A      LDI	R24,0xA
    017D 9F86      MUL	R24,R22
    017E 0150      MOVW	R10,R0
(0040) 		for(;a;a--)
    017F C011      RJMP	0x0191
(0041) 		    {
(0042) 			delay_us(500);		   //响声频率为1KHZ
    0180 EF04      LDI	R16,0xF4
    0181 E011      LDI	R17,1
    0182 DEF8      RCALL	_delay_us
(0043) 			SPK_TG;
    0183 E480      LDI	R24,0x40
    0184 B222      IN	R2,0x12
    0185 2628      EOR	R2,R24
    0186 BA22      OUT	0x12,R2
(0044) 			delay_us(500);
    0187 EF04      LDI	R16,0xF4
    0188 E011      LDI	R17,1
    0189 DEF1      RCALL	_delay_us
(0045) 			SPK_TG;
    018A E480      LDI	R24,0x40
    018B B222      IN	R2,0x12
    018C 2628      EOR	R2,R24
    018D BA22      OUT	0x12,R2
    018E 01C5      MOVW	R24,R10
    018F 9701      SBIW	R24,1
    0190 015C      MOVW	R10,R24
    0191 20AA      TST	R10
    0192 F769      BNE	0x0180
    0193 20BB      TST	R11
    0194 F759      BNE	0x0180
(0046) 			}
(0047) 		SPK_OFF;   		  		   //响完关闭蜂鸣器
    0195 9896      CBI	0x12,6
(0048) 		delay_ms(100);			   //每声响之间隔100MS
    0196 E604      LDI	R16,0x64
    0197 E010      LDI	R17,0
    0198 DEEC      RCALL	_delay_ms
    0199 954A      DEC	R20
    019A 2344      TST	R20
    019B F701      BNE	0x017C
    019C 940E0520  CALL	pop_gset3
    019E 9508      RET
(0049) 		}
(0050) 	}
(0051) 
(0052) /**********************************
(0053) *          读出数据函数			  *
(0054) **********************************/
(0055) uchar read_timer(void)
(0056)     {
(0057) 	start();		 	 	          //启动总线
_read_timer:
    019F EA84      LDI	R24,0xA4
    01A0 BF86      OUT	0x36,R24
(0058) 	waitack();						  //等待启动完成
    01A1 B626      IN	R2,0x36
    01A2 FE27      SBRS	R2,7
    01A3 CFFD      RJMP	0x01A1
(0059) 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
    01A4 B181      IN	R24,0x01
    01A5 7F88      ANDI	R24,0xF8
    01A6 3088      CPI	R24,0x8
    01A7 F011      BEQ	0x01AA
    01A8 2700      CLR	R16
    01A9 C046      RJMP	0x01F0
(0060) 	write_tim(SLA_W);				  //发送写地址
    01AA EA02      LDI	R16,0xA2
    01AB DFB0      RCALL	_write_tim
(0061) 	write_tim(0x02);				  //写数据地址
    01AC E002      LDI	R16,2
    01AD DFAE      RCALL	_write_tim
(0062) 	
(0063) 	start();
    01AE EA84      LDI	R24,0xA4
    01AF BF86      OUT	0x36,R24
(0064) 	waitack();						  //等待启动完成
    01B0 B626      IN	R2,0x36
    01B1 FE27      SBRS	R2,7
    01B2 CFFD      RJMP	0x01B0
(0065) 	if(chkack()!=RESTART)return I2C_ERR;	  //检查是否启动成功
    01B3 B181      IN	R24,0x01
    01B4 7F88      ANDI	R24,0xF8
    01B5 3180      CPI	R24,0x10
    01B6 F011      BEQ	0x01B9
    01B7 2700      CLR	R16
    01B8 C037      RJMP	0x01F0
(0066) 	write_tim(SLA_R);				  //发送读地址
    01B9 EA03      LDI	R16,0xA3
    01BA DFA1      RCALL	_write_tim
(0067) 	
(0068) 	timer[0]=read_tim()&0x7F;		  //读出秒数据
    01BB DFAE      RCALL	_read_tim
    01BC 2F80      MOV	R24,R16
    01BD 778F      ANDI	R24,0x7F
    01BE 938000A1  STS	timer,R24
(0069) 	timer[1]=read_tim()&0x7F;		  //读出分数据
    01C0 DFA9      RCALL	_read_tim
    01C1 2F80      MOV	R24,R16
    01C2 778F      ANDI	R24,0x7F
    01C3 938000A2  STS	timer+1,R24
(0070) 	timer[2]=read_tim()&0x3F;		  //读出时数据
    01C5 DFA4      RCALL	_read_tim
    01C6 2F80      MOV	R24,R16
    01C7 738F      ANDI	R24,0x3F
    01C8 938000A3  STS	timer+2,R24
(0071) 	timer[3]=read_tim()&0x3F;		  //读出日数据
    01CA DF9F      RCALL	_read_tim
    01CB 2F80      MOV	R24,R16
    01CC 738F      ANDI	R24,0x3F
    01CD 938000A4  STS	timer+3,R24
(0072) 	timer[4]=read_tim()&0x07;		  //读出周数据
    01CF DF9A      RCALL	_read_tim
    01D0 2F80      MOV	R24,R16
    01D1 7087      ANDI	R24,7
    01D2 938000A5  STS	0xA5,R24

⌨️ 快捷键说明

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