找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1396|回复: 18
打印 上一主题 下一主题
收起左侧

单片机多功能万年历设计如何加一个12小时转换24小时的功能?

[复制链接]
跳转到指定楼层
楼主
200黑币
如何加一个12小时转换24小时的功能吗,实在是弄不出来了。我的思路是加一个按键判断,13点~24对应1~12,通过按键实现切换。下面有源代码和仿真图,求一个大佬帮忙修改指导一下万分感谢。

万年历.rar

151.96 KB, 下载次数: 11

最佳答案

查看完整内容

改好了,我的仿真是8.10版本的,打不开就在P3.3画一个按钮到地。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:140489 发表于 2024-4-10 15:47 | 只看该作者
在底板修改的显示函数的基础上,添加了按键切换显示,按 加 + 键切换显示

51黑论坛_万年历.zip

162.63 KB, 下载次数: 4

回复

使用道具 举报

板凳
ID:712097 发表于 2024-4-9 13:03 | 只看该作者
改好了,我的仿真是8.10版本的,打不开就在P3.3画一个按钮到地。

万年历.rar

158.42 KB, 下载次数: 5

回复

使用道具 举报

地板
ID:1080935 发表于 2024-4-9 16:21 | 只看该作者
程序中既然用了DS1302,它本身就具备这个功能,根据需要修改寄存器即可,然后根据模式显示相应的信息。
回复

使用道具 举报

5#
ID:1034262 发表于 2024-4-9 17:38 | 只看该作者
不需要转换,时间都按12小时处理,只是显示时可以选择12或24小时显示。
回复

使用道具 举报

6#
ID:712097 发表于 2024-4-9 19:11 | 只看该作者
  1. void Lcd_Time(uchar * clock_time )
  2. {
  3.         uchar i=0,j=0,k=0;
  4.         //显示   "hour时min分sec秒"                                            
  5.            i= * clock_time >> 4;
  6. //        i= g_time_buf[0] >> 4;
  7.         Lcd_Character_16X8( 1, 2, 80, letter_logo[i]);    //显示   sec的高位
  8.            i= * clock_time & 0x0f;
  9. //        i= g_time_buf[0] & 0x0f;
  10.         Lcd_Character_16X8( 1, 2, 88, letter_logo[i]);    //显示   sec的低位
  11.         Lcd_Character_16X16( 1, 2, 96 , time_logo[2]);  //显示   秒

  12.    clock_time ++;
  13.    i= *  clock_time >> 4;
  14. //        i= g_time_buf[1] >> 4;
  15.    Lcd_Character_16X8( 1, 2, 48, letter_logo[i]);    //显示   min的高位
  16.    i= * clock_time & 0x0f;
  17. //        i= g_time_buf[1] >> 4;
  18.    Lcd_Character_16X8( 1, 2, 56, letter_logo[i]);   //显示   min的低位
  19.    Lcd_Character_16X16( 1, 2, 64 , time_logo[1]);  //显示   分

  20.    clock_time ++;
  21.    i= * clock_time >> 4;
  22.    j= * clock_time & 0x0f;
  23.    k=i*10+j;
  24.    if(k>12)k=k-12;
  25.    if(k==0)k=12;
  26.         i=k/10;
  27.    Lcd_Character_16X8( 1, 2, 16 , letter_logo[i]);    //显示   hour的高位
  28.    //i= * clock_time & 0x0f;
  29.    i=k%10;
  30.    Lcd_Character_16X8( 1, 2, 24 , letter_logo[i]);    //显示   hour的低位
  31.        
  32.    Lcd_Character_16X16( 1, 2, 32 , time_logo[0]);  //显示   ”时“      
  33. }
复制代码

我修改了这个函数,仿真可以实现。
回复

使用道具 举报

7#
ID:1115386 发表于 2024-4-9 23:29 | 只看该作者
师傅的意思说的是切换到”时“的时候可以一键切换成12或者24小时,不知道可以外加一个按键然后一按就可以直接转换。就像13点一按就切换成1点。
回复

