for(j=0;j<10;j++);}/*
****************
*************************************************
*//
return(result);}/
**************
*//*检查LCD忙状
态*/
/*lcd_busy为1时,忙,等待。
Icd-busy为0时,闲,可写指令与数据。
*//*******************************************************************
/bitlcd_busy(){bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
****************************************************
*//*写指令数据到
LCD*/
/*RS=L,RW=L,E二高脉冲,D0-D7=^|令码。
*//*
*//*******************************************************************
/voidlcd_wcmd(ucharcmd){while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delay
(1);
LCD_EN=1;
delay
(1);
LCD_EN=
0;}/******************************************************************
*//*
*//*写显示数据到
LCD*/
/*RS=H,RW=LE镐脉冲,。
0-。
7=数据。
*//**//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delay
(1);
LCD_EN=
0;}/
*******************************************************************//*//*LCD初始化设定*//
/voidlcd_init(){P0=0xFF;
P2=0xFF;
delay
(40);
PSB=1;//并口方式。
delay
(1);
RES=0;
delay
(1);
RES=1;
delay
(10);
lcd_wcmd(0x30);
delay
(100);
lcd_wcmd(0x30);
delay
(37);
lcd_wcmd(0x08);
delay
(100);
lcd_wcmd(0x10);
delay
(100);
lcd_wcmd(0x0C);//显示开,关光标delay
(100);
lcd_wcmd(OxO1);//清除LCD的显示内容
delay
(100);
lcd_wcmd(0x06);
delay
(100);}voidmain(){uchari;
InitTIMER0();
Set_RTC();
lcd_init();
//初始化LCD
while
(1){if(ReadRTC_Flag){ReadRTC_Flag=0;
Read_RTC();lcd_pos(0,0);
i=0;
while(dis1[i]!
='\0'){lcd_wdat(dis1[i]);i++;}lcd_pos(1,0);
//设置显示位置为第一行的第1个字符
//显示字符
//设置显示位置为第二行的第1个字符i=0;
while(dis2[i]!
='\0'){lcd_wdat(dis2[i]);
i++;}lcd_pos(2,0);lcd_wdat(dis4[l_tmpdate[6]/16]);
得到十位与个位数。
lcd_pos(2,1);lcd_wdat(dis4[l_tmpdate[6]%16]);
lcd_pos(2,2);
lcd_wdat('-');
lcd_pos(2,3);lcd_wdat(dis4[l_tmpdate[4]/16]);
//显示字符
//DS1302是BCD码,进行处理
lcd_pos(2,4);
lcd_wdat(dis4[l_tmpdate[4]%16]);
lcd_pos(2,5);
lcd_wdat('-');
lcd_pos(2,6);
lcd_wdat(dis4[l_tmpdate[3]/16]);
lcd_pos(2,7);
lcd_wdat(dis4[l_tmpdate[3]%16]);//设置显示位置为第三行的第
1个字符
lcd_pos(3,0);//设置显示位置为第四行的第1个字符
lcd_wdat(dis4[l_tmpdate[2]/16]);
lcd_pos(3,1);
lcd_wdat(dis4[l_tmpdate[2]%16]);
lcd_pos(3,2);
lcd_wdat(':
');
lcd_pos(3,3);
lcd_wdat(dis4[l_tmpdate[1]/16]);
lcd_pos(3,4);
lcd_wdat(dis4[l_tmpdate[1]%16]);
lcd_pos(3,5);
lcd_wdat(':
');
lcd_pos(3,6);
lcd_wdat(dis4[l_tmpdate[0]/16]);
***********************************
lcd_pos(3,7);
lcd_wdat(dis4[l_tmpdate[0]%16]);}}}/**********************
*/
*/
/*
/*设定显示位置*/
/*
/*********************************************************/
voidlcd_pos(ucharX,ucharY){ucharpos;
if(X==0)
{X=0x80;}
elseif(X==1)
{X=0x90;}
elseif(X==2)
{X=0x88;}
elseif(X==3)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址}voidInitTIMER0(void){TMOD|=0x01;〃定时器设置16位
THO=Oxef;〃初始化值
TL0=0xf0;
ET0=1;
TR0=1;
EA=1;}voidWrite_Ds1302_Byte(unsignedchartemp){unsignedchari;for(i=0;i<8;i++)//循环8次写入数据{SCK=0;
SDA=temp&0x01;//每次传输低字节
temp>>=1;//右移一位
SCK=1;}}
/*****************************************************************
***********/
voidWrite_Ds1302(unsignedcharaddress,unsignedchardat){RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();//启动
Write_Ds1302_Byte(address);//发送地址
Write_Ds1302_Byte(dat);//发送数据
RST=0;//恢
复}/******************************************************************
**********/
unsignedcharRead_Ds1302(unsignedcharaddress){unsignedchari,temp=0x00;
RST=0;
_nop_();
SCK=0;_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for(i=0;i<8;i++)//循环8次读取数据{if(SDA)
temp|=0x80;//每次传输低字节
SCK=0;
temp>>=1;//右移一位
SCK=1;}RST=0;
_nop_();//以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return(temp);//返
回}/*
*****************************************************************
**********
voidRead_RTC(void)//读取日历{unsignedchari,*p;
p=read_rtc_address;//地址传递
for(i=0;i<7;i++)//分7次读取秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);
p++;}}
/*****************************************************************
******/
voidSet_RTC(void)//设定日历{unsignedchari,*p,tmp;
for(i=0;i<7;i++){//BCD处理
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8E,0X00);
p=write_rtc_address;//传地址
for(i=0;i<7;i++)//7次写入秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);
p++;}Write_Ds1302(0x8E,0x80);}voidtim(void)interrupt1using1//中断,用于数码管扫描{staticunsignedchari,num;
TH0=0xf5;
TL0=0xe0;
//P0=table[l_tmpdisplay[i]];//查表法得到要显示数字的数码段//P2=table1[i];
i++;if(i==8){i=0;num++;
if(20==num)//隔段时间读取1302的数据。
时间间隔可以调整{ReadRTC_Flag=1;/使/用标志位判断num=0;}}}/*****END************/以上经过在开发板上调试OK。
下面讲一下调试经验与大家分享。
首先用液晶显示DS1302分三步走。
第一步:
搞清楚液晶12864(带字库,方便使用),也就是怎样让其显示汉字及字符。
第二步:
搞清楚DS1302怎样用,怎样写入与显示出时间数据。
第三步:
把上面两步程序合在一起进行调试,当然要注意各端口的定义与连接。
这里并不能修改时间日期,以后会进一步研究。
总之,在液晶显示学习上又进一步了。
路要一步步走。