📄 shizhong.c
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
///////////////////////////////////
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//段显示码0-f
uchar BUFFER[13]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00};
uchar BUFFER1[13]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00}; //显示缓冲区
uchar m;
uchar set_key=0;
uchar add_key=0;
uchar sub_key=0;
uchar timer=0;
uchar timer1=0;
bit flag=0;
///////////////////////////////////
////函数定义
///////////////////////////////////
sbit T_CLK = P2^0; /*实时时钟时钟线引脚 */
sbit T_IO = P2^1; /*实时时钟数据线引脚 */
sbit T_RST = P2^2; /*实时时钟复位线引脚 */
sbit Key0=P2^3;
sbit Key1=P2^4;
sbit Key2=P2^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出1Byte */
void W1302(uchar, uchar); /*向地址写入数据*/
uchar R1302(uchar); /*读取某地址数据*/
void Set1302(uchar *); /* 设置时间 */
void Display_led(void); /*正常显示*/
void shanshuo(void);/*设置闪烁*/
void adds(uchar k); /*设置选择位加*/
void sub(uchar k) ; /*设置选择位减*/
void Play_led() ; /*选择是正常显示还是闪烁*/
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=300;j>0;j--);
}
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
ACC = ACC >> 1;
T_CLK = 0;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/*****************************
十六进制转化为BCD码
******************************/
char Hex2BCD(char a)
{
unsigned char t_h,t_l;
t_h = a/10;
t_l = a - t_h*10;
a = (t_h<<4) + t_l;
return(a);
}
/******************************
BCD码转化为十六进制
******************************/
char BCD2Hex(char a)
{
unsigned char t_h,t_l;
t_h = (a&0xf0)>>4;
t_l = a&0x0f;
a = t_h*10 + t_l;
return(a);
}
/******************************
函数名:Display_led
功能:显示LED
说明:
调用:Get1302()
*******************************/
void Display_led(void){
uchar i;
uchar m[7]={0x00,0x00,0x00,0x01,0x01,0x01,0x00};
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
m[i] = R1302(ucAddr);
ucAddr += 2;
}
for(i=0;i<7;i++)
m[i]=BCD2Hex(m[i]);
BUFFER[0]=m[0]%10;
BUFFER[1]=m[0]/10;
BUFFER[2]=m[1]%10;
BUFFER[3]=m[1]/10;
BUFFER[4]=m[2]%10;
BUFFER[5]=m[2]/10;
BUFFER[6]=m[3]%10;
BUFFER[7]=m[3]/10;
BUFFER[8]=m[4]%10;
BUFFER[9]=m[4]/10;
BUFFER[10]=((m[5]==7?8:m[6])%10);
BUFFER[11]=m[6]%10;
BUFFER[12]=m[6]/10;
P1=0xff;
P0=0xff;
P3=0xff;
for(i=0;i<13;i++)
{BUFFER1[i] =BUFFER[i];
if(i<=5||i==10){P0=~table[BUFFER[i]];}
else P0=table[BUFFER[i]];
if(i<8)
{P1=_crol_(0x01,i);
delay_50ms(1); }
if(i>=8){P3=_crol_(0x01,(i-8));
delay_50ms(1);}
}
}
void shanshuo(void){ //设置选中位闪烁
uchar i;
P1=0xff;
P0=0xff;
P3=0xff;
for(i=0;i<13;i++){
if(i<=5||i==10){P0=~table[BUFFER1[i]];}
else P0=table[BUFFER1[i]];
if(i!=(m-1)&&i<8){P1=_crol_(0x01,i);
delay_50ms(1); }
if(i==(m-1)&&i<8){if(flag){P1=0x00;}
if(!flag){P1=_crol_(0x01,i);
delay_50ms(1);} }
if(i!=(m-1)&&i>=8){P3=_crol_(0x01,(i-8)) ;
delay_50ms(1);}
if(i==(m-1)&&i>=8){if(flag){P3=0x00;}
if(!flag){P3=_crol_(0x01,(i-8)) ;
delay_50ms(1);}}
}
}
void adds(uchar k){ //设置按键加
if(Key1==0){add_key++;
if(add_key>10){add_key=0;
BUFFER1[k]=BUFFER1[k]+1;
switch(k){
case(0):
case(2):
case(6):
case(8):
case(10):
case(11):{if(BUFFER1[k]==10)BUFFER1[k]=0;}break;
case(1):
case(3):{if(BUFFER1[k]==6)BUFFER1[k]=0;}break;
case(5):{if(BUFFER1[k]==3)BUFFER1[k]=0;}break;
case(4):{if(BUFFER1[k]==10)BUFFER1[k]=0;
if(BUFFER1[k]+BUFFER1[k+1]*10==24)BUFFER1[k]=0;}break;
case(7):{if(BUFFER1[k]==4)BUFFER1[k]=0;}break;
case(9):{if(BUFFER1[k]==2)BUFFER1[k]=0;}break;
case(12):{if(BUFFER1[k]==7)BUFFER1[k]=8;
if(BUFFER1[k]==9)BUFFER1[k]=1;}break;
}
}
}
}
void sub(uchar k){ //设置按键减
if(Key2==0){sub_key++;
if(sub_key>10){sub_key=0;
BUFFER1[k]=BUFFER1[k]-1;
switch(k){
case(0):
case(2):
case(6):
case(8):
case(10):
case(11):{if(BUFFER1[k]>9)BUFFER1[k]=9;}break;
case(1):
case(3):{if(BUFFER1[k]>9)BUFFER1[k]=5;}break;
case(5):{if(BUFFER1[k]>9)BUFFER1[k]=2;}break;
case(4):{if(BUFFER1[k]>9)BUFFER1[k]=9;}break;
case(7):{if(BUFFER1[k]>9)BUFFER1[k]=3;}break;
case(9):{if(BUFFER1[k]>9)BUFFER1[k]=1;}break;
case(12):{if(BUFFER1[k]>9)BUFFER1[k]=8;
if(BUFFER1[k]==7)BUFFER1[k]=6;}break;
}
}
}
}
void key(void) //按键选择设置
{uchar i;
uchar k[7];
if(Key0==0){set_key++;
if(set_key>5&&m==0){set_key=0;
m++; }
if(set_key>10&&m!=0){set_key=0;
m++;
if(m>=13){m=0;
k[0]=BUFFER1[0]+BUFFER1[1]*10;
k[1]=BUFFER1[2]+BUFFER1[3]*10;
k[2]=BUFFER1[4]+BUFFER1[5]*10;
k[3]=BUFFER1[6]+BUFFER1[7]*10;
k[4]=BUFFER1[8]+BUFFER1[9]*10;
k[5]=BUFFER1[10];
k[6]=+BUFFER1[11]+BUFFER1[12]*10;
for(i=0;i<7;i++)
{k[i]=Hex2BCD(k[i]);}
Set1302(&k);
}
}
}
if(m){
if(Key1==0||Key2==0){timer1=0;
adds(m-1);
sub(m-1);}
if(Key0!=0&&Key1!=0&&Key2!=0){timer1++;
if(timer1>250)
{timer1=0;
k[0]=BUFFER1[0]+BUFFER1[1]*10;
k[1]=BUFFER1[2]+BUFFER1[3]*10;
k[2]=BUFFER1[4]+BUFFER1[5]*10;
k[3]=BUFFER1[6]+BUFFER1[7]*10;
k[4]=BUFFER1[8]+BUFFER1[9]*10;
k[5]=BUFFER1[10];
k[6]=BUFFER1[11]+BUFFER1[12]*10;
for(i=0;i<7;i++)
{k[i]=Hex2BCD(k[i]);}
Set1302(&k);
m=0;
}
}
}
}
void Play_led(){
if(!m){Display_led();}
else {
shanshuo();
}
}
void main(){
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
W1302(0x80,0x00);
while(1){
key();
Play_led();
}
}
void timer0(void) interrupt 1 using 1 //中断部分
{
TH0=0x3c;
TL0=0xb0;
timer++;
if(timer>20){timer=0;
flag=~flag;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -