📄 disp1302.c
字号:
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define hi1 0xff
#define lo1 0x00
#define hi 0x3c
#define lo 0xb0
sbit P20=P2^0;sbit P21=P2^1;sbit P22=P2^2;sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit P26=P2^6;sbit P27=P2^7;//p2
unsigned char code ledk[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code al_r_addr[15]={0xc1,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xdd,
0xe1,0xe5,0xe9,0xed,0xf1,0xf5,0xf9};
unsigned char code al_w_addr[15]={0xc0,0xc4,0xc8,0xcc,0xd0,0xd4,0xd8,0xdc,
0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8};
unsigned char mask=0xee;disp[8],disp_set[8],key,key_0,
key_flag,set_flag,al_set_flag,year_set_flag,alarm;
char set_no;
unsigned char al_i,al_i_max,al_hour,al_min,set_hour,set_min,set_sec;
unsigned char set_year,set_month,set_day,set_week;
unsigned char year_1302,month_1302,day_1302,
hour_1302,min_1302,sec_1302,week_1302;
unsigned char t0_count,key_count,t1_count;
sbit P37=P3^7;sbit P10=P1^0;
sbit T_clk=P3^4;sbit T_io=P3^5;sbit T_rst=P3^6;
sbit clk=P0^7;sbit sda=P0^6; //p3
//=============================
void delay (unsigned int n)
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n ;j++); }
void shift(dd)
{unsigned char j=0;
while(j<8){if((dd&0x80)!=0)sda=1;else sda=0;
clk=0; clk=1; dd<<=1;j++;} }
//***** DS1302 *****************
void v_RTinputByte(unsigned char ucDA)
{unsigned char i;
for(i=8;i>0;i--)
{if((ucDA&0x01)!=0)T_io=1;
else T_io=0;
T_clk=1;T_clk=0;delay(4);
ucDA>>=1;} }
unsigned char v_RToutputByte(void)
{unsigned char i,da=0;
for(i=8;i>0;i--)
{if(T_io!=0)da=da|0x80;
else da=da|0x00;
if(i>1)da>>=1;
T_clk=1;T_clk=0;delay(4);}
return da;}
unsigned char R1302(unsigned char address)
{unsigned char ucDA;
T_rst=0;T_clk=0;T_rst=1;
v_RTinputByte(address);
ucDA=v_RToutputByte();delay(4);
T_clk=1;T_rst=0;
return ucDA; }
void W1302(unsigned char address,ucDA)
{ T_rst=0;T_clk=0;T_rst=1;
v_RTinputByte(address);
v_RTinputByte(ucDA);delay(4);
T_clk=1;T_rst=0;
}
//----------disptoclk-----------
void disptoclk(void)
{set_hour=disp_set[7]*16+disp_set[6];
set_min=disp_set[5]*16+disp_set[4];
set_sec=disp_set[2]*16+disp_set[1]; }
void disptoalclk(void)
{al_hour=disp_set[7]*16+disp_set[6];
al_min =disp_set[5]*16+disp_set[4];
al_i_max=disp_set[2]; }
void disptoyear(void)
{set_year=disp_set[7]*16+disp_set[6];
set_month=disp_set[5]*16+disp_set[4];
set_day=disp_set[3]*16+disp_set[2];
set_week=disp_set[0];}
//---------disp-----------
void clktodisp1(unsigned char j,xx)
{unsigned char xx1;
xx1=xx;
disp[j]=(xx>>4)&0x0f;
if(set_flag==1||al_set_flag==1||year_set_flag==1)disp_set[j]=disp[j];
j--;
disp[j]=xx1&0x0f;
if(set_flag==1||al_set_flag==1||year_set_flag==1)disp_set[j]=disp[j];
}
void display_normal( )
{static unsigned char i;
if(sec_1302>2){if(i==4||i==6)shift(ledk[disp[i]]|0x80);
else if(i==3||i==0)shift(ledk[16]);
else shift(ledk[disp[i]]); }
else {if(i==6||i==4||i==2)shift(ledk[disp[i]]|0x80);
else shift(ledk[disp[i]]);}
P20=i&0x04;P21=i&0x02;P22=i&0x01;i++;if(i>7)i=0;}
void display_1( )//display set_hour,min,sec or al_hour,al_min
{unsigned char i;
for(i=0;i<8;i++)
{ if(t0_count<5 && i==set_no)shift(ledk[16]);
else if((i==3||i==0) && set_flag==1)shift(ledk[16]);
else if((i==3||i==1)&& al_set_flag==1)shift(ledk[16]);
else if(i==0 && al_set_flag==1)shift(ledk[al_i]);
else if(al_set_flag==1)shift(ledk[disp_set[i]]|0x80);
else shift(ledk[disp_set[i]]);
P20=i&0x04;P21=i&0x02;P22=i&0x01;delay(15);} }
void display_2( )//display set_year,month,.....
{unsigned char i;
for(i=0;i<8;i++)
{ if(t0_count<5 && i==set_no)shift(ledk[16]);
else if(i==1)shift(ledk[16]);
else if((i==6||i==4||i==2)||i==0)shift(ledk[disp_set[i]]|0x80);
else shift(ledk[disp_set[i]]);
P20=i&0x04;P21=i&0x02;P22=i&0x01;delay(15);} }
void t0() interrupt 1
{TH0=hi;TL0=lo;t0_count++;key_count++;
if(t0_count==20)t0_count=0;
if(key_count>10)key_count=0; }
void t1() interrupt 3
{TH1=hi1;TL1=lo1;t1_count++;
if(t1_count==16){t1_count=0;display_normal( );}
if(alarm==1 && t0_count<10)P10=!P10;
else P10=0; }
//---------key--------------
unsigned char get_char()
{unsigned char key_code;
static unsigned char column=0;
if(P37==0 && key_flag==1)
{key_code=column;key_flag=0;key_count=0;}
else key_code=0xff;
column++;if(column>3)column=0;
mask=_crol_(mask,1);
P27=mask&0x80;P26=mask&0x40;
P25=mask&0x20;P24=mask&0x10;
return key_code;}
void key_func(key)
{switch (key)
{case 0: set_no=7;key_0++;
if(key_0<3)
{set_flag=1;al_set_flag=0;year_set_flag=0;
sec_1302=R1302(0x81);
clktodisp1(2,sec_1302); delay(3);
min_1302=R1302(0x83);
clktodisp1(5,min_1302); delay(3);
hour_1302=R1302(0x85);
clktodisp1(7,hour_1302);delay(3);}
else if(key_0>=3 && key_0<20)
{set_flag=0;al_set_flag=1;year_set_flag=0;
al_i_max=R1302(0xfd);
clktodisp1(3,al_i_max);delay(3);
al_i++;if(al_i>al_i_max)al_i=0;
al_min=R1302(al_r_addr[al_i]);
clktodisp1(5,al_min);delay(3);
al_hour=R1302(al_r_addr[al_i]+2);
clktodisp1(7,al_hour);delay(3); }
else {set_flag=0;al_set_flag=0;year_set_flag=1;
day_1302 =R1302(0x87); delay(3);
month_1302=R1302(0x89);delay(3);
year_1302 =R1302(0x8d);delay(3);
week_1302 =R1302(0x8b);delay(3);
clktodisp1(7,year_1302);
clktodisp1(5,month_1302);
clktodisp1(3,day_1302);
clktodisp1(1,week_1302); }
break;
case 1: set_no--;
if(set_flag==1){if(set_no==3)set_no=2;
if(set_no==0)set_no=7;}
if(al_set_flag==1){if(set_no==3)set_no=2;
if(set_no==1)set_no=7;}
if(year_set_flag==1)
{if(set_no<0)set_no=7;
if(set_no==1)set_no=0;}
break;
case 2: disp_set[set_no]++;
if(set_flag==1||al_set_flag==1)
{if(set_no==7 && disp_set[set_no]>2)
disp_set[set_no]=0;
if(set_no==6 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==5 && disp_set[set_no]>5)
disp_set[set_no]=0;
if(set_no==4 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==2&&al_set_flag==1&&disp_set[set_no]>14)
disp_set[set_no]=0;
if(set_no==2&&set_flag==1&&disp_set[set_no]>5)
disp_set[set_no]=0;
if(set_no==1&&set_flag==1&&disp_set[set_no]>9)
disp_set[set_no]=0;}
else if(year_set_flag==1)
{if(set_no==7 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==6 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==5 && disp_set[set_no]>1)
disp_set[set_no]=0;
if(set_no==4 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==3 && disp_set[set_no]>3)
disp_set[set_no]=0;
if(set_no==2 && disp_set[set_no]>9)
disp_set[set_no]=0;
if(set_no==0 && disp_set[set_no]>7)
disp_set[set_no]=1;}
break;
case 3: key_0=0;
if(set_flag==1)
{disptoclk();W1302(0x8e,0);delay(2);W1302(0x8e,0);
W1302(0x80,sec_1302&0x7f);
W1302(0x80,set_sec);delay(2);W1302(0x80,set_sec);
W1302(0x82,set_min);delay(2);W1302(0x82,set_min);
W1302(0x84,set_hour);delay(2);W1302(0x84,set_hour);
set_flag=0;TR1=1;}
else if(al_set_flag==1)
{disptoalclk();W1302(0x8e,0);delay(2);W1302(0x8e,0);
W1302(0x80,sec_1302&0x7f);
W1302(al_w_addr[al_i],al_min);delay(2);
W1302(al_w_addr[al_i],al_min);
W1302(al_w_addr[al_i]+2,al_hour);delay(2);
W1302(al_w_addr[al_i]+2,al_hour);
W1302(0xfc,al_i_max);delay(2);
W1302(0xfc,al_i_max);
al_set_flag=0;TR1=1; }
else if(year_set_flag==1)
{disptoyear();W1302(0x8e,0);delay(2);W1302(0x8e,0);
W1302(0x80,sec_1302&0x7f);
W1302(0x8c,set_year);delay(2);W1302(0x8c,set_year);
W1302(0x88,set_month);delay(2);W1302(0x88,set_month);
W1302(0x86,set_day);delay(2);W1302(0x86,set_day);
W1302(0x8a,set_week);delay(2);W1302(0x8a,set_week);
year_set_flag=0;TR1=1;}
break;
default: break; } }
//---------------------------
void main(void)
{static unsigned char i;
TMOD=0x11; TH0=hi;TL0=lo; TH1=hi1;TL1=lo1;
EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
W1302(0x8e,0);delay(2);W1302(0x8e,0);
sec_1302=R1302(0x81);
W1302(0x80,sec_1302&0x7f);delay(2);
W1302(0x80,sec_1302&0x7f);
P10=0;
while(1)
{key=get_char( );key_func(key);
if(set_flag==1||al_set_flag==1){TR1=0;display_1( );}
else if(year_set_flag==1){TR1=0;display_2( );}
else {TR1=1;
sec_1302 =R1302(0x81);delay(3);
min_1302 =R1302(0x83);delay(3);
hour_1302 =R1302(0x85);delay(3);
day_1302 =R1302(0x87);delay(3);
month_1302=R1302(0x89);delay(3);
year_1302 =R1302(0x8d);delay(3);
week_1302 =R1302(0x8b);delay(3);
if(sec_1302<=2)
{clktodisp1(7,year_1302);
clktodisp1(5,month_1302);
clktodisp1(3,day_1302);
disp[1]=16;
disp[0]=week_1302&0x0f;}
else{clktodisp1(2,sec_1302);clktodisp1(5,min_1302);
clktodisp1(7,hour_1302);}
// display_normal( );
if(alarm==0)
{al_min=R1302(al_r_addr[i]); delay(3);
al_hour=R1302(al_r_addr[i]+2); delay(3);
i++;if(i>al_i_max)i=0; }
if(hour_1302==al_hour && min_1302==al_min)alarm=1;
else alarm=0;
}
if(key_flag==0 && key_count==10 && P37==1)key_flag=1;
W1302(0x8e,0x80);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -