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

📄 ds12887lcd.c

📁 目标器件: C8051F02x 编译工具: Silicon Laboratories IDE 程序说明:此程序首先对时钟芯片写入初值
💻 C
字号:
//-----------------------------------------------------------------------------
// 版权归新华龙电子公司所有
//-----------------------------------------------------------------------------
//
//文件名:	DS12887LCD.c
//
//编写人:	LC
//
//编写时间:2005/03/10
//
//目标器件: C8051F02x
//
//编译工具: Silicon Laboratories IDE
//
//程序说明:	此程序首先对时钟芯片写入初值,延时后再读取时钟值,并年,月,日,时,分,秒
//			分别显示在LCD屏上。


//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f020.h>          // SFR declarations
#include <intrins.h>

//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define CS12887		0x8300		/*DS12887时间寄存器首地址*/
#define	CS12887A	0x830A		/*DS12887内部寄存器A地址*/
#define	CS12887B	0x830B		/*DS12887内部寄存器B地址*/
#define	CS12887C	0x830C		/*DS12887内部寄存器C地址*/

unsigned long x;
unsigned char *lcdpoint;         /*指向 lcddata数组的指针*/
unsigned char lcd_data_count;    /*要显示的数据个数 */
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
void PORT_Init (void);

/***************************************************************************************
函数名称:	void sleep_ms(WORD count)
功能描述:	延时
输入:		WORD count(所要延时的长度)
输出:		无
全局变量:	无
调用模块:	_nop_()
***************************************************************************************/
void sleep_ms(unsigned int count)
{
  unsigned int ii,jj;
  for(ii=0;ii<count;ii++)
    {
      for(jj=0;jj<250;jj++)
	  _nop_();			
    }	
}

//-----------------------------------------------------------------------------
//函数名称:      SYSCLK_Init ()
//函数功能:      系统时钟初始化
//入口参数:      无
//出口参数:      无
//全局变量引用:  无
//调用模块:      无 
//-----------------------------------------------------------------------------
//
void SYSCLK_Init (void)
{

   OSCICN = 0x05;       /*系统时钟初始化为片内的4MHz*/
                                         
 }
 /***************************************************************************************
函数名称:	void DS12887INIT(void)
功能描述:	初始化时钟芯片并写入时间初值
输入:		无
输出:		无
全局变量:	CS12887,CS12887B,CS12887C,
调用模块:	无
***************************************************************************************/
void DS12887INIT(void)
{
	unsigned char i;
	unsigned char xdata *idata Point1;	
	Point1=CS12887B;
	*Point1=0x80;		/*设置SET=1,禁止时间更新*/
	Point1=CS12887;
	*Point1=0x30;		/*写入当前秒值:"30"秒*/
	Point1++;
	*Point1=0xff;		/*秒不报警(不闹秒)*/
	Point1++;
	*Point1=0x58;		/*写入当前分值:"58"分*/
	Point1++;
	*Point1=0xff;		/*分不报警(不闹分)*/
	Point1++;
	*Point1=0x23;		/*写入当前时值:"23" 时*/
	Point1++;
	*Point1=0xff;		/*时不报警(不闹时)*/
	Point1++;
	*Point1=0x05;		/*写入当前周日:"5"*/
	Point1++;
	*Point1=0x01;		/*写入当前日期:"01"日*/
	Point1++;
	*Point1=0x07;		/*写入当前月份:"07"月*/
	Point1++;
	*Point1=0x05;		/*写入当前年份:"05"年*/
	Point1=CS12887C;
	i=*Point1;			/*CLEAR C*/
	Point1++;
	i=*Point1;			/*CLEAR D*/
	Point1=CS12887B;	/*更新周期正常运行,禁止中断,采用BCD码格式,24[小]时制*/
	*Point1=0x02;		/*不用复时制*/
}


/***************************************************************************************
函数名称:	void PORT_Init(void)
功能描述:	初始化I/O
输入:		无
输出:		无
全局变量:	XBR2,P74OUT,EMI0CF,EMI0TC
调用模块:	无
***************************************************************************************/
void PORT_Init (void)
{
   
   XBR2    = 0x40;      /*时能交叉开关,弱上拉*/
   P74OUT  = 0xff;		/*推挽输出*/
   EMI0CF |= 0x2c;		/*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
   EMI0TC |= 0x6c;		/*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
}

//-----------------------------------------------------------------------------
// //函数名称:   LCD_Init ()
//函数功能:      LCD初始化
//入口参数:      无
//出口参数:      无
//全局变量引用:  无
//调用模块:      无  
//-----------------------------------------------------------------------------
void LCD_Init(void)
{
   P6 = 0x09;
   for(x=0;x<50000;x++);
   //P7 = 0x30;				/*一行显示*/
   P7 = 0x38;				/*两行显示*/
   P6 = 0x08;
   P6 = 0x09; 
   for(x=0;x<1000;x++);
   P7 = 0x0e;				/*显示开,光标显示,光标不闪烁*/
   P6 = 0x08;
   P6 = 0x09;
   for(x=0;x<1000;x++);
   P7= 0x06;				/*显示增加,不平移*/
   P6 = 0x08;
   P6 = 0x09;
   for(x=0;x<5000;x++);
   P7 = 0x01;				/*清屏*/
   P6 = 0x08;
   P6 = 0x09; 
   for(x=0;x<5000;x++);

}
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {
	unsigned char temp,data1;
	unsigned char TimeVal[10];
	unsigned char xdata  *idata Pointm;
	unsigned char HMS[10]={0x70,0x70},YMD[10]={0x02,0x00};	
    /*无效看门狗*/
	WDTCN = 0xde;
   	WDTCN = 0xad;
   	SYSCLK_Init ();			/*初始化系统时钟*/
	PORT_Init ();			/*初始化端口*/
   	DS12887INIT();			/*初始化时钟芯片*/
    LCD_Init();             /*LCD初始化*/
   	sleep_ms(4000);
	do{
		temp=temp&0x7f;		/*UIP=0*/
		Pointm=CS12887A;	/*判断更新周期结束否?查询UIP位*/
		temp=*Pointm;
		temp=temp&0x80;		/*UIP=0,时钟更新已经完成,可以读取时钟值*/
	}while(temp==0x80);		/*UIP=1,时钟更新周期正在进行,不能读取时钟值,需继续等待*/
	while(1)
	{
   		P7 = 0x02;			/*回到起始位置*/
   		P6 = 0x08;
   		P6 = 0x09; 
   		Pointm=CS12887;
		for(temp=0;temp<10;temp++)	/*读时间寄存器*/
		{
			TimeVal[temp]=*Pointm;
			Pointm++;
			switch(temp){	/*准备待显示的时间数据*/
				case 0x00:
					HMS[7]=0x0a;
					HMS[8]=(TimeVal[temp]>>4);
					HMS[9]=TimeVal[temp]&0x0f;
					break;
				case 0x02:
					HMS[4]=0x0a;
					HMS[5]=(TimeVal[temp]>>4);
					HMS[6]=TimeVal[temp]&0x0f;
					break;
				case 0x04:
					HMS[2]=(TimeVal[temp]>>4);
					HMS[3]=TimeVal[temp]&0x0f;
					break;
				case 0x07:
					YMD[7]=0x0a;
					YMD[8]=(TimeVal[temp]>>4);
					YMD[9]=TimeVal[temp]&0x0f;
					break;
				case 0x08:
					YMD[4]=0x0a;
					YMD[5]=(TimeVal[temp]>>4);
					YMD[6]=TimeVal[temp]&0x0f;
					break;
				case 0x09:
					YMD[2]=(TimeVal[temp]>>4);
					YMD[3]=TimeVal[temp]&0x0f;
					break;
				default:
					_nop_();
			}
		}
		Pointm=CS12887C;
		temp=*Pointm;			/*CLEAR C*/
		Pointm++;
		temp=*Pointm;			/*CLEAR D*/
		Pointm=CS12887B;	/*更新周期正常运行,禁止中断,采用BCD码格式,24[小]时制*/
		*Pointm=0x02;		/*不用复时制*/
		_nop_();
	    P6  = 0x0d;                             //准备送数据
	    for(x=0;x<5000;x++);
	    lcdpoint=&YMD;
	    for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--)     //显示第一行字符
	    { 
		    data1=*lcdpoint;
			data1 += 0x30;		/*转化成字符码*/
		    P7 = data1; 		/*送字符数据*/
			P6 = 0x0c;
	        P6 = 0x0d;
	        lcdpoint++;
			for(x=0;x<100;x++);
		}
		P6 = 0x09;
	   	P7 = 0xc0;		/*切换到第二行*/
   		P6 = 0x08;		//P6 = 0x0c;
   		P6 = 0x09; 		//P6 = 0x0d;
   		for(x=0;x<1000;x++);
	    lcdpoint=&HMS;
	    for(lcd_data_count=10;lcd_data_count>0;lcd_data_count--)     //显示第二行字符
	    { 
		    data1=*lcdpoint;
			data1 += 0x30;		/*转化成字符码*/
		    P7 = data1; 		/*送字符数据*/
			P6 = 0x0d;
	        P6 = 0x0c;
	        lcdpoint++;
			for(x=0;x<100;x++);
		}
	}
}


⌨️ 快捷键说明

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