找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32F103单片机+ds3231+oled 12864万年历 可按键调时程序

  [复制链接]
跳转到指定楼层
楼主
逛论坛看到有大神制作的oled时钟,没有调时功能,我把调时功能加上了
原贴http://www.51hei.com/bbs/dpj-213267-1.html
接线说明:
    IIC总线接DS3231模块和0.96 oled模块
1.  SCL接PB6
2.  SDA接PB7

按键:key0接PC5,key1接PC15,
芯片:STM32F103RCT6

调时过程:
1. 按key0第一次,年十位个位闪烁,按key1年++,
2. 按key0第二次,月十位个位闪烁,按key1月++,
3. 按key0第三次,日十位个位闪烁,按key1日++,
4. 按key0第四次,周闪烁,按key1周++,
5. 按key0第五次,时十位个位闪烁,按key1时++,
6. 按key0第六次,分十位个位闪烁,按key1分++,
7. 按key0第七次,秒清零,退出设置状态



单片机源程序如下:
  1. #include "DS3231.h"
  2. #include "led.h"
  3. #include "exti.h"
  4. #include "oled.h"
  5. #include "i2c_soft.h"
  6. #include "delay.h"
  7. #include "sys.h"
  8. #include "bmp.h"
  9. #include "key.h"
  10. //#include "oledfont.h"
  11. u8  a1,a2,a3,a4;                      //按键自锁
  12. u8 set;
  13. int main(void)
  14. {        
  15.         u8 k=0;//*t=0,p=2,
  16.         static u8 t;
  17.         u8 year,month,day,hour,min,sec,week;
  18.         u8 temp1;
  19.         delay_init();                        //延时函数初始化         
  20.         LED_Init();                                //初始化与LED连接的硬件接口
  21.         I2C_GPIO_Config();
  22. //        EXTI_KEY_Config();
  23.         DS3231_Init();
  24. //        Set_DS3231_Time(22,3,22,12,58,00,2);//22年3月22号58分00秒周2 .第1次初始化DS3231使用后注销
  25.         OLED_Init();
  26.         OLED_Clear();
  27. //        LED1=0;                                //LED1 ON
  28.         KEY_Init();                  //初始化与按键连接的硬件接口

  29.                                 
  30.         while(1)
  31.         {
  32.                 Get_DS3231_Time();
  33. //                if(k!=calendar.sec)
  34.                 {
  35.                         //                        k=calendar.sec
  36.                         //显示日期 ;                        
  37.                         OLED_ShowString(0,0,"2",16); //显示年的千位字符2
  38.                         OLED_ShowString(10,0,"0",16); //显示年的百位字符0

  39.                         if(set==0)
  40.                         {
  41.                                 OLED_ShowChar(20,0,calendar.w_year/10+48,16);
  42.                                 OLED_ShowChar(31,0,calendar.w_year%10+48,16);                        
  43.                         
  44.                                 OLED_ShowCHinese(40,0,0);//在2列6行显示”年“
  45.                                 OLED_ShowChar(59,0,calendar.w_month/10+48,16);
  46.                                 OLED_ShowChar(68,0,calendar.w_month%10+48,16);
  47.                                 OLED_ShowCHinese(78,0,1);//在2列6行显示”月“
  48.                                 OLED_ShowChar(96,0,calendar.w_date/10+48,16);
  49.                                 OLED_ShowChar(105,0,calendar.w_date%10+48,16);
  50.                                 OLED_ShowCHinese(113,0,14);//在2列6行显示”日“


  51.                                 //显示时间
  52.                         
  53.                                 OLED_Show16X32(0,2,calendar.hour/10);
  54.                                 OLED_Show16X32(17,2,calendar.hour%10);                        
  55.                                 OLED_Show16X32(33,2,10);//:号
  56.                                 OLED_Show16X32(48,2,calendar.min/10);
  57.                                 OLED_Show16X32(64,2,calendar.min%10);
  58.                                 OLED_Show16X32(80,2,10);//:号
  59.                                 OLED_Show16X32(96,2,calendar.sec/10);
  60.                                 OLED_Show16X32(111,2,calendar.sec%10);
  61.                                 
  62.                                 OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行显示”星期数“
  63.                                 
  64.                         }
  65.                         
  66.                         if(set==1)
  67.                         {
  68.                                         t++;
  69.                                         if(t==16) t=0;
  70.                                         if(t>8){
  71.                                                 
  72.                                                 
  73.                                         OLED_ShowChar(20,0,calendar.w_year/10+48,16);
  74.                                         OLED_ShowChar(31,0,calendar.w_year%10+48,16);
  75.                                         }                        
  76.                                         else
  77.                                         {                        
  78.                                         OLED_ShowString(20,0," ",16); //不显
  79.                                         OLED_ShowString(31,0," ",16); //        不显                        
  80.                                         }
  81.                         }
  82.                         else{
  83.                                         OLED_ShowChar(20,0,calendar.w_year/10+48,16);
  84.                                         OLED_ShowChar(31,0,calendar.w_year%10+48,16);                        
  85.                         }
  86.                         
  87.                         
  88.                         if(set==2)
  89.                         {
  90.                                         t++;
  91.                                         if(t==16) t=0;
  92.                                         if(t>8){
  93.                                                         OLED_ShowChar(59,0,calendar.w_month/10+48,16);
  94.                                                         OLED_ShowChar(68,0,calendar.w_month%10+48,16);
  95.                                         }                        
  96.                                         else
  97.                                         {                        
  98.                                                         OLED_ShowString(59,0," ",16); //不显
  99.                                                         OLED_ShowString(68,0," ",16); //不显                                
  100.                                         }
  101.                         }
  102.                         else{
  103.                                                         OLED_ShowChar(59,0,calendar.w_month/10+48,16);
  104.                                                         OLED_ShowChar(68,0,calendar.w_month%10+48,16);
  105.                                 
  106.                         }
  107.                         
  108.                         


  109.                         
  110.                         if(set==3)
  111.                         {
  112.                                         t++;
  113.                                         if(t==16) t=0;
  114.                                         if(t>8){
  115.                                                         OLED_ShowChar(96,0,calendar.w_date/10+48,16);
  116.                                                         OLED_ShowChar(105,0,calendar.w_date%10+48,16);
  117.                                         }                        
  118.                                         else
  119.                                         {                        
  120.                                                         OLED_ShowString(96,0," ",16); //不显
  121.                                                         OLED_ShowString(105,0," ",16); //不显                                
  122.                                         }
  123.                         }
  124.                         else{
  125.                                                         OLED_ShowChar(96,0,calendar.w_date/10+48,16);
  126.                                                         OLED_ShowChar(105,0,calendar.w_date%10+48,16);                                
  127.                         }
  128.                         
  129. //                        OLED_ShowCHinese(40,0,0);//在2列6行显示”年“
  130. //                        OLED_ShowChar(59,0,calendar.w_month/10+48,16);
  131. //                        OLED_ShowChar(68,0,calendar.w_month%10+48,16);
  132. //                        OLED_ShowCHinese(78,0,1);//在2列6行显示”月“
  133. //                        OLED_ShowChar(96,0,calendar.w_date/10+48,16);
  134. //                        OLED_ShowChar(105,0,calendar.w_date%10+48,16);
  135. //                        OLED_ShowCHinese(113,0,14);//在2列6行显示”日“
  136.                         //显示时间
  137.                         
  138.                         if(set==5)
  139.                         {
  140.                                 t++;
  141.                                 if(t==16) t=0;
  142.                                 if(t>8){
  143.                                         OLED_Show16X32(0,2,calendar.hour/10);
  144.                                         OLED_Show16X32(17,2,calendar.hour%10);
  145.                                 }else{
  146.                                         OLED_Show16X32(0,2,11); //不显
  147.                                         OLED_Show16X32(17,2,11);//不显
  148.                                 }
  149.         
  150.                         }
  151.                         else{
  152.                                         OLED_Show16X32(0,2,calendar.hour/10);
  153.                                         OLED_Show16X32(17,2,calendar.hour%10);                                
  154.                         }
  155.                         
  156.                         if(set>0)
  157.                         OLED_Show16X32(33,2,10);//:号
  158.                         
  159.                         if(set==6)
  160.                         {
  161.                                 t++;
  162.                                 if(t==16) t=0;
  163.                                 if(t>8){
  164.                                         OLED_Show16X32(48,2,calendar.min/10);
  165.                                         OLED_Show16X32(64,2,calendar.min%10);
  166.                                 }else{
  167.                                         OLED_Show16X32(48,2,11); //不显
  168.                                         OLED_Show16X32(64,2,11);//不显
  169.                                 }
  170.                                 
  171.                         }
  172.                         else{
  173.                                         OLED_Show16X32(48,2,calendar.min/10);
  174.                                         OLED_Show16X32(64,2,calendar.min%10);                                
  175.                         }
  176.                         
  177.                         if(set>0)
  178.                         OLED_Show16X32(80,2,10);//:号
  179.                         
  180. //                        if(set==7)
  181. //                        {
  182. //                                DS3231_WR_Byte(0x00,0);//写DS3231
  183. //                                t++;
  184. //                                if(t==16) t=0;
  185. //                                if(t>8){
  186. //                                        OLED_Show16X32(96,2,calendar.sec/10);
  187. //                                        OLED_Show16X32(111,2,calendar.sec%10);
  188. //                                }else{
  189. //                                        OLED_Show16X32(96,2,11);
  190. //                                        OLED_Show16X32(111,2,11);
  191. //                                }                                
  192. //                        }
  193. //                        else{
  194. //                                        OLED_Show16X32(96,2,calendar.sec/10);
  195. //                                        OLED_Show16X32(111,2,calendar.sec%10);                                
  196. //                        }
  197.                         
  198.                         
  199.                         
  200. //                        OLED_Show16X32(0,2,calendar.hour/10);
  201. //                        OLED_Show16X32(17,2,calendar.hour%10);                        
  202. //                        OLED_Show16X32(33,2,10);//:号
  203. //                        OLED_Show16X32(48,2,calendar.min/10);
  204. //                        OLED_Show16X32(64,2,calendar.min%10);
  205. //                        OLED_Show16X32(80,2,10);//:号
  206. //                        OLED_Show16X32(96,2,calendar.sec/10);
  207. //                        OLED_Show16X32(111,2,calendar.sec%10);
  208.                         
  209.                         //显示星期
  210. //                        OLED_ShowCHinese(2,6,6);//在2列6行显示”星“
  211. //                        OLED_ShowCHinese(18,6,7);//在18列6行显示”期“
  212.                         OLED_ShowCHinese(0,6,2);//在2列6行显示”周“
  213.                         if(set==4)
  214.                         {
  215.                                 t++;
  216.                                 if(t==16) t=0;
  217.                                 if(t>8){
  218.                                                 OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行显示”星期数“  
  219.                         
  220.                                        
  221.                                 }else{
  222.                                                 OLED_ShowCHinese(20,6,15); //在34列6行不显示”星期数“  
  223.                                        
  224.                                 }                                
  225.                         }
  226.                         else{

  227.                                                 OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行显示”星期数“  

  228.                         }
  229.                         
  230.                         
  231.                         
  232.                         //显示温度数据
  233.                         OLED_ShowChar(70,6,127,16);                        //温度计图标
  234. //                        OLED_ShowCHinese(46,6,4);//在2列6行显示”温“
  235. //                        OLED_ShowCHinese(64,6,5);//在18列6行显示”度“
  236.                         OLED_ShowChar(80,6,calendar.temper_H/10+48,16);//显示温度十位
  237.                         OLED_ShowChar(89,6,calendar.temper_H%10+48,16);//显示温度个位
  238.                         OLED_ShowString(97,6,".",16);//.点
  239.                         OLED_ShowChar(104,6,calendar.temper_L/10+48,16);//显示小数
  240.                         OLED_ShowCHinese(113,6,3);//温度C
  241.                 }
  242.                
  243.                         if(a1==0)
  244.                         {
  245.                                 if(KEY0==0)
  246.                                 {
  247.                                         delay_ms(10);
  248.                                         if(KEY0==0)
  249.                                         {
  250.                                                 set++;
  251.                                                 a1=1;
  252.                                                 if(set==7)
  253.                                                 {
  254.                                                         set=0;
  255.                                                         DS3231_WR_Byte(0x00,0);//DS3231秒写0
  256.                                                 }
  257.                                        
  258.                                         }
  259.                                 }
  260.                         }
  261.                  if(KEY0==1)
  262.                  {
  263.                          a1=0;
  264.                  }


  265.                         if(a2==0)
  266.                         {
  267.                                 if(KEY1==0)
  268.                                 {
  269.                                         delay_ms(10);
  270.                                         if(KEY1==0)
  271.                                         {
  272.                                                 a2=1;
  273.                                                 switch(set)
  274.                                                 {
  275.                                                         case 1:year++;if(year>99)year=22;
  276.                                                                                 temp1=B_BCD(year);//十进制转BCD
  277.                                                                                 DS3231_WR_Byte(0x06,temp1);//写DS3231
  278.                                                         break;
  279.                                                         
  280.                                                         case 2:month++;if(month>12)month=1;  
  281.                                                                                 temp1=B_BCD(month);//十进制转BCD
  282.                                                                                 DS3231_WR_Byte(0x05,temp1);//写DS3231
  283.                                                         break;
  284.                                                         case 3:day++;if(day>31)month=1;  
  285.                                                                                 temp1=B_BCD(day);//十进制转BCD
  286.                                                                                 DS3231_WR_Byte(0x04,temp1);//写DS3231
  287.                                                         break;
  288.                                                         
  289.                                                         case 4:week++;if(week>7)hour=1;  
  290.                                                                                 temp1=B_BCD(week);//十进制转BCD
  291.                                                                                 DS3231_WR_Byte(0x03,week);//写DS3231
  292.                                                         break;
  293.                                                         
  294.                                                         case 5:hour++;if(hour>23)hour=0;  
  295.                                                                                 temp1=B_BCD(hour);//十进制转BCD
  296.                                                                                 DS3231_WR_Byte(0x02,temp1);//写DS3231
  297.                                                         break;
  298.                                                         case 6:min++;if(min>59)min=0;  
  299.                                                                                 temp1=B_BCD(min);//十进制转BCD
  300.                                                                                 DS3231_WR_Byte(0x01,temp1);//写DS3231
  301.                                                         break;
  302. //                                                        case 7:
  303.                                                         //                        temp1=B_BCD(min);//十进制转BCD
  304. //                                                                                DS3231_WR_Byte(0x00,0);//写DS3231
  305.                                                         
  306.                                                         break;
  307.                                                         
  308.                                                 }
  309.                                        
  310.                                         }
  311.                                 }
  312.                         }
  313.                  if(KEY1==1)
  314.                  {
  315.                          a2=0;
  316.                  }

  317. //                                                switch(set)
  318. //                                                {
  319. //                                                        case 1:year++;if(year>99)year=22;
  320. //                                                                                temp1=B_BCD(year);//十进制转BCD
  321. //                                                                                DS3231_WR_Byte(0x06,temp1);//写DS3231
  322. //                                                        break;
  323. //                                                        case 2:month++;if(month>31)month=1;  
  324. //                                                                                temp1=B_BCD(month);//十进制转BCD
  325. //                                                                                DS3231_WR_Byte(0x05,temp1);//写DS3231
  326. //                                                        
  327. //                                                        break;
  328. //                                                        
  329. //                                                }
  330.                  
  331.                
  332.         }
  333. }        
复制代码

Keil代码下载: IIC OLED+DS3231时钟.7z (197.66 KB, 下载次数: 171)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:229641 发表于 2022-3-26 07:22 来自手机 | 只看该作者
总算是有实用级别的了,赞一个…
回复

使用道具 举报

板凳
ID:229641 发表于 2022-4-16 10:44 来自手机 | 只看该作者
按键程序有坑自给自足…
回复

使用道具 举报

地板
ID:991121 发表于 2023-8-6 15:36 | 只看该作者
好像要学习的东西都下载不了,都需币啊
回复

使用道具 举报

5#
ID:336378 发表于 2023-8-11 09:12 | 只看该作者
赞一个,前人种树,后人乘凉,多谢奉献精神。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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