使用道具 举报

8#
ID:712097 发表于 2024-4-10 11:09 | 只看该作者
加个按钮,程序中加个bit变量记录按下状态,按下按钮的时候翻转变量状态。根据变量的状态选择执行我修改的函数的12小时还是24小时。这些自己动手对你有好处的。看了下你发的程序,是个高手写的,多学习一下。
回复

使用道具 举报

9#
ID:961114 发表于 2024-4-10 16:26 | 只看该作者
以往十几年一直在玩STC各型单片机,最近很长一段时间一直在玩STC新型单片机的新功能,测试了STC8H4K64TL单片机的I2C、RTC、触摸按键功能,也测试了STC32G的LCM_DMA应用(16BIT并口驱动SSD1963屏),上述的学习过程中曾多次在此请教问题,每次求问都得到了相应的指点、在此再表谢意!为了回馈各位的帮助发帖分享编程新手的关于STC8H单片机触摸按键的应用心得,也希望能帮到与我一样的菜鸟朋友。  以上是闲话 ------✄-------------------------------------✄--------------- 以下是正文  STC8H的触摸按键的基本功能通过官网例程加持是很容易实现的,只要配置好触摸按键的相关寄存器、根据按键触摸状态与非触摸状态的键值变化是很容易实现触摸按键的开/关功能的,以下实验使用的是STC8H4K64TL-20pin芯片,通过I/0模拟3线SPI总线控制一块ILI9481-480*320*3.5"TFT屏,用到了P1.1、P1.6、P5.4三个触摸按键端口。 因为我是在实验板自身显示单元的屏幕上实时显示测试结果的,如果你的实验板有显示单元可以通过自己的显示函数实现测试结果的显示,如果没有挂载显示单元的话请开启单片机的串口通讯功能通过stc-isp软件的串口助手窗口来实现监测。 注释:下述贴出的代码是在我的工程中摘录的片段,因为涉及公共变量的声明问题只能配合解读、不保证编译能够通过。 一、STC8H单片机触摸按键的基础代码 1.配置按键寄存器:(触摸按键初始化函数,请在主循环前声明此函数) void key_init()   {     TSRT = 0x00;   //没有LED分时扫描     TSCHEN1 |= 0x46;  //使能TK6-P1.6、TK2-P5.4、TK1-P1.1三个按键     TSCFG1  = (7<<4) + 7; //开关电容放电时间(系统时钟周期数7500)     TSCFG2  = 1;   //配置触摸按键控制器的内部参考电压AVCC的分压比为1/2     TSCTRL = 0x80;   //启动触摸按键控制、使用内部32K时钟     TK_ON();     //使能触摸按键中断(IE2 |=(1<<7))     EA=1;     //开启所有中断使能 } 上述寄存器配置请详情还请阅读数据手册的23.5.1-23.5.8章节。 2.按键扫描函数(中断函数): void key_int()  interrupt 35//keil2编译环境以根据STC数据手册给出的方案通过第三方软件扩展了中断号 {     u8 j;     j = TSSTA2;     if(j & 0x40)         TSSTA2 |= 0x40; //数据溢出,写1将TSIF清零     if(j & 0x80)     {         TSSTA2 |= 0x80; //扫描完成写1将TSIF清零         TKn=j&0x0f; //----键值存储--------------------------------------         switch(TKn)         {         case 0x01:             tk[1] = TSDAT;             break;  //1通道键值         case 0x02:             tk[2] = TSDAT;             break;  //2通道键值         case 0x06:             tk[0] = TSDAT;             break;  //6通道键值         } //----以下是按键状态判断-----------------------------         if((TKn==6)&&(tk[0]>value_H))//N1非触摸状态         {             N1=1;                  }         if((TKn==6)&&(tk[0]<value_L)) //N1触摸状态         {             N1=0;         }         if((TKn==2)&&(tk[2]>value_H)) //N2非触摸状态         {             N2=1;         }         if((TKn==2)&&(tk[2]<value_L)) //N2触摸状态         {             N2=0;         }         if((TKn==1)&&(tk[1]>value_H)) //N3非触摸状态         {             N3=1;         }         if((TKn==1)&&(tk[1]<value_L)) //N3触摸状态         {             N3=0;         }     } } 中断函数里的两个参数value_H、value_L是两个数据,为了获得这两个数据我又编写了两个函数如下: (1)、4位十六进制数据变换、显示函数void display_num(u16 x, u16 y, u16 num); 此函数是针对自己的字模库量身编写的,没有参考价值就不贴代码了!!! (2)、触摸键值显示函数 void display_value() {     if(TKn==0)     {         tk[0] = TSDAT;   //0通道键值     }     if(TKn==1)     {         tk[1] = TSDAT;   //1通道键值     }     if(TKn==2)     {         tk[2] = TSDAT;   //2通道键值     }     display_num(0, 250, tk[0]);     display_num(150, 250, tk[2]);     display_num(300, 250, tk[1]); } 程序运行后,可以实时显示三个按键的十六进制即时数据,根据对数据的观察可以得到没有触摸时键值和触摸后的键值,再根据显示值设定一个较小的非触摸键值value_H和一个较大的触摸键值value_L并宏定义好就可以继续玩耍了,因为只是简单验证,至于实际工程应用标准编程的零点值存储、零点值跟踪、门槛值配置这些我没深入研究就不做讨论了,如果需要的话请详细阅读数据手册。 二、按键功能的实现方法 1.单独按键实现开/关功能: 上述给出的按键初始化和中断这两个函数就可以实现触摸按键的基本功能,对于单个按键(例如TK6按键)控制一个(P3.4口)LED灯的点亮与熄灭的控制而言可以简化一下中断函数即可实现 void key_int()  interrupt 35 {     u8 j;     j = TSSTA2;     if(j & 0x40)         TSSTA2 |= 0x40; //数据溢出,写1将TSIF清零     if(j & 0x80)     {         TSSTA2 |= 0x80; //扫描完成写1将TSIF清零         TKn=j&0x0f;          if((TKn==6)&&(TSDAT<value_L)) //触摸状态         {             P34=~P34; //请在主循环前初始化此端口P34=1,低电平点亮LED         }     } }  中断函数修改完成后,主函数的主循环空运行的状态下,触摸按键就可以看到控制效果。 2、按键加减操作的实现: 触摸按键的加减操作可以参考常用的单片机独立按键(机械按键)代码来实现,触摸按键实现这个功能的话可以使用前述未修改的中断函数,下面是利用N1按键实现的代码 void Choice_set() {     if(N1==0)     {         rr++;        if(rr>9)//用于屏幕上一位数据的显示        rr=0;      } while(!N1); } 只要在主循环中调用这函数就能实现数据的加操作,如果主循环中同时添加字符显示函数就可以看到数据的变化每次触摸按键时数据不变离开手后数据增加1。  到此,STC8H触摸按键这点儿经验就分享完成了,由于经验浅薄有兴趣的新手可以看看、高手就直接绕行好了,其实即使新手也会发现这种通过死循环来判断按键释放的方法是不靠谱的,函数void Choice_set()这样的按键编程虽然可以实现操作功能,但也只能用于演示、在此也只能作为抛砖引玉了,我也在此真心向高手求救关于触摸按键加减操作的靠谱的实现方法,也希望有兴趣的朋友能够交流经验完善功能。
回复

