📄 vc3476895557.txt
字号:
#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 + -