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

📄 ds12887.lst

📁 高精度时钟芯片。avr驱动
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0105 CF7C      RJMP	_Delayms
_LCD1602_readBF:
  busy                 --> R20
    0106 940E02CF  CALL	push_gset1
(0132) /*******************************************
(0133) 函数名称: LCD1602_readBF
(0134) 功    能: 1602液晶清屏
(0135) 参    数: 无
(0136) 返回值  : busy--为1时是忙状态,为0时可以接收指令
(0137) /********************************************/
(0138) uchar LCD1602_readBF(void)
(0139) {	  
(0140) 	uchar busy;
(0141) 	busy=LCD1602_readbyte(iCmd);		//读回BF标志(忙标志)和地址
    0108 2700      CLR	R16
    0109 DFBB      RCALL	_LCD1602_readbyte
    010A 2F40      MOV	R20,R16
(0142) 	if(busy&0x80)						//如果忙返回正在忙的状态
    010B FF07      SBRS	R16,7
    010C C002      RJMP	0x010F
(0143) 		busy=1;
    010D E041      LDI	R20,1
    010E C001      RJMP	0x0110
(0144) 	else	   							//如果不忙,可以写入
(0145) 		busy=0;
    010F 2744      CLR	R20
(0146) 	return busy;
    0110 2F04      MOV	R16,R20
    0111 940E02D2  CALL	pop_gset1
    0113 9508      RET
_LCD1602_gotoXY:
  Col                  --> R20
  Row                  --> R22
    0114 940E02E6  CALL	push_gset2
    0116 2F42      MOV	R20,R18
    0117 2F60      MOV	R22,R16
(0147) }
(0148) /*******************************************
(0149) 函数名称: LCD1602_gotoXY
(0150) 功    能: 移动到指定位置
(0151) 参    数: Row--指定的行
(0152) 	  	  Col--指定的列
(0153) 返回值  : 无
(0154) /********************************************/
(0155) void LCD1602_gotoXY(uchar Row, uchar Col)
(0156) {	
(0157) 	switch (Row)		  //选择行
    0118 2777      CLR	R23
    0119 3062      CPI	R22,2
    011A E0E0      LDI	R30,0
    011B 077E      CPC	R23,R30
    011C F009      BEQ	0x011E
    011D C005      RJMP	0x0123
(0158) 	{
(0159) 		case 2:
(0160) 			LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break;	//写入第2行的指定列	
    011E 2F24      MOV	R18,R20
    011F 5420      SUBI	R18,0x40
    0120 2700      CLR	R16
    0121 DFBB      RCALL	_LCD1602_sendbyte
    0122 C004      RJMP	0x0127
(0161) 		default:
(0162) 			LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break;	//写入第1行的指定列	
    0123 2F24      MOV	R18,R20
    0124 5820      SUBI	R18,0x80
    0125 2700      CLR	R16
    0126 DFB6      RCALL	_LCD1602_sendbyte
(0163) 	}
(0164) }
    0127 940E02EA  CALL	pop_gset2
    0129 9508      RET
(0165) /*******************************************
(0166) 函数名称: LCD1602_initial
(0167) 功    能: 1602液晶初始化
(0168) 参    数: 无
(0169) 返回值  : 无
(0170) /********************************************/
(0171) void LCD1602_initial(void)
(0172) {
(0173) 	Delayms(100);				//上电后等待内部复位
_LCD1602_initial:
    012A E604      LDI	R16,0x64
    012B E010      LDI	R17,0
    012C DF55      RCALL	_Delayms
(0174) 	LCD1602_portini();			//端口初始化
    012D DF90      RCALL	_LCD1602_portini
(0175) 	
(0176) 	LCD1602_sendbyte(iCmd, LCDa_FUNCTION);	//功能、模式设定,具体的设定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定义
    012E E328      LDI	R18,0x38
    012F 2700      CLR	R16
    0130 DFAC      RCALL	_LCD1602_sendbyte
(0177) 	while(LCD1602_readBF());				//等待不忙为止
    0131 DFD4      RCALL	_LCD1602_readBF
    0132 2300      TST	R16
    0133 F7E9      BNE	0x0131
(0178) 	LCD1602_sendbyte(iCmd, LCDa_ON);		//打开显示
    0134 E02C      LDI	R18,0xC
    0135 2700      CLR	R16
    0136 DFA6      RCALL	_LCD1602_sendbyte
(0179) 	while(LCD1602_readBF());				//等待不忙为止
    0137 DFCE      RCALL	_LCD1602_readBF
    0138 2300      TST	R16
    0139 F7E9      BNE	0x0137
(0180) 	LCD1602_clear();						//清屏
    013A DFC5      RCALL	_LCD1602_clear
(0181) 	while(LCD1602_readBF());				//等待不忙为止
    013B DFCA      RCALL	_LCD1602_readBF
    013C 2300      TST	R16
    013D F7E9      BNE	0x013B
(0182) 	LCD1602_sendbyte(iCmd, LCDa_ENTRY);		//输入模式设定		
    013E E026      LDI	R18,6
    013F 2700      CLR	R16
(0183) }
    0140 CF9C      RJMP	_LCD1602_sendbyte
_write_ds:
  date                 --> R20
  add                  --> R22
    0141 940E02E6  CALL	push_gset2
    0143 2F42      MOV	R20,R18
    0144 2F60      MOV	R22,R16
(0184) 
(0185) void write_ds(uchar add,uchar date)
(0186) {
(0187)    PORTC&=~BIT(RTC_CS);		  //选通时钟
    0145 98A8      CBI	P15,0
(0188)    PORTD|=BIT(RTC_AS);
    0146 9A95      SBI	P12,5
(0189)    PORTD|=BIT(RTC_DS);
    0147 9A97      SBI	P12,7
(0190)    PORTD|=BIT(RTC_RW);   
    0148 9A96      SBI	P12,6
(0191)    PORTA=add;
    0149 BB6B      OUT	P1B,R22
(0192)    Delayus(5);
    014A E005      LDI	R16,5
    014B E010      LDI	R17,0
    014C DF1D      RCALL	_Delayus
(0193)    PORTD&=~BIT(RTC_AS);		  //锁存地址
    014D 9895      CBI	P12,5
(0194)    PORTD&=~BIT(RTC_RW);		  
    014E 9896      CBI	P12,6
(0195)    PORTA=date;		   		  
    014F BB4B      OUT	P1B,R20
(0196)    Delayus(5);   
    0150 E005      LDI	R16,5
    0151 E010      LDI	R17,0
    0152 DF17      RCALL	_Delayus
(0197)    PORTD|=BIT(RTC_RW);       //写数据  
    0153 9A96      SBI	P12,6
(0198)    PORTD|=BIT(RTC_AS);
    0154 9A95      SBI	P12,5
(0199)    PORTC|=BIT(RTC_CS);				
    0155 9AA8      SBI	P15,0
(0200) }
    0156 940E02EA  CALL	pop_gset2
    0158 9508      RET
_read_ds:
  ds_date              --> R20
  add                  --> R20
    0159 940E02CF  CALL	push_gset1
    015B 2F40      MOV	R20,R16
(0201) 
(0202) uchar read_ds(uchar add)
(0203) {
(0204)    uchar ds_date;  
(0205)    PORTC&=~BIT(RTC_CS);	 		//选通时钟
    015C 98A8      CBI	P15,0
(0206)    PORTD|=BIT(RTC_AS);
    015D 9A95      SBI	P12,5
(0207)    PORTD|=BIT(RTC_DS);
    015E 9A97      SBI	P12,7
(0208)    PORTD|=BIT(RTC_RW);
    015F 9A96      SBI	P12,6
(0209) //   PORTC&=~BIT(RTC_CS);	 		//选通时钟
(0210)    PORTA=add;
    0160 BB4B      OUT	P1B,R20
(0211)    Delayus(5);
    0161 E005      LDI	R16,5
    0162 E010      LDI	R17,0
    0163 DF06      RCALL	_Delayus
(0212)    PORTD&=~BIT(RTC_AS);			//锁存地址   
    0164 9895      CBI	P12,5
(0213)    PORTD&=~BIT(RTC_DS);
    0165 9897      CBI	P12,7
(0214)    DDRA=0;
    0166 2422      CLR	R2
    0167 BA2A      OUT	P1A,R2
(0215) //   PORTA=0XFF;
(0216)    Delayus(5);
    0168 E005      LDI	R16,5
    0169 E010      LDI	R17,0
    016A DEFF      RCALL	_Delayus
(0217)    ds_date=PINA;	   			//读数据
    016B B349      IN	R20,P19
(0218)    DDRA=0XFF;
    016C EF8F      LDI	R24,0xFF
    016D BB8A      OUT	P1A,R24
(0219)    PORTD|=BIT(RTC_DS);
    016E 9A97      SBI	P12,7
(0220)    PORTD|=BIT(RTC_AS);
    016F 9A95      SBI	P12,5
(0221)    PORTC|=BIT(RTC_CS);         
    0170 9AA8      SBI	P15,0
(0222)    return ds_date;	
    0171 2F04      MOV	R16,R20
    0172 940E02D2  CALL	pop_gset1
    0174 9508      RET
(0223) }
(0224) 
(0225) 
(0226) /************************************************************* 
(0227) 函数功能:该函数用来启动时钟芯片工作
(0228) 应用范围:仅在时钟芯片首次使用时用到一次
(0229) 入口参数:
(0230) 出口参数:
(0231) *************************************************************/   
(0232) void StartDs12c887(void)
(0233) {
(0234)    write_ds(chRegA,CMD_START_DS12C887);
_StartDs12c887:
    0175 E220      LDI	R18,0x20
    0176 E00A      LDI	R16,0xA
(0235) }
    0177 CFC9      RJMP	_write_ds
(0236) 
(0237) /************************************************************* 
(0238) 函数功能:该函数用来关闭时钟芯片
(0239) 应用范围:一般用不到
(0240) 入口参数:
(0241) 出口参数:
(0242) *************************************************************/   
(0243) void CloseDs12c887(void)
(0244) {
(0245)    write_ds(chRegA,CMD_CLOSE_DS12C887);
_CloseDs12c887:
    0178 E320      LDI	R18,0x30
    0179 E00A      LDI	R16,0xA
(0246) }
    017A CFC6      RJMP	_write_ds
(0247) /************************************************************* 
(0248) 函数功能:初始化ds12c887
(0249) 应用范围:
(0250) 入口参数:
(0251) 出口参数:
(0252) *************************************************************/   
(0253) void InitDs12c887()
(0254) {
(0255)     StartDs12c887();
_InitDs12c887:
    017B DFF9      RCALL	_StartDs12c887
(0256) 	write_ds(chRegB,chRegB | MASK_SETB_SET);/* 禁止刷新 */
    017C E82B      LDI	R18,0x8B
    017D E00B      LDI	R16,0xB
    017E DFC2      RCALL	_write_ds
(0257) 	write_ds(chRegB,chRegB & MASK_CLR_DM | MASK_SETB_2412 & MASK_CLR_DSE);
    017F E02B      LDI	R18,0xB
    0180 E00B      LDI	R16,0xB
    0181 DFBF      RCALL	_write_ds
(0258)                             
(0259)                 /* 使用BCD码格式、24小时模式、不使用夏令时 */
(0260) 	write_ds(chCenturyChannel,0x21);               /* 设置为21世纪 */
    0182 E221      LDI	R18,0x21
    0183 E302      LDI	R16,0x32
    0184 DFBC      RCALL	_write_ds
(0261) 	write_ds(chRegB,chRegB & MASK_CLR_SET);
    0185 E02B      LDI	R18,0xB
    0186 E00B      LDI	R16,0xB
(0262) }
    0187 CFB9      RJMP	_write_ds
(0263) 
(0264) /************************************************************* 
(0265) 函数功能:该函数用来从时钟芯片读取秒字节
(0266) 应用范围:
(0267) 入口参数:
(0268) 出口参数:
(0269) *************************************************************/   
(0270) unsigned char GetSeconds(void)
(0271) {
(0272)     return(read_ds(chSecondsChannel));
_GetSeconds:
    0188 2700      CLR	R16
    0189 CFCF      RJMP	_read_ds
(0273) }
(0274) 
(0275) /************************************************************* 
(0276) 函数功能:该函数用来从时钟芯片读取分字节
(0277) 应用范围:
(0278) 入口参数:
(0279) 出口参数:
(0280) *************************************************************/   
(0281) unsigned char GetMinutes(void)
(0282) {
(0283)     return(read_ds(chMinutesChannel));
_GetMinutes:
    018A E002      LDI	R16,2
    018B CFCD      RJMP	_read_ds
(0284) }
(0285) 
(0286) /************************************************************* 
(0287) 函数功能:该函数用来从时钟芯片读取小时字节
(0288) 应用范围:
(0289) 入口参数:
(0290) 出口参数:
(0291) *************************************************************/   
(0292) unsigned char GetHours(void)
(0293) {
(0294)     return(read_ds(chHoursChannel));
_GetHours:
    018C E004      LDI	R16,4
    018D CFCB      RJMP	_read_ds
(0295) }
(0296) 
(0297) /************************************************************* 
(0298) 函数功能:该函数用来从时钟芯片读取日字节
(0299) 应用范围:
(0300) 入口参数:
(0301) 出口参数:
(0302) *************************************************************/   
(0303) unsigned char GetDate(void)
(0304) {
(0305)     return(read_ds(chDateChannel));
_GetDate:
    018E E007      LDI	R16,7
    018F CFC9      RJMP	_read_ds
(0306) }
(0307) /************************************************************* 
(0308) 函数功能:该函数用来从时钟芯片读取月字节
(0309) 应用范围:
(0310) 入口参数:
(0311) 出口参数:
(0312) *************************************************************/   
(0313) unsigned char GetMonth(void)
(0314) {
(0315)     return(read_ds(chMonthChannel));
_GetMonth:
    0190 E008      LDI	R16,0x8
    0191 CFC7      RJMP	_read_ds
(0316) }
(0317) 
(0318) /************************************************************* 
(0319) 函数功能:该函数用来从时钟芯片读取年字节
(0320) 应用范围:
(0321) 入口参数:
(0322) 出口参数:
(0323) *************************************************************/   
(0324) unsigned char GetYear(void)
(0325) {
(0326)     return(read_ds(chYearChannel));
_GetYear:
    0192 E009      LDI	R16,0x9
    0193 CFC5      RJMP	_read_ds
(0327) }
(0328) 
(0329) /************************************************************* 
(0330) 函数功能:该函数用来从时钟芯片读取世纪字节
(0331) 应用范围:
(0332) 入口参数:
(0333) 出口参数:
(0334) *************************************************************/   
(0335) unsigned char GetCentury(void)
(0336) {
(0337)     return(read_ds(chCenturyChannel));
_GetCentury:
    0194 E302      LDI	R16,0x32
    0195 CFC3      RJMP	_read_ds
_SetTime:
  chHours              --> Y+4
  chMinutes            --> R20
  chSeconds            --> R22
    0196 940E02E6  CALL	push_gset2
    0198 2F42      MOV	R20,R18
    0199 2F60      MOV	R22,R16
(0338) }    
(0339) 
(0340) /************************************************************* 
(0341) 函数功能:该函数用来设置时钟芯片的时间
(0342) 应用范围:
(0343) 入口参数:chSeconds、chMinutes、chHours是设定时间的压缩BCD码
(0344) 出口参数:
(0345) *************************************************************/   
(0346) void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char 
(0347) chHours)
(0348) {
(0349)    write_ds(chRegB,chRegB | MASK_SETB_SET);  /* 禁止刷新 */
    019A E82B      LDI	R18,0x8B
    019B E00B      LDI	R16,0xB
    019C DFA4      RCALL	_write_ds
(0350)    write_ds(chSecondsChannel,chSeconds);
    019D 2F26      MOV	R18,R22
    019E 2700      CLR	R16
    019F DFA1      RCALL	_write_ds
(0351)    write_ds(chMinutesChannel,chMinutes);
    01A0 2F24      MOV	R18,R20
    01A1 E002      LDI	R16,2
    01A2 DF9E      RCALL	_write_ds
(0352)    write_ds(chHoursChannel,chHours);
    01A3 812C      LDD	R18,4+Y
    01A4 E004      LDI	R16,4
    01A5 DF9B      RCALL	_write_ds
(0353)    write_ds(chRegB,chRegB & MASK_CLR_SET);/* 使能刷新 */
    01A6 E02B      LDI	R18,0xB
    01A7 E00B      LDI	R16,0xB
    01A8 DF98      RCALL	_write_ds
(0354) }
    01A9 940E02EA  CALL	pop_gset2
    01AB 9508      RET
_SetDate:
  chYear               --> Y+4
  chMonth              --> R20
  chDate               --> R22
    01AC 940E02E6  CALL	push_gset2
    01AE 2F42      MOV	R20,R18
    01AF 2F60      MOV	R22,R16
(0355) 
(0356) /************************************************************* 
(0357) 函数功能:该函数用来设置时钟芯片的日期
(0358) 应用范围:
(0359) 入口参数:chDate、chMonth、chYear是设定日期的压缩BCD码
(0360) 出口参数:
(0361) *************************************************************/   
(0362) void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear)
(0363) {

⌨️ 快捷键说明

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