使用道具 举报

10#
ID:1115386 发表于 2024-4-10 18:02 | 只看该作者
chxelc 发表于 2024-4-10 11:41
改好了,我的仿真是8.10版本的,打不开就在P3.3画一个按钮到地。

大佬现在功能实现了,但是用的屏幕是LGN12641BSIR的想换成12864的可以帮忙看一看吗,我换了屏幕显示的文字不对
回复

使用道具 举报

11#
ID:1115386 发表于 2024-4-10 18:06 | 只看该作者
这是功能实现了但是更换12864显示不正确,求各位大佬帮忙看一看

万年历.rar

191.86 KB, 下载次数: 0

回复

使用道具 举报

12#
ID:1115386 发表于 2024-4-10 19:40 | 只看该作者
大佬现在功能实现了,但是用的屏幕是LGN12641BSIR的想换成12864的可以帮忙看一看吗,我换了屏幕显示的文字不对
回复

使用道具 举报

13#
ID:712097 发表于 2024-4-11 10:00 | 只看该作者
是不是屏幕左右两边换位置了?解压后替换lcd.h试试

lcd.rar

4.43 KB, 下载次数: 2

回复

使用道具 举报

14#
ID:1115386 发表于 2024-4-11 12:57 | 只看该作者
chxelc 发表于 2024-4-11 10:00
是不是屏幕左右两边换位置了?解压后替换lcd.h试试

感谢大佬,可以正常显示了。但是发现了几个小问题不知道什么原因。一键切换12/24小时是在12点的时候无法切换成00点不知道哪里写的不完善,还有一个问题是在设置时间时在设置”分“的时候会出现模糊的情况特别是有两位数的时候。麻烦大佬帮忙指导修改一下万分感谢.
回复

使用道具 举报

15#
ID:1115386 发表于 2024-4-11 13:15 | 只看该作者
chxelc 发表于 2024-4-11 10:00
是不是屏幕左右两边换位置了?解压后替换lcd.h试试

感谢大佬,可以正常显示了。但是发现了几个小问题不知道什么原因。一键切换12/24小时是在12点的时候无法切换成00点不知道哪里写的不完善,还有一个问题是在设置时间时在设置”分“的时候会出现模糊的情况特别是有两位数的时候。麻烦大佬帮忙指导修改一下万分感谢.
回复

使用道具 举报

16#
ID:1115386 发表于 2024-4-11 13:30 | 只看该作者
chxelc 发表于 2024-4-11 10:00
是不是屏幕左右两边换位置了?解压后替换lcd.h试试

大佬这是我更换12864显示后的源文件,还有出现问题的图片麻烦您帮我看一看问题出在了什么地方

1111.jpg (630.2 KB, 下载次数: 65)

1111.jpg

万年历.zip

242.39 KB, 下载次数: 1

回复

使用道具 举报

17#
ID:1115386 发表于 2024-4-11 16:21 | 只看该作者
chxelc 发表于 2024-4-11 10:00
是不是屏幕左右两边换位置了?解压筇婊籰cd.h试试

感谢大佬,可以正常显示了。但是发现了几个小问题不知道什么原因。一键切换12/24小时是在12点的时候无法切换成00点不知道哪里写的不完善,还有一个问题是在设置时间时在设置”分“的时候会出现模糊的情况特别是有两位数的时候。麻烦大佬帮忙指导修改一下万分感谢.
回复

使用道具 举报

18#
ID:1115386 发表于 2024-4-11 16:30 | 只看该作者
chxelc 发表于 2024-4-11 10:00
是不是屏幕左右两边换位置了?解压后替换lcd.h试试

感谢大佬,可以正常显示了。但是发现了几个小问题不知道什么原因。一键切换12/24小时是在12点的时候无法切换成00点不知道哪里写的不完善,还有一个问题是在设置时间时在设置”分“的时候会出现模糊的情况特别是有两位数的时候。麻烦大佬帮忙指导修改一下万分感谢.
回复

使用道具 举报

19#
ID:712097 发表于 2024-4-12 16:27 | 只看该作者
wuqing12345 发表于 2024-4-11 13:30
大佬这是我更换12864显示后的源文件,还有出现问题的图片麻烦您帮我看一看问题出在了什么地方

lcd.h
609行
i = *point & 0xff;
改为
i = *point & 0x0f;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表