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

📄 ds12887.c

📁 高精度时钟芯片。avr驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************
  文件:hongwai.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2008年12月10日 
  功能:红外遥控器数码管键值显示
  备注:
/******************************************/
#include <D:\开发板\OK400C\程序\avr程序\OK400C.H>
#include <stdio.h>			//标准输入输出头文件

/* 命令常量定义 */
#define CMD_START_DS12C887     0x20   
/* 开启时钟芯片 */
#define CMD_START_OSCILLATOR 0x70     
/* 开启振荡器,处于抑制状态 */
#define CMD_CLOSE_DS12C887     0x30   
/* 关掉时钟芯片 */
/* 所有的置位使用或操作,清除使用与操作 */
#define MASK_SETB_SET         0x80            
/* 禁止刷新 */
#define MASK_CLR_SET         0x7f            
/* 使能刷新 */
#define MASK_SETB_DM         0x04            
/* 使用HEX格式 */
#define MASK_CLR_DM             0xfb            
/* 使用BCD码格式 */
#define MASK_SETB_2412         0x02            
/* 使用24小时模式 */
#define MASK_CLR_2412         0xfd            
/* 使用12小时模式 */
#define MASK_SETB_DSE         0x01            
/* 使用夏令时 */
#define MASK_CLR_DSE         0xfe            
/* 不使用夏令时 */

// 寄存器地址通道定义 
#define  chSecondsChannel  0X00
#define  chMinutesChannel  0X02
#define  chHoursChannel    0X04
#define  chDofWChannel     0X06
#define  chDateChannel     0X07
#define  chMonthChannel    0X08
#define  chYearChannel     0X09
#define  chCenturyChannel  0X32
#define  chRegA     0X0a
#define  chRegB     0X0b
#define  chRegC     0X0c
#define  chRegD     0X0d

uchar  temp_data1[3] = {0x00,0x00,0x00};
uchar  temp_data2[3] = {0x00,0x00,0x00};
uchar  display[6] =   {0x00,0x00,0x00,0x00,0x00,0x00}; 
/*******************************************
函数名称: LCD1602_portini
功    能: 初始化1602液晶用到的IO口
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_portini(void)
{
	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
}
/*******************************************
函数名称: LCD1602_readbyte
功    能: 从1602液晶读出一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
返回值  : dByte--读回的数据或者指令
/********************************************/
uchar LCD1602_readbyte(uchar DatCmd)
{
 	uchar dByte;
	if (DatCmd == iCmd)		 //指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;
		
	LCDa_SET_RW;	   	  	 //读操作
	LCDa_SET_E;
	LCDa_DATA_DDR=0x00;	 	 //数据总线定义为输入
	dByte=LCDa_DI;			 //读数据或者指令
	Delayms(1);				 //时序调整
	LCDa_CLR_E;	
	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
	return dByte;
}
/*******************************************
函数名称: LCD1602_sendbyte
功    能: 向1602液晶写入一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	  	  dByte--为写入1602的数据或者指令
返回值  : 无
/********************************************/
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
	if (DatCmd == iCmd)		//指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;		//数据操作
		
	LCDa_CLR_RW;			//写操作操作
	LCDa_SET_E;
	LCDa_DO = dByte;		//写入数据
	Delayms(1);
	LCDa_CLR_E;	
}
/*******************************************
函数名称: LCD1602_sendstr
功    能: 向1602液晶写入一个字符串
参    数: ptString--字符串指针
返回值  : 无
/********************************************/
void LCD1602_sendstr(uchar *ptString)
{
	while((*ptString)!='\0')		 //字符串未结束就一直写
	{
		LCD1602_sendbyte(iDat, *ptString++);
	}
}
/*******************************************
函数名称: LCD1602_clear
功    能: 1602液晶清屏
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_clear(void)
{
	LCD1602_sendbyte(iCmd,LCDa_CLS);//写入清屏指令
	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
}
/*******************************************
函数名称: LCD1602_readBF
功    能: 1602液晶清屏
参    数: 无
返回值  : busy--为1时是忙状态,为0时可以接收指令
/********************************************/
uchar LCD1602_readBF(void)
{	  
	uchar busy;
	busy=LCD1602_readbyte(iCmd);		//读回BF标志(忙标志)和地址
	if(busy&0x80)						//如果忙返回正在忙的状态
		busy=1;
	else	   							//如果不忙,可以写入
		busy=0;
	return busy;
}
/*******************************************
函数名称: LCD1602_gotoXY
功    能: 移动到指定位置
参    数: Row--指定的行
	  	  Col--指定的列
返回值  : 无
/********************************************/
void LCD1602_gotoXY(uchar Row, uchar Col)
{	
	switch (Row)		  //选择行
	{
		case 2:
			LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break;	//写入第2行的指定列	
		default:
			LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break;	//写入第1行的指定列	
	}
}
/*******************************************
函数名称: LCD1602_initial
功    能: 1602液晶初始化
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_initial(void)
{
	Delayms(100);				//上电后等待内部复位
	LCD1602_portini();			//端口初始化
	
	LCD1602_sendbyte(iCmd, LCDa_FUNCTION);	//功能、模式设定,具体的设定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定义
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_sendbyte(iCmd, LCDa_ON);		//打开显示
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_clear();						//清屏
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_sendbyte(iCmd, LCDa_ENTRY);		//输入模式设定		
}

void write_ds(uchar add,uchar date)
{
   PORTC&=~BIT(RTC_CS);		  //选通时钟
   PORTD|=BIT(RTC_AS);
   PORTD|=BIT(RTC_DS);
   PORTD|=BIT(RTC_RW);   
   PORTA=add;
   Delayus(5);
   PORTD&=~BIT(RTC_AS);		  //锁存地址
   PORTD&=~BIT(RTC_RW);		  
   PORTA=date;		   		  
   Delayus(5);   
   PORTD|=BIT(RTC_RW);       //写数据  
   PORTD|=BIT(RTC_AS);
   PORTC|=BIT(RTC_CS);				
}

uchar read_ds(uchar add)
{
   uchar ds_date;  
   PORTC&=~BIT(RTC_CS);	 		//选通时钟
   PORTD|=BIT(RTC_AS);
   PORTD|=BIT(RTC_DS);
   PORTD|=BIT(RTC_RW);
//   PORTC&=~BIT(RTC_CS);	 		//选通时钟
   PORTA=add;
   Delayus(5);
   PORTD&=~BIT(RTC_AS);			//锁存地址   
   PORTD&=~BIT(RTC_DS);
   DDRA=0;
//   PORTA=0XFF;
   Delayus(5);
   ds_date=PINA;	   			//读数据
   DDRA=0XFF;
   PORTD|=BIT(RTC_DS);
   PORTD|=BIT(RTC_AS);
   PORTC|=BIT(RTC_CS);         
   return ds_date;	
}


/************************************************************* 
函数功能:该函数用来启动时钟芯片工作
应用范围:仅在时钟芯片首次使用时用到一次
入口参数:
出口参数:
*************************************************************/   
void StartDs12c887(void)
{
   write_ds(chRegA,CMD_START_DS12C887);
}

/************************************************************* 
函数功能:该函数用来关闭时钟芯片
应用范围:一般用不到
入口参数:
出口参数:
*************************************************************/   
void CloseDs12c887(void)
{
   write_ds(chRegA,CMD_CLOSE_DS12C887);
}
/************************************************************* 
函数功能:初始化ds12c887

⌨️ 快捷键说明

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