📄 clock2.c
字号:
#include <REG51.H>
#include "ds1302.h" //包含DS1302头文件
#define leddata P0 //定义LED数据口
#define sec 0x80 //1302秒寄存器地址
#define min 0x82 //1302分寄存器地址
#define hou 0x84 //1302时寄存器地址
#define read 0x01 //读操作,因为读的时候地址要加1,使最低位为1
sbit SET=P3^5; //按键定义,下同 //SET按键定义
sbit UP=P3^6; //加按键定义
sbit DOWN=P3^7; //减按键定义
sbit led0=P2^0; //LED位选,驱动数码管。下同
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
/**************函数声明*****************/
void delay(unsigned char); //延时函数
void display(void); //显示函数
void Scan_Key(void); //键盘检测函数
void id_case1_key(); //键盘处理函数
void Set_id(unsigned char ,unsigned char); //时间调整函数
/*************变量定义******************/
unsigned char id=0,timecount,re_disp=0; //定义用到的变量,id为调整模式用,不为0时表示调整模式,调整哪个量由id值确定
//timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作10s自动返回正常显示状态
bit hour,minute,second,flag; //定义位变量,hour,minute,second分别为调整时闪烁标志位,flag 500ms取反一次,调整位闪烁及冒号闪烁用
unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //LED码表,根据硬件修改
unsigned char inittime[7]={0x00,0x00,0x00,0x10,0x05,0x07,0x04}; //初始化1302时用到的初始化数据
// 秒 分钟 小时 日 月 年 星期
/***********************************************/
/*****************中断处理函数******************/
/*功能说明:主要用于取反标志位,返回正常显示状态*/
/***********************************************/
void t0(void) interrupt 1 using 0
{
TH0=65356-5000; //50ms定时
TL0=65356-5000;
timecount++;re_disp++; //程序法计时时间累加
if(timecount>10 ) // 当超过500ms时执行。即调整时,500ms闪烁一次
{
timecount=0; //程序法计时清零,即变量timecount归零
flag=~flag; //取反
}
if(re_disp>=200 ){re_disp=0;if(id)id=0;} // 当超过10s时执行。即调整状态下按键无操作10s自动返回正常显示状态
}
/*************************************/
/************延时函数*****************/
/**********功能说明:延时**************/
/*************************************/
void delay(unsigned char k) //延时函数
{
unsigned char i,j;
for(i=0;i<k;i++) //延时10*50次
for(j=0;j<50;j++);
}
/***************************************/
/**************显示函数*****************/
/***功能说明:利用人眼惰性动态显示时间***/
/******可根据共阴或共阳数码管调整*******/
/*********本实验用到的是共阳管**********/
/***************************************/
void display(void) //显示函数
{
if(flag&hour) //如hour为1表示调整时,flag为1时不显示
{
led0=0;leddata=0xff;delay(10);led0=1; //第一个数码管(led0)启动,但全部不亮;延时;第一个数码管关闭
led1=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led1=1; //第二个数码管(led1)启动,但全部不亮;延时;第二个数码管(led1)关闭 //&~((unsigned char)~flag<<7)该句根据flag的值决定来 显示小数点,为1时显示,2个小数点分隔开时、分、秒,下同
}
else //flag为0时显示,产生闪烁效果
{
leddata=tab[Read1302(hou|read)/16];led0=0;delay(10);led0=1; //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led0显示出来,延时,led0关闭
leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<7);led1=0;delay(10);led1=1; //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值和小数点是否闪烁的值赋给leddata在led1显示出来,延时,led1关闭
}
if(flag&minute) //如minute为1表示调整时,flag为1时不显示
{
led2=0;leddata=0xff;delay(10);led2=1; //led2启动,但全部不亮;延时;led2关闭
led3=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led3=1;} //led3启动,但全部灭;延时;led3关闭
else //flag为0时显示,产生闪烁效果
{
leddata=tab[Read1302(min|read)/16];led2=0;delay(10);led2=1; //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led2显示出来,延时,led2关闭
leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<7);led3=0;delay(10);led3=1; //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值和小数点是否闪烁的值赋给leddata在led3显示出来,延时,led3关闭
}
if(flag&second) //如second为1表示调整时,flag为1时不显示
{
led4=0;leddata=0xff;delay(10);led4=1; //led4启动,但该数码管不亮;延时;led4关闭
led5=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led5=1; //led5启动,但该数码管不亮;延时;led5关闭
}
else //flag为0时显示,产生闪烁效果,下同
{
leddata=tab[Read1302(sec|read)/16];led4=0;delay(10);led4=1; //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led4显示出来,延时,led4关闭
leddata=tab[Read1302(sec|read)%16];led5=0;delay(10);led5=1; //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值掣鴏eddata在led5显示出来,延时,led5关闭
}
}
/****************************************************/
/*******************键盘检测函数*********************/
/***功能说明:检测按下SET键的次数并跳到相应处理函数***/
/****************************************************/
void Scan_Key(void) //键盘检测函数
{
display(); //程序开头调用显示函数
if(!SET)
{
while(!SET)display(); //等待按键释放,如一直按下一直调用显示函数,防止显示中断
re_disp=0; //清除记数,重新开始10s定时
id++;if(id>3)id=0; //id加1,后面根据id值对应调整项目
}
if(id==0){hour=0;minute=0;second=0;} //根据id值跳到相应处理函数
if(id==1){hour=1;id_case1_key();} //id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
if(id==2){hour=0;minute=1;id_case1_key();} //id为2,选择调整分钟位,闪烁标志位置1,然后跳到键盘处理函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -