我的按键不起作用 不能调时间 调完时间后又回到原来的时间 兄弟们帮我看看哈 谢谢了 我用的是掉用程序 /*************************************************************/ //对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); } /*获得时间信息函数*/ |
162 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第六十四章 LVGL 综合例程
290 浏览 0 评论
2804 浏览 1 评论
1627 浏览 0 评论
ESP32驱动ST7789触摸屏开发指南:LVGL主题设置与示波器面板
1343 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
13080 浏览 31 评论