📄 电子钟带生肖.c
字号:
write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
updata (); //刷新数据
lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void){//(2008年1月1日00时00分00秒星期一)
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x02);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x12);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char Writeaddr,unsigned char Writedata)
{
unsigned char i;
clock_clk=0;
Delay(1);
clock_Rst=1;
Delay(1);
for(i=8;i>0;i--)
{
clock_clk=0;
clock_dat=Writeaddr&0x01;
Delay(1);
clock_clk=1;
Writeaddr=Writeaddr>>1;
}
for(i=8;i>0;i--)
{
clock_clk=0;
clock_dat=Writedata&0x01;
Delay(1);
clock_clk=1;
Writedata=Writedata>>1;
}
clock_Rst=0;
Delay(1);
clock_clk=0;
Delay(1);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char Readaddr)
{
unsigned char i;
unsigned char value=0;
clock_clk=0;
Delay(1);
clock_Rst=1;
Delay(1);
for(i=8;i>0;i--)
{
clock_clk=0;
clock_dat=Readaddr&0x01;
Delay(1);
clock_clk=1;
Readaddr=Readaddr>>1;
}
for(i=8;i>0;i--)
{
value=value>>1;
clock_clk=1;
Delay(1);
clock_clk=0;
if(clock_dat==1)
{
value=value|0x80;
}
Delay(1);
}
clock_Rst=0;
Delay(1);
clock_clk=0;
Delay(1);
return value;
}
/*****************************************************************************/
//向LCM中填写 年 数据
void lcm_w_yy(void){
//if(read_clock(0x8d) != yy){
yy = read_clock(0x8d);
lcm_w_test(0,0x81);
lcm_w_word("20");
lcm_w_test(0,0x83);
lcm_w_word("年");
lcm_w_test(0,0x82);
lcm_w_test(1,(yy/16)+0x30);
lcm_w_test(1,yy%16+0x30);
} //}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
//if(read_clock(0x89) != mo){
mo = read_clock(0x89);
lcm_w_test(0,0x90);
if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隐
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,mo%16+0x30);
lcm_w_test(0,0x91);
lcm_w_word("月");
} //}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
unsigned char sel;
//if(read_clock(0x8b) != xq){
xq = read_clock(0x8b);
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
if(sel==7) {lcm_w_word("日");} //
if(sel==6) {lcm_w_word("六");} //
if(sel==5) {lcm_w_word("五");} //
if(sel==4) {lcm_w_word("四");} //
if(sel==3) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
if(sel==2) {lcm_w_word("二");} //
if(sel==1) {lcm_w_word("一");} //星期一
lcm_w_test(0,0x95);
lcm_w_word("星期");
//}
}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
// if(read_clock(0x87) != dd){
dd = read_clock(0x87);
lcm_w_test(0,0x92);
if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隐
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,dd%16+0x30);
lcm_w_test(0,0x93);
lcm_w_word("日 ");
} //}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
if(read_clock(0x85) != hh){
hh = read_clock(0x85);
if (hh > 0x07 && hh < 0x22 && w == 0){
beep = 0;
DelayM(100);
beep = 1;
}
}
lcm_w_test(0,0x88);
lcm_w_test(1,(hh/16)+0x30);
lcm_w_test(1,hh%16+0x30);
} //}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
if(read_clock(0x83) != mm){
mm = read_clock(0x83);
if( w == 0){
days(); //节日显示
updata (); //刷新数据
}
}
lcm_w_test(0,0x89);
lcm_w_test(1,0x3a); //":"
lcm_w_test(1,(mm/16)+0x30);
lcm_w_test(1,mm%16+0x30);
lcm_w_test(1,0x3a); //"."
}
/*****************************************************************************/
//刷新数据
void updata (void){
lcm_w_hh();//刷新 小时
lcm_w_dd();//刷新 日
lcm_w_xq();//更新星期值
lcm_w_mo();//刷新 月
lcm_w_yy();//刷新 年
}
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
unsigned int i=0;
unsigned char a=0,b=0,c=0;
if(read_clock(0x81) != ss)
{ //判断是否需要更新
ss = read_clock(0x81); //更新数据
lcm_w_test(0,0x8b); //秒值在LCM上的写入位置
lcm_w_test(1,(ss/16)+0x30); //写十位
lcm_w_test(1,ss%16+0x30); //写个位
//led_b = ~led_b; //背光闪烁
lcm_w_mm();//刷新 分
lcm_w_test(0,0x8d); //温度在LCM上的写入位置
i=ReadTemperature();//读温度并送显
a=i/100;
lcm_w_test(1,a+0x30); //显示温度十位
b=i/10-a*10;
lcm_w_test(1,b+0x30); //个位
lcm_w_test(1,0x2e); //"."
c=i-a*100-b*10;
lcm_w_test(1,c+0x30); //小位1位
lcm_w_word("℃"); //度C
days(); //节日显示
}
}
/*****************************************************************************/
//---主程序---//
main()
{
unsigned char e=0;
yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
P0=0xff;P1=0xff;P2=0xff;P3=0xff; //清I/O端口
beep = 0;
DelayM(900);
beep = 1;
lcm_init();//初始化液晶显示器
lcm_clr();//清屏
lcm_w_test(0,0x82);
//lcm_w_word("")可以自己随意加字
//lcm_w_test(0,0x91);
//lcm_w_word("");
//lcm_w_test(0,0x8a);
//lcm_w_word("?);
DelayM(5000); //显示等留5秒
lcm_clr();//清屏
while(1)
{
if (w == 0)
{ //正常走时
lcm_w_ss();//刷新 秒
}
if (KEY_3 == 0) // 设置时间
{
DelayM(20); //去抖
if(KEY_3 == 0 && w == 1) //当是调时状态 本键用于调整下一项
{
e++;
if (e >= 6 ){e = 0;}
Set_time(e);//调整
}
if(KEY_3 == 0 && w == 0) //当是正常状态时就进入调时状态
{
lcm_clr(); //清屏
w=1; //进入调时
//lcm_w_test(0,0x9e);
//lcm_w_word(" [-]");
//lcm_w_test(0,0x80);
//lcm_w_word("[Esc]");
//lcm_w_test(0,0x85);
//lcm_w_word("[Next]");
//lcm_w_test(0,0x98);
//lcm_w_word("[+]");
Set_time(e); //调整
}
while(KEY_3 == 0); //等待键松开
}
//------------------------------------------------------------------
if (KEY_1 == 0) // 当在调时状态时就退出调时
{
DelayM(20);
if(KEY_1 == 0 && w == 1){
w = 0; //退出调时
e = 0; //“下一项”计数器清0
}
if(KEY_1 == 0 && w == 0){
lcm_clr();//清屏
DelayM(3000);
//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
while(KEY_1 == 0);//等待键松开
}
lcm_clr();//清屏
days(); //节日显示
updata (); //刷新数据
lcm_w_mm();//刷新 分
while(KEY_1 == 0);//等待键松开
}
//------------------------------------------------------------------
if (KEY_2 == 0 && w == 1){ // 加减调整{
DelayM(20);
if(KEY_2 == 0 && w == 1){
Set_time(e);//调整
}
while(KEY_2 == 0);//等待键松开
}
//------------------------------------------------------------------
if (KEY_4 == 0 && w == 1){ // 加减调整
DelayM(20);
if(KEY_4 == 0 && w == 1){
Set_time(e);//调整
}
while(KEY_4 == 0);//等待键松开
}
//------------------------------------------------------------------
if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){ //时钟初始化{
if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){
Init_1302();
lcm_w_test(0,0x80);
lcm_clr();//清屏
lcm_w_word("初始化成功! 2008-1-1 00:00.0");
while(1);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -