原理圖在7樓。。!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit write=0; //寫2402的標志
sbit scl=P2^1; //IC總線的位置
sbit sda=P2^0;
sbit RST=P2^5;
sbit CS_DA =P2^4 ;
sbit lcden=P2^5; //LCD使能端
sbit lcdrd=P1^0; //數據命令選擇端
sbit lcdwr=P1^1; //讀寫選端
uchar n,m;
char miao,shi,fen;
sbit k1=P3^4; //開關的位置
sbit k2=P3^5;
sbit k3=P3^6;
sbit beep=P2^3; //蜂鳴器的位置
uchar code t[]="2015-11-01 sun"; //時間
void delay() //延時函數
{;;}
void delays(uint x) //延時函數2
{ uint i,j;
for(i=0;i<x;i++)
for(j=0;j<115;j++);
} //延時X*MS
void start() //啟動信號
{ sda=1;
delay();
scl=1; //SCL高電平
delay();
sda=0; //SDA下降沿的時候
delay();
}
void stop() //停止信號
{ sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //應答信號
{ uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0; //低電平應該成功
delay();
}
void init() //初始化24C16芯片
{
RST=0;
CS_DA =0 ;
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date) //寫一個字符
{ uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{ temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte() //讀一個字符
{ uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{ scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void write_add(uchar a,uchar date) //指定地址寫一個字符
{ start();
write_byte(0xa0); //器件地址
respons();
write_byte(a);
respons();
write_byte(date);
respons();
stop();
}
char read_add(uchar a)
{ uchar date; //指定地址讀一個字符
start();
write_byte(0xa0);
respons();
write_byte(a);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void di() //蜂鳴器函數
{ beep=0;
delays(100);
beep=1;
}
void write_com(uchar com) //寫命令函數
{ lcdrd=0; //選命令端
P0=com;
delays(5);
lcden=1;
delays(5);
lcden=0;
}
void write_date(uchar date) //寫數據函數
{ lcdrd=1; //選擇數據端
P0=date;
delays(5);
lcden=1;
delays(5);
lcden=0;
}
void write_sfm(uchar add,uchar date) //寫時分秒函數
{ uchar shi,ge;
shi=date/10; //分解一個2位數十位和個位
ge=date%10;
write_com(0x80+0x40+add); //設置顯示位置
write_date(0x30+shi); //送液晶顯示十位
write_date(0x30+ge); //送液晶顯示個位
}
void inits() //初始化函數
{ uchar a;
lcdrd=0;
lcden=0;
fen=0; //初始化分鐘設置
miao=0;
shi=0;
n=0;
m=0;
init();
write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
write_com(0x0c); //打開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針自動加1
write_com(0x01); //顯示清0,數據指針清0
write_com(0x80); //顯示初始值位置
for(a=0;a<14;a++)
{
write_date(t[a]);
delays(5);
}
write_com(0x80+0x40+6);
write_date(':'); //寫出時間的兩個冒號
delays(5);
write_date(':');
delays(5);
write_com(0x80+0x40+9); //
write_date(':');
delays(5);
miao=read_add(1); //從AT24c16讀取數據
fen=read_add(2);
shi=read_add(3);
write_sfm(10,miao); //分別送液晶顯示
write_sfm(7,fen);
write_sfm(4,shi);
TMOD=0x01; //定時器0工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //開啟總中斷
ET0=1; //開啟中斷
TR0=1; //開啟定時器0
}
void keyscan() //開關函數
{ if(k1==0)
{ delays(10); //去抖動
if(k1==0) //確認被按下
{ m++;
while(!k1); //等待按鍵釋放
di();
if(m==1) //第一次被按下
{ TR0=0;
write_com(0x80+0x40+10); //光標定位到秒位置
write_com(0x0f); //光標開始閃爍
}
if(m==2) //第二次按下光標閃爍到定位到分位置
{ write_com(0x80+0x40+7);
}
if(m==3) //第三次按下光標閃爍定位到小時位置
{ write_com(0x80+0x40+4);
}
if(m==4) //第四次被按下
{ m=0;
write_com(0x0c);
TR0=1;
}
}
}
if(m!=0) //只有被按下后,才有增大和減小
{ if(k2==0)
{
delays(10); //抖動
if(k2==0) //確認被按下
{ while(!k2);
di(); //每按下按鍵蜂鳴器響一次
if(m==1)
{ miao++; //秒加1
if(miao==60) //滿60后清0
miao=0;
write_sfm(10,miao); //每調節一次送液晶顯示一下
write_com(0x80+0x40+10); //顯示位置重新回到調節處
write_add(1,miao); //數據改變立即存入24C16
}
if(m==2) //第二次被按下
{ fen++; //分加1
if(fen==60) //滿60后 清0
fen=0;
write_sfm(7,fen); //每調節一次送到液晶顯示
write_com(0x80+0x40+7); //顯示回到調節處
write_add(2,fen); //改變的數據立即存入24C16
}
if(m==3) //第三次被按下
{ shi++; //小時加1
if(shi==24) //滿24后清0
shi=0;
write_sfm(4,shi); //每調節一次送液晶顯示一次
write_com(0x80+0x40+4); //顯示位置重新回到調節處
write_add(3,shi); //改變的數據立即存取24C16
}
}
}
if(k3==0)
{ delays(10); //去抖動
if(k3==0) //確認被按下
{ while(!k3);
di(); //第一次被按下秒減1
if(m==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao); //每調節一次送液晶顯示
write_com(0x80+0x40+10); //顯示位置重新回到調節處
write_add(1,miao); //數據改變立即存入24C16
}
if(m==2) //第二次被按下分減1
{ fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen); //每調節一次送液晶顯示
write_com(0x80+0x40+7); //顯示位置重新回到調節處
write_add(2,fen); //數據改變存入24C16
}
if(m==3) //第三次被按小時減1
{shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi); //每調節一次送液晶顯示
write_com(0x80+0x40+4); //顯示位置重新回到調節處
write_add(3,shi); //數據改變立即存入24C16
}
}
}
}
}
void main() //主函數
{ lcdwr=0;
inits();
while(1)
{ keyscan();
}
}
void time()interrupt 1 //定時器0中斷服務
{ TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
n++;
if(n==20) //1秒到了
{ n=0;
miao++; //滿60清0
if(miao==60)
{ miao=0;
fen++;
if(fen==60) //滿60清0
{ fen=0;
shi++;
if(shi==24) //滿24清0
{ shi=0;
}
write_sfm(4,shi); //小時變化則重新寫入
write_add(3,shi); //數據改變麗江存入24C16
}
write_sfm(7,fen); //分鐘變化則重新寫入
write_add(2,fen); //數據改變立即存入24C16
}
write_sfm(10,miao); //秒變化則重新寫入
write_add(1,miao); //數據變化立即存入24C16
}
}
|