微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助 帮我看看程序哈

求助 帮我看看程序哈

时间:10-02 整理:3721RD 点击:
我的按键不起作用  不能调时间 调完时间后又回到原来的时间 兄弟们帮我看看哈 谢谢了  我用的是掉用程序
/*************************************************************/
//对DS1302初始化、写一字节、读一字节
//向DS1302写一字节数据、读一字节数据、读时间操作和调整时间操作
//把十进制数据转换成8421BCD码后写入ds1302
//调用ds1302把数据传给主函数显示
/************************************************************/
#include<reg51.h>
#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<reg51.h>
sbit key1 = P1^4;
sbit key2 = P1^5;
sbit key3 = P1^6;
sbit 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<reg51.h>
#define uchar unsigned char //宏定义用uchar代替unsigned char
#define uint unsigned int  //宏定义用uint代替unsigned int
sbit rst = P1^1;  //定义复位/片选线接P1.1
sbit scl = P3^7;  //定义串行时钟引脚接P3.7
sbit 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);
}
/*获得时间信息函数*/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top