本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我用的是12864的液晶,但是我的时钟无法显示出来,编译通过。应该是1302这部分出了问题,但是不懂问题出在哪里,希望高手帮忙!!
unsigned char code digit[10]={"0123456789"}; ? //定义字符数组显示数字
char vary_date[7]={11,4,5,2,12,15,30};//设置初始时间
/*****************************************************
函数功能:向1302写一个字节数据
入口参数:dat
***************************************************/?
void Write1302(unsigned char dat)
{
??unsigned char i;?
??SCLK=0; ? ? ? ? ? ?//拉低SCLK,为脉冲上升沿写入数据做好准备
??delaynus(2); ? ? ? //稍微等待,使硬件做好准备
??for(i=0;i<8;i++) ? ? ?//连续写8个二进制位数据
?? ?{
?? ? SCLK=0;
?? ? DATA=dat&0x01; ? ? //每次传输低字节?
?? ? dat>>=1; ? //右移一位
?? ? SCLK=1;
???}
?}
/*****************************************************
函数功能:根据命令字,向1302写一个字节数据
入口参数:Cmd,储存命令字;dat,储存待写的数据
***************************************************/?
void WriteSet1302(unsigned char Cmd,unsigned char dat)
?{
?? RST=0; ? ? ? ? ? //禁止数据传递
?? SCLK=0; ? ? ? ? ?//确保写数居前SCLK被拉低
RST=1; ? ? ? ? ? //启动数据传输
delaynus(2); ? ? //稍微等待,使硬件做好准备
Write1302(Cmd); ?//写入命令字
Write1302(dat); ?//写数据
SCLK=1; ? ? ? ? ?//将时钟电平置于已知状态
RST=0; ? ? ? ? ? //禁止数据传递
?}
/*****************************************************
函数功能:从1302读一个字节数据
出口参数:dat
***************************************************/?
?unsigned char Read1302(void)
?{
?? unsigned char i,dat;
delaynus(2); ? ? ? //稍微等待,使硬件做好准备
for(i=0;i<8;i++) ? //连续读8个二进制位数据
??{
??? dat>>=1; ? ? ? //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) ? ?//如果读出的数据是1
??dat|=0x80; ? ?//将1取出,写在dat的最高位
??SCLK=1; ? ? ? //将SCLK置于高电平,为下降沿读出
??delaynus(2); ?//稍微等待
??SCLK=0; ? ? ? //拉低SCLK,形成脉冲下降沿
??delaynus(2); ?//稍微等待
???}??
??return dat; ? ? ? ?//将读出的数据返回
} ?
/*****************************************************
函数功能:根据命令字,从1302读取一个字节数据
入口参数:Cmd
***************************************************/?
unsigned char ReadSet1302(unsigned char Cmd)
?{
??unsigned char dat;
??RST=0; ? ? ? ? ? ? ? ? //拉低RST
??SCLK=0; ? ? ? ? ? ? ? ?//确保写数居前SCLK被拉低
??RST=1; ? ? ? ? ? ? ? ? //启动数据传输
??Write1302(Cmd); ? ? ? //写入命令字
??dat=Read1302(); ? ? ? //读出数据
??SCLK=1; ? ? ? ? ? ? ?//将时钟电平置于已知状态
??RST=0; ? ? ? ? ? ? ? //禁止数据传递
??return dat; ? ? ? ? ?//将读出的数据返回
}
/**************************************************
函数功能:读取日历
***********************************/
void Read_RTC(void)
{
??unsigned char i,*p,ReadV;
??p=read_add;
??for(i=0;i<7;i++)
??{ ??
?? ? ReadV=ReadSet1302(*p);
?? ? vary_date=((ReadV&0x70)>>4)*10 + (ReadV&0x0F);
?? ? p++;
??}
}
/***********************************************
函数功能:写设置时钟
************************************/
void Set_RTC(void)
{
?? unsigned char i,*p,readv;
??WriteSet1302(0x8e,0x00);
??p=write_add;
?? for(i=0;i<7;i++)
??{
?? ? ?readv=vary_date;
?? ? ?WriteSet1302(*p,((readv/10)<<4|(readv%10)));
?? ? ?p++;
??}
?? WriteSet1302(0x8e,0x80);
}
?/*****************************************************
函数功能:显示秒
入口参数:x
***************************************************/?
void DisplaySecond(unsigned char x)
{
?unsigned char i,j; ? ?
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(2,6); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //延时1ms给硬件一点反应时间 ? ?
?}
/*****************************************************
函数功能:显示分钟
入口参数:x
***************************************************/?
void DisplayMinute(unsigned char x)
{
?unsigned char i,j; ? ? //j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(2,4); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
/*****************************************************
函数功能:显示小时
入口参数:x
***************************************************/?
void DisplayHour(unsigned char x)
{
?unsigned char i,j; ? ? //j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(2,2); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
?/*****************************************************
函数功能:显示日
入口参数:x
***************************************************/?
void DisplayDay(unsigned char x)
{
?unsigned char i,j; ? ? //j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(1,5); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
?/*****************************************************
函数功能:显示月
入口参数:x
***************************************************/?
void DisplayMonth(unsigned char x)
{
?unsigned char i,j; ? ? //j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(1,3); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
/*****************************************************
函数功能:显示年
入口参数:x
***************************************************/?
void DisplayYear(unsigned char x)
{
?unsigned char i,j; ? ? //j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位 ? ??
?? lcd_pos(1,1); ? ? ? ? ? ?
?? lcd_wdat(digit);
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
/*****************************************************
函数功能:显示周
入口参数:x
***************************************************/?
void DisplayZhou(unsigned char x)
{
?unsigned char j; ? ? //j,k,l分别储存温度的百位、十位和个位
j=x%10;//取个位 ? ??
?? lcd_pos(1,7); ? ? ? ? ? ?
?? lcd_wdat(digit[j]);
delay(50); ? ? ? ? //给硬件一点反应时间 ? ?
?}
/*****************************************************
函数功能:现实时间
********************************************/
void DisplayTime()
{
?? ?DisplayYear(vary_date[0]);
?? ?DisplayMonth(vary_date[1]);?
?? ?DisplayDay(vary_date[2]);
?? ?DisplayZhou(vary_date[3]);
?? ?DisplayHour(vary_date[4]);
?? ?DisplayMinute(vary_date[5]);
?? ?DisplaySecond(vary_date[6]);
}
/*********************************************************
* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
* 主函数 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *
* ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
*********************************************************/
void main()
{
?? ?delay(100); ? ? ? ? ? ? ? ? //上电,等待稳定
?? ?lcd_init(); ? ? ? ? ? ? ? ? //初始化LCD
Set_RTC();
?? ?while(1)
?? {?
?? ?DisplayTime();
?? ?Read_RTC();
?? ?readtemp();
?? ?delay(10);
?? }
}
[ 此帖被shunlovely在2011-04-26 11:42重新编辑 ] |