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

📄 vc3476895557.txt

📁 X1226的读写子程序 以及LCD液晶显示程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include "MSP430x14x.h"
//P3.1  SCL
//P3.3  SDA
/*
 *	定义X1226
 */
#define SDA_1       P3OUT |=  BIT3              //SDA = 1
#define SDA_0       P3OUT &=~ BIT3              //SDA = 0
#define SCL_1       P3OUT |=  BIT1              //SCL = 1
#define SCL_0       P3OUT &=~ BIT1             //SCL = 0
#define DIR_IN      P3DIR &=~ BIT3             //I/O Input
#define DIR_OUT     P3DIR |=  BIT3+BIT1         //I/0 Output
#define SDA_IN      ((P3IN >> 3) & 0x01)        //Read SDA
/*
 *	定义按键
 */
#define PB_DATA     (1 << 0)                    // Push Button 0, show data      : P2.0
#define PB_FUN      (1 << 1)                    // Push Button 1, switch Time    : P2.1
#define PB_ALT      (1 << 2)                    // Push Button 2, Alternate	     : P2.2
#define PB_INC      (1 << 3)                    // Push button 3, Increase value : P2.3

/*
 *	定义液晶显示
 */
//P1.1 DA
//P1.2 /WR
//P1.3 /RD
//P1.4 /CS

#define DA_1        P1OUT |=  BIT1              //DA = 1
#define DA_0        P1OUT &=~ BIT1              //DA = 0
#define WR_1        P1OUT |=  BIT2              //  /WR = 1
#define WR_0        P1OUT &=~ BIT2              //  /WR = 0
#define RD_1        P1OUT |=  BIT3              //  /RD = 1
#define RD_0        P1OUT &=~ BIT3              //  /RD = 0
#define CS_1        P1OUT |=  BIT4              //  /CS = 1
#define CS_0        P1OUT &=~ BIT4              //  /CS = 0
#define DA_DIR_IN      P1DIR &=~ BIT1       //I/O    input
#define DA_DIR_OUT     P1DIR |= BIT1+BIT2+BIT3+BIT4            //I/0    Output
#define DA_IN          ((P1IN >> 1) & 0x01)       //Read DA

#define ON 1
#define OFF 0
#define COMMONDMARK 12        //命令标志位
#define DATAMARK    13        
#define COMMONDFLAG 0  
#define DATAFLAG    1
#define HAVEDOT     1
#define HAVENODOT   0
#define HAVEMARK    1
#define HAVENOMARK  0

static unsigned char data[13];
unsigned char fyear, fmonth, fday;
unsigned char fhour, fminute, fsecond;

unsigned char FUN,POINT,Temp_Time;


unsigned char rtc_buffer[8],Final[8],count=0;
unsigned char BcdtoDec(unsigned char bcd)
{							//注意,BCD低4位不能大于9,最高位是控制位。
	unsigned char data;
	data=bcd&0x0f;        //取BCD低4位
	bcd=bcd&0x070;       //剔除BCD的最高位和低4位。
	data+=(bcd>>1);
	data+=bcd>>3;         //用位移代替乘法运算
	return data;
}

unsigned char DectoBcd(unsigned char dec){  //注意DEC数值,比如日大于了相应月的最大日期,x1226将会错乱。
	unsigned char bcd;
	bcd=0;
	while(dec>=10){              
		dec-=10;                         
		bcd++;
	} 
	bcd<<=4;
	bcd|=dec;
//	bcd|=0x80;
	return bcd;
}

static void Delay(unsigned int n)
{
   unsigned int i;
   for (i=0; i<n; i++) 
   {
      ;
   }
}

void Init(void)
{
  SCL_1;
  Delay(5);
  SDA_1;
  Delay(5);
}

void Start(void)
{
  SDA_1;
 Delay(5);
  SCL_1;
 Delay(5);
  SDA_0;
 Delay(5);
  SCL_0;
 Delay(5);
}

void Stop(void)
{
  SDA_0;
 Delay(5);
  SCL_1;
 Delay(5);
  SDA_1;
 Delay(5);
}

void WriteByte(unsigned char WriteData)
{
  unsigned char i;
  for (i=0; i<8; i++)
  {
    SCL_0;
    Delay(5);
    if (((WriteData >> 7) & 0x01) == 0x01)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    Delay(5);
    WriteData = WriteData << 1;
    SCL_1;
    Delay(5);
  }
  SCL_0;
  SDA_1;

  Delay(5);
}


void ReceiveAck(void)
{
  unsigned char i = 0,temp_SDA;
  P3DIR &=~ BIT3;
  Delay(1);
  SCL_1;
  Delay(5);
  temp_SDA=SDA_IN;
  while(temp_SDA)
  {
    temp_SDA=SDA_IN;
    i++;
    if(i>10)
    {
       count++;
       break;
       }
  }
  P3DIR|=BIT3;
  SCL_0;
  Delay(5);
}

unsigned char ReadByte(void)
{
 
  unsigned char i;
  unsigned char TempBit  = 0;
  unsigned char TempData = 0;
  /*SDA_1;
  DIR_IN;
  for (i=0; i<8; i++)
  {
    //DIR_IN;
    Delay(5);
    SCL_1;
    Delay(5);*/
   SCL_0;
   Delay(5);
   SDA_1;
    DIR_IN;
  for (i=0; i<8; i++)
  {
    Delay(5);
    SCL_1;
    Delay(5);
    if (SDA_IN == 0x01 )  /*sda==1*/
    {
      TempBit = 1;
    }
    else
    {
      TempBit = 0;
    }
    //DIR_OUT;
    Delay(2);
    SCL_0;
    TempData = (TempData << 1) | TempBit;
  }
  DIR_OUT;
  Delay(5);
  //SDA_1;
  return(TempData);
}


void Acknowledge(void)
{
  SCL_0;
  Delay(5);
  DIR_OUT;
 //
  SDA_0;
  Delay(5);
  SCL_1;
  Delay(5);
  SCL_0;
  Delay(5);
}
void No_Acknowledge(void)
{
  	SDA_1;
	Delay(5);
	SCL_1;
	Delay(3);
	SCL_0;
	Delay(5);
}
/*====================================================================================*/

/*-----------以下为X1226的读写子程序 2004.12.28日加*/
/*------------------------------------------------------------------------*/
/*写入从begin_add(可以被8整除)开始的8字节数据,数据在rtc_buffer[]中*/

void Write_Rtc_Addr(unsigned char X1226_Addr )
{
	Init();
	Start();
	WriteByte(0xDE);                         /*器件地址,CPU写x1226-RTC*/
	ReceiveAck();
	WriteByte(0x00);                           /*RTC状态寄存器地址-高字节*/
	ReceiveAck();
	WriteByte(0x3f);                           /*RTC状态寄存器地址-低字节*/
	ReceiveAck();
	WriteByte(0x02);                           /*RTC状态寄存器地址-低字节*/
	ReceiveAck();
	Stop();	
	Delay(2);
	
	Start();
	WriteByte(0x0DE);                         /*器件地址,CPU写x1226-RTC*/
	ReceiveAck();
	WriteByte(0x00);                           /*RTC状态寄存器地址-高字节*/
	ReceiveAck();
	WriteByte(0x3f);                           /*RTC状态寄存器地址-低字节*/
	ReceiveAck();
	WriteByte(0x06);
	ReceiveAck();
	Stop();
	Delay(5);
	
	Start();
	WriteByte(0x0DE);                          /*器件地址,CPU写x1226-RTC*/
	ReceiveAck();
	WriteByte(0x00);                           /*RTC状态寄存器地址-高字节*/
	ReceiveAck();
	WriteByte(X1226_Addr);                      /*RTC状态寄存器地址-低字节*/
	ReceiveAck();
}
void  Write_Rtc(unsigned char begin_add)
{
	unsigned char i;
	Write_Rtc_Addr(begin_add);
	for (i=0;i<8;i++)
	{
	    WriteByte(rtc_buffer[i]);				/*写入数据*/
		ReceiveAck();
	}
	Stop();
}
void Write_Rtc_One(unsigned char Address,unsigned char Data)
{	
	Write_Rtc_Addr(Address);
	WriteByte(Data);
	ReceiveAck();
	Stop();
}
void  Write_Sta(unsigned char sta_data)
{
	unsigned char count;
	Init();				/*初始化端口*/
	for(count=0;count<=100;count++)     /*循环读200次,不行就退出,防止死循环*/
	{
		Start();
		WriteByte(0x0de);     /*器件地址,CPU写x1226-RTC*/
		ReceiveAck();
		WriteByte(0x00);           /*RTC状态寄存器地址-高字节*/
		ReceiveAck();
		WriteByte(0x3F);           /*RTC状态寄存器地址-低字节*/
	    ReceiveAck();
		WriteByte(sta_data);
		ReceiveAck();
		Stop();
		Delay(5);

	}
}

/*-----------------------------------------------------------------------*/
/*读X1226实时时钟的8个字节,入口参数为该8个子节的起始地址begin_add(可以被8整除)
读出的数据位于rtc_buffer中*/
void Read_Rtc_Addr(unsigned char begin_add)
{
	Init();					 /*初始化端口*/  
	Start();
	WriteByte(0xde);			   /*器件地址,CPU写x1226-RTC*/
	ReceiveAck();
	WriteByte(0x00);              /*RTC内部地址高字节*/
	ReceiveAck();
	WriteByte(begin_add);       /*RTC内部地址低字节*/
	ReceiveAck();
	
	Start();
	WriteByte(0x0Df);			 /*器件地址,设置数据传送方向,从eeprom到cpu*/
	ReceiveAck();
}
void Read_Rtc(unsigned char Address)
{
	unsigned char i;
	Read_Rtc_Addr(Address);
		for (i=0;i<7;i++)
		{ 
			rtc_buffer[i]=ReadByte();
			Acknowledge();
			//Final[i]=BcdtoDec(rtc_buffer[i]);
			//rtc_buffer[i]=BcdtoDec(rtc_buffer[i]);
		}
		rtc_buffer[i]= ReadByte();
		//Final[i]=BcdtoDec(rtc_buffer[i]);
        No_Acknowledge();
		//rtc_buffer[i]=BcdtoDec(rtc_buffer[i]);
		Stop();
		rtc_buffer[2]=rtc_buffer[2]&0x7f;
		for(i=0;i<8;i++)
		{
			Final[i]=BcdtoDec(rtc_buffer[i]);
		}
	
}
unsigned char  Read_Rtc_One(unsigned char Address)
{
	unsigned char Temp_Time=0;
	Read_Rtc_Addr(Address);
	Temp_Time=ReadByte();
	No_Acknowledge();
	Stop();
	return(Temp_Time);
}
/*============================================*/
void init_x1226(void) /*初始化X1226*/
{
	Read_Rtc(0x38); /*读RTC状态字节,若完全掉电,则复位之*/
	if ( rtc_buffer[7] & 0x01 )
	{ /*设置默认时间*/
		rtc_buffer[7]=0x20; rtc_buffer[6]=0x05; /*默认值=20世纪,星期五*/
		rtc_buffer[5]=0x05; rtc_buffer[4]=0x01; /*默认值=05年,1月*/
		rtc_buffer[3]=0x10; rtc_buffer[2]=0x92; /*默认值=10号,12时,最高位的1表示24小时制*/
		rtc_buffer[1]=0x0;rtc_buffer[0]=0x0; /*默认值=0分,0秒位*/
		Write_Rtc(0x30);

		/*设置1分钟输出1个中断信号于alarm1*/
		rtc_buffer[7]=0x20; rtc_buffer[6]=0x05; /*默认值=20世纪,星期五*/
		rtc_buffer[5]=0x05; rtc_buffer[4]=0x01; /*默认值=03年,10月*/
		rtc_buffer[3]=0x10; rtc_buffer[2]=0x12; /*默认值=10号,12时,最高位的1表示24小时制*/
		rtc_buffer[1]=0x00;rtc_buffer[0] =0x80; /*默认值=0分,0秒位*/
		Write_Rtc(0x00);

		/*设置控制寄存器10~13*/
		rtc_buffer[7]=0x00;  rtc_buffer[6]=0x00;
		rtc_buffer[5]=0x00;  rtc_buffer[4]=0x00;
		rtc_buffer[3]=0x00;  rtc_buffer[2]=0x00;
		rtc_buffer[1]=0xa0;  rtc_buffer[0] =0x00; /*警报1输出*/
		Write_Rtc(0x10);
	}
}

/*
 *	液晶显示程序
 */
void Init_cpu(void)
{
	CS_1;
	WR_1;
	fyear=fmonth=fday=0;
	fhour=fminute=fsecond=0;
}

void send(unsigned char zeroorone)  //写位节
{
	WR_0;
	if (zeroorone==1) 
	{
		DA_1;
	}
	else
	{
		DA_0;
	}
	WR_1;

}

void _sendbyte(unsigned char nCount)  //写字节
{
	unsigned char i;
	unsigned char temp;
	for (i=0;i<8;i++)
	{
		if (i>0)
		{
			nCount=nCount<<1;
		}		
		temp=nCount & 0x80;  //0b10000000;
		if (temp==0x80)
		{
			send(1);
		}
		else
		{
			send(0);
		}


	}
	
}

void _sendsinglebyte(unsigned char nCount,unsigned char flag)  //写单个字
{
	//unsigned char i;
	//unsigned char temp;
	
	if (flag==COMMONDFLAG)   //写命令
	{
		send(1);
		send(0);
		send(0);
	}
	else if (flag==DATAFLAG) //写数据
	{
		send(1);
		send(0);
		send(1);
		send(0);
	}
	_sendbyte(nCount);
	send(0);
	
}

void sendsinglebyte(unsigned char nCount,unsigned char flag)
{
	CS_0;
	_sendsinglebyte(nCount,flag);
	CS_1;

}
void Init_ledscreen(void)      
{   	
	unsigned char undata;
	undata=0x24   ;  //0B00100100;       //写入模块专用初始化命令
	sendsinglebyte(undata,COMMONDFLAG);  
	undata=0x18  ;  //0b00011000;        //100 0001 1000 定义内部RC 振荡方式
	sendsinglebyte(undata,COMMONDFLAG);
	undata=0x01 ;  //0b00000001;         //100 0000 0001 开振荡器
	sendsinglebyte(undata,COMMONDFLAG);
	undata=0x03;//0b00000011;            //100 0000 0011 开显示器
	sendsinglebyte(undata,COMMONDFLAG);
}

void clearall(void ) 
{
         unsigned char temp;
         unsigned char i;
         CS_0;
	 temp=0x28;  //0b00101000;
	_sendsinglebyte(temp,DATAFLAG);
	for (i=0;i<27;i++)
	{
		send(0);
		send(0);
		send(0);
		send(0);
	}
	CS_1;

}

void clear(unsigned char index)
{
	unsigned char addr;
	if (index>8 || index<=0 )
	{
		return;
	}
	switch(index) {
	case 1:	
		addr=0xe8;//0B11101000;
		break;
	case 2:	
		addr=0xD0;//0b11010000;
		break;
	case 3:
		addr=0xb0;//0b10110000;
		break;
	case 4:
		addr=0x98;//0b10011000;
		break;
	case 5:
		addr=0x78;//0b01111000;
		break;
	case 6:
		addr=0x60;//0b01100000;
		break;
	case 7:
		addr=0x40;//0b01000000;
		break;
	case 8:	
		addr=0x28;//0b00101000;
		break;
	default:
		break;
	}
	CS_0;
	_sendsinglebyte(addr,DATAFLAG);
	_sendbyte(0x00);
	CS_1;

⌨️ 快捷键说明

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