一套程序下來LCD 就顯示第一行 : :
第二行00:00:00 然后不動了
預計是LCD 顯示沒問題 問題應該是 處在 DS1302 的 操作上 苦想 幾日都無法找出原因 才到此地求救,求各位高手指點一二。謝謝。
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^4;
sbit rw=P2^5;
sbit e=P2^6;
sbit clk=P2^3;
sbit ds=P2^2;
sbit rst=P2^1;
sbit bf=P0^7;
uchar code shu[]="0123456789";
uchar code yihang[]=" - - ";
uchar code erhang[]=" : : ";
uchar i,j,miao,fen,shi,ri,yue,nian,xingqi,dsshu;
void delayus(unsigned char n)
{
unsigned char i;
for(i=0;i0;x--)
for(y=100;y>0;y--);
}
bit lcdmang(void) //LCD 忙=1 不忙=0
{
bit mang;
rs=0;
rw=1;
e=1;
delayus(4);
mang=bf;
e=0;
return mang;
}
void lcddate(uchar date)//寫數據
{
while(lcdmang()==1);
rs=1;
rw=0;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void lcdcom(uchar com)//寫指令
{
while(lcdmang()==1);
rs=0;
rw=0;
P0=com;
delay(5);
e=1;
delay(5);
e=0;
}
void init()
{
i=0;
lcdcom(0x38);
lcdcom(0x0c);
lcdcom(0x06);
lcdcom(0x01);
lcdcom(0x80+0x00);
while(yihang!='\0')
{
lcddate(yihang);
i++;
delay(20);
}
lcdcom(0x80+0x40);
i=0;
while(erhang!='\0')
{
lcddate(erhang);
i++;
delay(20);
}
i=0;
}
/*LCD顯示子程序部分*/
/*1302子程序部分*/
void dsxie(uchar com,uchar date)//com為命令,date為數據
{
rst=0;
clk=0;
delay(2);
rst=1;
delay(2);
for(i=0;i<8;i++)
{
clk="0;
" delayus(2);
ds="com&0x01;
" delayus(2);
clk="1;
" delayus(2);
com="com" >>=1;
}
for(i=0;i<8;i++)
{
clk="0;
" delayus(2);
ds="date&0x01;
" delayus(2);
clk="1;
" delayus(2);
date="date" >>=1;
delayus(2);
}
rst=0;
}
unsigned char dsdu(uchar com) //com為命令 返回讀出數據
{
unsigned char dsshu;
rst=0;
clk=0;
rst=1;
delayus(2);
for(i=0;i<8;i++)
{
clk="0;
" delayus(2);
ds="com&0x01;
" delayus(2);
clk="1;"
delayus(2);
com="com" >>=1;
delayus(2);
}
for(i=0;i<8;i++)
{
dsshu="dsshu" >>1;
delayus(2);
if(ds==1)
dsshu|=0x80;
delayus(2);
clk=1;
delayus(2);
clk=0;
delayus(2);
}
rst=0;
return dsshu;
}
void dsinit() //向LCD 寫初始化數據
{
dsxie(0x8e,0x00);
dsxie(0x80,0x00);//miao
dsxie(0x82,0x00);//fen
dsxie(0x84,0x00);//shi
dsxie(0x86,0x00);//ri
dsxie(0x88,0x00);//yue
dsxie(0x8a,0x01);//xingqi
dsxie(0x8c,0x11);//nian
}
dsdudll(void)// 1302全部讀出
{
miao=(dsdu(0x81)&0x7f)/16*10+(dsdu(0x81)&0x7f)%16;
fen=(dsdu(0x83)&0x7f)/16*10+(dsdu(0x83)&0x7f)%16;
shi=(dsdu(0x85)&0x7f)/16*10+(dsdu(0x85)&0x7f)%16;
ri=(dsdu(0x87)&0x7f)/16*10+(dsdu(0x87)&0x7f)%16;
yue=(dsdu(0x89)&0x7f)/16*10+(dsdu(0x89)&0x7f)%16;
nian=dsdu(0x8d)/16*10+dsdu(0x8d)%16;
}
void main()
{
init();
dsinit();
while(1)
{
dsdudll();
lcdcom(0x80+0x46);
lcddate(shu[miao/10]);
lcddate(shu[miao%10]);
lcdcom(0x80+0x43);
lcddate(shu[fen/10]);
lcddate(shu[fen%10]);
lcdcom(0x80+0x40);
lcddate(shu[shi/10]);
lcddate(shu[shi%10]);
}
} |