我的按键不起作用 不能调时间 调完时间后又回到原来的时间 兄弟们帮我看看哈 谢谢了 我用的是掉用程序
/*************************************************************/
//对DS1302初始化、写一字节、读一字节
//向DS1302写一字节数据、读一字节数据、读时间操作和调整时间操作
//把十进制数据转换成8421BCD码后写入ds1302
//调用ds1302把数据传给主函数显示
/************************************************************/
#include
#include"ds1302.c"
#include"key.c"
#define uchar unsigned char
#define uint unsigned int
uchar cp1,cp2,k; //定义变量
code uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选数组
code uchar seg_bit[] = {0x01,0x02,0x04,0x08,0x10,0x20}; //位选数组
uchar flash;
bit conv;
void get_ds1302_time(void) //获取1302的时间数据(时、分、秒),存入time1数组中
{
uchar d;
d = read_ds1302_add(0x81); //读秒
sec = BCD_DEC_conv(d); //得到秒
d = read_ds1302_add(0x83); //读分
min = BCD_DEC_conv(d); //得到分
d = read_ds1302_add(0x85); //读小时
hour = BCD_DEC_conv(d); //得到小时
d = read_ds1302_add(0x87); //读日
date = BCD_DEC_conv(d); //得到日
d = read_ds1302_add(0x89); //读月
month = BCD_DEC_conv(d); //得到月
d = read_ds1302_add(0x8b); //读星期
week = BCD_DEC_conv(d); //得到星期
d = read_ds1302_add(0x8d); //读年
year = BCD_DEC_conv(d); //得到年
}
void time0_isr(void) interrupt 1 //利用中断对数码管上显示的数据进行刷新
{
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
cp1++;
if(cp1 >= 250) //0.5秒
{
cp1 = 0;
flash = ~flash; //产生小数点闪烁变量
cp2++;
if(cp2 >= 5)
{
cp2 = 0;
}
}
P0 = 0xff; //消隐
{
if(key1_flag == 0) //正常走时
{
switch(k)
{
case 0:P0 = seven_seg[sec % 10]; P2 = ~0x01;break;
case 1:P0 = seven_seg[sec / 10]; P2 = ~0x02;break;
case 2:P0 = seven_seg[min % 10] & (0x7f | flash); P2 = ~0x04;break; //小数点闪烁
case 3:P0 = seven_seg[min / 10]; P2 = ~0x08;break;
case 4:P0 = seven_seg[hour % 10] & (0x7f | flash); P2 = ~0x10;break; //小数点闪烁
case 5:P0 = seven_seg[hour / 10]; P2 = ~0x20;break;
}
}
if(key1_flag == 1)//调小时,小时闪烁
{
cp2 = 0;
switch(k)
{
case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
case 4: P0 = seven_seg[hour_t % 10] | flash; P2 = ~0x10;break; //小时闪烁
case 5: P0 = seven_seg[hour_t / 10] | flash; P2 = ~0x20;break; //小时闪烁
}
}
if(key1_flag == 2)//调分钟
{
cp2 = 0;
switch(k)
{
case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
case 2: P0 = seven_seg[min_t % 10]| flash; P2 = ~0x04;break; //分闪烁
case 3: P0 = seven_seg[min_t / 10]| flash; P2 = ~0x08;break; //分闪烁
case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
}
}
if(key1_flag == 3)//调秒
{
cp2 = 0;
switch(k)
{
case 0: P0 = seven_seg[sec_t % 10]| flash; P2 = ~0x01;break; //秒闪烁
case 1: P0 = seven_seg[sec_t / 10]| flash; P2 = ~0x02;break; //秒闪烁
case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
}
}
}
if(key1_flag == 4)
{
switch(k)
{
case 0:P0 = seven_seg[date % 10];P2 = ~0x01;break;
case 1:P0 = seven_seg[date / 10];P2 = ~0x02;break;
case 2:P0 = seven_seg[month % 10]& (0x7f | flash);P2 = ~0x04;break;
case 3:P0 = seven_seg[month / 10];P2 = ~0x08;break;
case 4:P0 = seven_seg[year % 10]& (0x7f | flash); P2 = ~0x10;break;
case 5:P0 = seven_seg[year / 10];P2 = ~0x20;break;
}
}
k++;
if(k >= 6)k = 0;
}
void timer0_init(void) //Timer0初始化
{
TMOD = 0x01;
TH0 = (65536 - 2000) / 256;
TL0 = (65536 - 2000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void main(void)
{
uchar i = 46; //举例,比如要调整时间,分钟设定为46分
i = DEC_BCD_conv(i);
timer0_init();
write_ds1302_add_dat(0x8e,0x00); //写操作,可以对DS1302调整
write_ds1302_add_dat(0x80,0x30); //写秒,30秒
write_ds1302_add_dat(0x82,i); //写分,46分
write_ds1302_add_dat(0x84,0x12); //写时,12时
write_ds1302_add_dat(0x86,0x28); //写日,28日
write_ds1302_add_dat(0x88,0x05); //写月,5月
write_ds1302_add_dat(0x8a,0x03); //写星期,星期三
write_ds1302_add_dat(0x8c,0x12); //写年,(20)12年
write_ds1302_add_dat(0x8e,0x80); //写保护
while(1)
{
get_ds1302_time();
key();
}
}
#include
***it key1 = P1^4;
***it key2 = P1^5;
***it key3 = P1^6;
***it key4 = P1^7;
#define uchar unsigned char //宏定义 即用uchar 代替unsigned char
#define uint unsigned int //宏定义 即用uint 代替unsigned int
bit key1_s,key2_s,key3_s,key4_s,key5_s; //按键按下状态
uchar hour = 12,min = 46,sec =30; //正在走的时间变
uchar hour_t,min_t,sec_t;
uchar date=28,month=5,year=12;
uchar date_t,month_t,year_t;
uchar min_r,hour_r; //调整的中间时间变量
uchar key1_flag; //调整控制变量,控制调整对象、控制显示对象
/***********************简单延时函数************************/
void delay(unsigned int x)
{
while(x--);
}
/*************************按键函数**************************/
void key(void)
{
//按键key1处理
if(key1 == 0)
{
delay(300);
if(key1 == 0);
key1_s = 1;
}
if(key1 == 1 && key1_s == 1)
{
key1_s = 0;
key1_flag++;
if(key1_flag >= 7)key1_flag = 1;
hour_t = hour;//把正在走的时间给调整值
min_t = min;
sec_t = sec;
}
//按键key2处理
if(key2 == 0)
{
delay(300);
if(key2 == 0);
key2_s = 1;
}
if(key2 == 1 && key2_s == 1)
{
key2_s = 0;
if(key1_flag == 1)hour_t++;if(hour_t >= 24)hour_t = 0;hour = hour_t; //把调整后的时间给走的时间
if(key1_flag == 2)min_t++;if(min_t >= 60)min_t = 0;min = min_t;
if(key1_flag == 3)sec_t++;if(sec_t >= 60)sec_t = 0;sec = sec_t;
if(key1_flag == 4)date=28,month=5,year=12;
if(key1_flag == 5)hour_r++;if(hour_r >= 24)hour = 0;
if(key1_flag == 6)min_r++;if(min_r >= 24)min_r = 0;
}
//按键key3处理
if(key3 == 0)
{
delay(300);
if(key3 == 0);
key3_s = 1;
}
if(key3 == 1 && key3_s == 1)
{
key3_s = 0;
if(key1_flag == 1)hour_t--;if(hour_t <= 0)hour_t = 23;hour = hour_t;
if(key1_flag == 2)min_t--;if(min_t <= 0)min_t = 59;min = min_t;
if(key1_flag == 3)sec_t--;if(sec_t <= 0)sec_t = 59;sec = sec_t;
if(key1_flag == 4)date=28,month=5,year=12;
if(key1_flag == 5)hour_r++;if(hour_r >= 24)hour = 0;
if(key1_flag == 6)min_r++;if(min_r >= 24)min_r = 0;
}
//按键key4处理
if(key4 == 0)
{
delay(300);
if(key4 == 0);
key4_s = 1;
}
if(key4 == 1 && key4_s == 1)
{
key4_s = 0;
key1_flag = 0;
hour = hour_t;
min = min_t;
sec = sec_t;
}
}
#include
#define uchar unsigned char //宏定义用uchar代替unsigned char
#define uint unsigned int //宏定义用uint代替unsigned int
***it rst = P1^1; //定义复位/片选线接P1.1
***it scl = P3^7; //定义串行时钟引脚接P3.7
***it sda = P1^0; //定义串行数据输入输出端接P1.0
uchar sec,min,hour,date,week,month,year;
/*对DS1302初始化*/
void ds1302_init(void)
{
rst = 0;
scl = 0;
rst = 1;
}
/*对DS1302写1字节函数*/
void write_ds1302_onebyte(uchar dat)
{
uchar i;
for(i = 0;i < 8;i++)
{
sda = (bit)(dat & 0x01);
scl = 0;
scl = 1;
dat = dat >> 1;
}
}
/*从DS1302读一字节函数*/
uchar read_ds1302_onebyte(void)
{
uchar i,dat;
for(i = 0;i < 8;i++)
{
scl = 1;
scl = 0;
dat = dat >> 1;
if(sda)dat = dat | 0x80;
}
return(dat);
}
/*对DS1302的某一地址写一字节函数*/
void write_ds1302_add_dat(uchar add,uchar dat)
{
ds1302_init();
write_ds1302_onebyte(add);
write_ds1302_onebyte(dat);
scl = 1;
rst = 0;
}
/*从DS1302的某一地址读一字节函数*/
uchar read_ds1302_add(uchar add) //读1302数据
{
uchar dat_temp;
ds1302_init();
write_ds1302_onebyte(add);
dat_temp = read_ds1302_onebyte();
scl = 1;
rst = 0;
return(dat_temp);
}
/*8421BCD码到十进制转换*/
uchar BCD_DEC_conv(uchar x)
{
uchar dec;
dec = 0x0f & x;
x = x >> 4;
dec = dec + x * 10;
return(dec);
}
/*十进制到8421BCD码转换*/
uchar DEC_BCD_conv(uchar x)
{
uchar bcd;
bcd = x % 10;
x = x / 10;
x = x << 4;
bcd = bcd | x ;
return(bcd);
}
/*获得时间信息函数*/
|