MSP430与DS1302之1602显示
typedef unsigned char uchar;
typedef unsigned int uint;
/**************宏定义***************/
#define DataDir P4DIR
#define DataPort P4OUT
#define Busy 0x80
#define CtrlDir P3DIR
#define CLR_RS P3OUT&=~BIT0; //RS = P3.0
#define SET_RS P3OUT|=BIT0;
#define CLR_RW P3OUT&=~BIT1; //RW = P3.1
#define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT2; //EN = P3.2
#define SET_EN P3OUT|=BIT2;
/**************宏定义***************/
#define DS_RST BIT7 //DS_RST = P2.7
#define DS_SCL BIT5 //DS_SCL = P2.5
#define DS_SDA BIT6 //DS_SDA = P2.6
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P2DIR &= ~DS_SCL
#define DS_SCL_OUT P2DIR |= DS_SCL
#define DS_SCL0 P2OUT &= ~DS_SCL
#define DS_SCL1 P2OUT |= DS_SCL
#define DS_SDA_IN P2DIR &= ~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &= ~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN & DS_SDA
ucharflag;//定义一个读标志位
uchar second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年
/*******************************************
函数名称:delay
功 能:延时一段时间
参 数:time--延时长度
********************************************/
void delay(uint time)
{
uint i;
for(i = 0;i < time;i++) _NOP();
}
/*******************************************
函数名称:Delay5ms 功 能:延时约5ms
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
/*******************************************
函数名称:WaitForEnable
功 能:等待1602液晶完成内部操作
********************************************/
void WaitForEnable(void)
{
P4DIR &= 0x00; //将P4口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR |= 0xFF; //将P4口切换为输出状态
}
/*******************************************
函数名称:write_com
功 能:向液晶模块写入命令
********************************************/
void write_com(uchar cmd)
{
WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:write_data
功 能:向液晶显示的当前地址写入显示数据
参 数:data--显示字符数据
返回值 :无
********************************************/
void write_data( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
void Write1602(uchar add,uchar dat)
{
write_com(add);
write_data(dat);
}
void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_data(*ch++);
Delay5ms();
}
/*******************************************
函数名称:LcdReset
功 能:对1602液晶模块进行复位操作
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状态
DataDir = 0xFF; //数据端口设为输出状态
write_com(0x38);//规定的复位操作
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);//显示模式设置
write_com(0x06);//写字符时整体不移动
write_com(0x0c);//显示开,不开游标,不闪烁
write_com(0x01);//显示清屏
Write1602(0x80,2);
Write1602(0x81,0);
Write1602(0x80+4,-);
Write1602(0x80+7,-);
Write1602(0x80+0x40+5,:);
Write1602(0x80+0x40+8,:);
}
/*******************************************
函数名称:Reset_DS1302
功 能:对DS1302进行复位操作
********************************************/
void Reset_DS1302(void)
{
DS_RST_OUT; //RST对应的IO设置为输出状态
DS_SCL_OUT; //SCLK对应的IO设置为输出状态
DS_SCL0; //SCLK=0
DS_RST0; //RST=0
delay(10);
DS_SCL1; //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功 能:对DS1302写入1个字节的数据
********************************************/
void Write_Byte(uchar wdata)
{
uchar i;
DS_SDA_OUT; //SDA对应的IO设置为输出状态
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
if(wdata&0x01)
DS_SDA1;
else
DS_SDA0;
DS_SCL0;
delay(10);
DS_SCL1;
delay(10);
wdata>>= 1;
}
}
/*******************************************
函数名称:Read1Byte
功 能:从DS1302读出1个字节的数据
********************************************/
uchar Read_Byte()
{
uchar i;
uchar rdata = 0X00;
DS_SDA_IN; //SDA对应的IO设置为输入状态
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
DS_SCL1;
delay(10);
DS_SCL0;
delay(10);
rdata >>= 1;
if(DS_SDA_BIT)
rdata |= 0x80;
}
return(rdata);
}
/*******************************************
函数名称:Write_dat
功 能:向某个寄存器写入一个字节数据
参 数:add--寄存器地址
dat--写入的数据
********************************************/
void Write_dat(uchar add, uchar dat)
{
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write_Byte(add); //写入地址
Write_Byte(dat); //写入数据
DS_SCL1;
DS_RST0;
}
/*******************************************
函数名称:Read_dat
功 能:从某个寄存器读出一个字节数据
参 数:addr--寄存器地址
返回值 :读出的数据
********************************************/
uchar read_1302add(uchar add)
{
uchar rdata;
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write_Byte(add); //写入地址
rdata = Read_Byte(); //读出数据
DS_SCL1;
DS_RST0;
return(rdata);
}
/***********初始化1302*************/
void init_1302()
{
flag=read_1302add(0x81);//读秒寄存器最高位,读出时钟状态
if(flag&0x80);//判断时钟是否关闭,若内部关闭,则初始化,否则继续走
{
Write_dat(0x8e,0x00);
Write_dat(0x80,((55/10)<4|(55%10)));//写秒寄存器,并写入初值55
Write_dat(0x82,((59/10)<4|(59%10)));//写分寄存器,并写入初值59
Write_dat(0x84,((22/10)<4|(22%10)));//写小时寄存器,并写入初值23
Write_dat(0x86,((24/10)<4|(24%10)));//写日寄存器,并写入初值18
Write_dat(0x88,((2/10)<4|(2%10)));//写月寄存器,并写入初值2
Write_dat(0x8a,((5/10)<4|(5%10)));//写周寄存器,并写入初值5
Write_dat(0x8c,((12/10)<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年
Write_dat(0x90,0xa5);//写充电方式
Write_dat(0x8e,0x80);//加上写保护
}
}
/*****************读出秒的十进制数***************************/
MSP430DS13021602显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)