一:题目描述
二:参考代码
1、main.c
#include "stc15.h"
#include "intrins.h"
#include "ds1302.h"
#include "iic.h"
#include "Display.h"
sbit L1=P4^4; //矩阵键盘列引脚定义
sbit L2=P4^2;
sbit L3=P3^5;
sbit L4=P3^4;
unsigned char Time[]={0x59,0x09,0x23};
u8 jilu_time[2]; //保存记录时间
u8 Key_Slow_Flag,Data_Slow_Flag,Smg_Slow_Flag,Led_Slow_Flag;
u8 jiemian=0; //0:时间界面 1:输入界面 2:记录界面
bit input_flag=0; //刚进入输入界面还未输入标志为0,有输入为1。
u16 dat=0; //四位数据
u8 keynum=0xFF; //键值
u8 count=0;
bit jilu_flag=0; //记录输入四位数的时间
bit w_f_flag=0; //输入完成标志
u8 AT_dat[4]; //保存要写入EEPROM的数据
bit led_flag=0;
u8 led=0xFF;
u16 lastdat; //保存上次数据
void Key_Proc(void);
void Data_Proc(void);
void Smg_Proc(void);
void Led_Proc(void);
void LedDisplay(u8 LED);
void Delay2ms(void) //@12.000MHz
{
unsigned char data i, j;
i = 24;
j = 85;
do
{
while (--j);
} while (--i);
}
void Timer0_Init(void) //2毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x40; //设置定时初始值
TH0 = 0xA2; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void Init(u8 i)
{
P2&=0x1F;
switch(i)
{
case 4:P0=0xFF;HC138(i);P2&=0x1F;P0=0x00;break;
case 5:HC138(i);break;
case 6:HC138(i);break;
case 7:P2&=0x1F;P0=0xFF;HC138(i);break;
}
P2&=0x1F;
}
void main(void)
{
Init(4);
Init(5);
Init(6);
Init(7);
Time_Write();
Timer0_Init();
while(1)
{
Key_Proc();
Data_Proc();
Smg_Proc();
Led_Proc();
}
}
void Time0(void) interrupt 1
{
if(++Key_Slow_Flag==10) Key_Slow_Flag=0;
if(++Data_Slow_Flag==100) Data_Slow_Flag=0;
if(++Smg_Slow_Flag==100) Smg_Slow_Flag=0;
if(++Led_Slow_Flag==10) Led_Slow_Flag=0;
SmgDisplay();
LedDisplay(led);
}
u8 GetKeynum(void)
{
u8 i,j,value;
value=0xFF;
for(i=0;i<3;i++)
{
P3=(P3|0xFF)&(~((1<<1)<<i));
if(L1==0)
{
Delay2ms();
if(L1==0)
{
j=0;
value=i*4+j;
if(i==1)
{
value=10;
}
else if(i==2)
{
value=11;
}
return value;
}
}
else if(L2==0)
{
Delay2ms();
if(L2==0)
{
j=1;
value=i*4+j;
if(i==1)
value-=1;
else if(i==2)
value-=2;
return value;
}
}
else if(L3==0)
{
Delay2ms();
if(L3==0)
{
j=2;
value=i*4+j;
if(i==1)
value-=1;
else if(i==2)
value-=2;
return value;
}
}
else if(L4==0)
{
Delay2ms();
if(L4==0)
{
j=3;
value=i*4+j;
if(i==1)
value-=1;
else if(i==2)
value-=2;
return value;
}
}
}
return value;
}
void Key_Proc(void)
{
if(Key_Slow_Flag) return;
Key_Slow_Flag=1;
if(GetKeynum()!=0xFF)
{
keynum=GetKeynum();
}
if(keynum==11) //S4按下
{
jiemian++;
if(jiemian==1) //每次进入界面1数码管熄灭
{
input_flag=0;
w_f_flag=0;
}
if(jiemian==2) //进入记录界面写入EEPROM
{
AT_dat[0]=jilu_time[1];
AT_dat[1]=jilu_time[0];
AT_dat[2]=(u8)(dat>>8);
AT_dat[3]=(u8)dat;
AT24C02_Write(AT_dat,0,4);
}
if(jiemian>2)
jiemian=0;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
else if(keynum==10&&jiemian==1) //在输入界面按下清零数据
{
dat=0;
input_flag=0;
w_f_flag=0;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
else if(keynum!=0xFF&&w_f_flag==0)
{
count++;
input_flag=1;
if(count==1)
{
dat=keynum;
jilu_flag=1;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
else if(count==2)
{
dat=dat*10+keynum;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
else if(count==3)
{
dat=dat*10+keynum;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
else if(count==4)
{
dat=dat*10+keynum;
if(dat>lastdat&&lastdat!=0)
led_flag=1;
else
led_flag=0;
lastdat=dat;
w_f_flag=1;
count=0;
while(1)
{
if(GetKeynum()==0xFF)
Delay2ms();
if(GetKeynum()==0xFF)
break;
}
}
}
keynum=0xFF;
}
void Data_Proc(void)
{
if(Data_Slow_Flag) return;
Data_Slow_Flag=1;
Time_Read();
if(jilu_flag==1)
{
jilu_time[0]=Time[1];
jilu_time[1]=Time[2];
jilu_flag=0;
}
}
void Smg_Proc(void)
{
if(Smg_Slow_Flag) return;
Smg_Slow_Flag=1;
if(jiemian==0)
TimeDisplay();
else if(jiemian==1)
InputDisplay();
else if(jiemian==2)
JiluDisplay();
}
void Led_Proc(void)
{
if(Led_Slow_Flag) return;
Led_Slow_Flag=1;
if(jiemian==0)
led&=0xFE;
else
led|=0x01;
if(jiemian==1)
led&=0xFD;
else
led|=0x02;
if(jiemian==2)
led&=0xFB;
else
led|=0x04;
if(led_flag==1)
led&=0xF7;
else if(led_flag==0)
led|=0x08;
}
void LedDisplay(u8 LED)
{
HC138(4);
P0=LED;
P2&=0x1F;
}
2、Display.c
#include "Display.h"
unsigned char com=0;
unsigned char smg_num[]={10,10,10,10,10,10,10,10};
code unsigned char smg_dm[] =
{
0xc0, 0xf9, 0xa4, 0xb0,
0x99, 0x92, 0x82,0xf8,
0x80, 0x90,0xFF,0xBF,0xC6,0x86
};
void SmgDisplay(void)
{
P0=0xFF;
HC138(6);
P0=(1<<com);
HC138(7);
P0=0xFF;
P0=smg_dm[smg_num[com]];
(com==7)?(com=0):(com++);
}
void TimeDisplay(void)
{
smg_num[0]=Time[2]/16;
smg_num[1]=Time[2]%16;
smg_num[2]=11;
smg_num[3]=Time[1]/16;
smg_num[4]=Time[1]%16;
smg_num[5]=11;
smg_num[6]=Time[0]/16;
smg_num[7]=Time[0]%16;
}
void InputDisplay(void)
{
smg_num[0]=12;
smg_num[1]=10;
smg_num[2]=10;
smg_num[3]=10;
if(input_flag==0)
{
smg_num[4]=10;
smg_num[5]=10;
smg_num[6]=10;
smg_num[7]=10;
}
else
{
if(dat>999)
{
smg_num[4]=dat/1000;
smg_num[5]=dat/100%10;
smg_num[6]=dat/10%10;
smg_num[7]=dat%10;
}
else if(dat>99)
{
smg_num[4]=10;
smg_num[5]=dat/100;
smg_num[6]=dat/10%10;
smg_num[7]=dat%10;
}
else if(dat>9)
{
smg_num[4]=10;
smg_num[5]=10;
smg_num[6]=dat/10;
smg_num[7]=dat%10;
}
else
{
smg_num[4]=10;
smg_num[5]=10;
smg_num[6]=10;
smg_num[7]=dat;
}
}
}
void JiluDisplay(void)
{
smg_num[0]=13;
smg_num[1]=10;
smg_num[2]=10;
smg_num[3]=jilu_time[1]/16;
smg_num[4]=jilu_time[1]%16;
smg_num[5]=11;
smg_num[6]=jilu_time[0]/16;
smg_num[7]=jilu_time[0]%16;
}
三、总结
DS1302时间读写函数及EEPROM读写函数都是基本的代码,在此不再提供,希望大家在比赛中都能取得好成绩。
长风破浪会有时,直挂云帆济沧海!