逛論壇看到有大神制作的oled時鐘,沒有調時功能,我把調時功能加上了
原貼http://www.zg4o1577.cn/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第七次,秒清零,退出設置狀態
51hei圖片編輯_20220324150924.jpg (81.96 KB, 下載次數: 85)
下載附件
2022-3-24 15:46 上傳
51hei圖片編輯_20220324150924.jpg (81.96 KB, 下載次數: 86)
下載附件
2022-3-24 15:34 上傳
單片機源程序如下:
- #include "DS3231.h"
- #include "led.h"
- #include "exti.h"
- #include "oled.h"
- #include "i2c_soft.h"
- #include "delay.h"
- #include "sys.h"
- #include "bmp.h"
- #include "key.h"
- //#include "oledfont.h"
- u8 a1,a2,a3,a4; //按鍵自鎖
- u8 set;
- int main(void)
- {
- u8 k=0;//*t=0,p=2,
- static u8 t;
- u8 year,month,day,hour,min,sec,week;
- u8 temp1;
- delay_init(); //延時函數初始化
- LED_Init(); //初始化與LED連接的硬件接口
- I2C_GPIO_Config();
- // EXTI_KEY_Config();
- DS3231_Init();
- // Set_DS3231_Time(22,3,22,12,58,00,2);//22年3月22號58分00秒周2 .第1次初始化DS3231使用后注銷
- OLED_Init();
- OLED_Clear();
- // LED1=0; //LED1 ON
- KEY_Init(); //初始化與按鍵連接的硬件接口
-
- while(1)
- {
- Get_DS3231_Time();
- // if(k!=calendar.sec)
- {
- // k=calendar.sec
- //顯示日期 ;
- OLED_ShowString(0,0,"2",16); //顯示年的千位字符2
- OLED_ShowString(10,0,"0",16); //顯示年的百位字符0
- if(set==0)
- {
- OLED_ShowChar(20,0,calendar.w_year/10+48,16);
- OLED_ShowChar(31,0,calendar.w_year%10+48,16);
-
- OLED_ShowCHinese(40,0,0);//在2列6行顯示”年“
- OLED_ShowChar(59,0,calendar.w_month/10+48,16);
- OLED_ShowChar(68,0,calendar.w_month%10+48,16);
- OLED_ShowCHinese(78,0,1);//在2列6行顯示”月“
- OLED_ShowChar(96,0,calendar.w_date/10+48,16);
- OLED_ShowChar(105,0,calendar.w_date%10+48,16);
- OLED_ShowCHinese(113,0,14);//在2列6行顯示”日“
- //顯示時間
-
- OLED_Show16X32(0,2,calendar.hour/10);
- OLED_Show16X32(17,2,calendar.hour%10);
- OLED_Show16X32(33,2,10);//:號
- OLED_Show16X32(48,2,calendar.min/10);
- OLED_Show16X32(64,2,calendar.min%10);
- OLED_Show16X32(80,2,10);//:號
- OLED_Show16X32(96,2,calendar.sec/10);
- OLED_Show16X32(111,2,calendar.sec%10);
-
- OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行顯示”星期數“
-
- }
-
- if(set==1)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
-
-
- OLED_ShowChar(20,0,calendar.w_year/10+48,16);
- OLED_ShowChar(31,0,calendar.w_year%10+48,16);
- }
- else
- {
- OLED_ShowString(20,0," ",16); //不顯
- OLED_ShowString(31,0," ",16); // 不顯
- }
- }
- else{
- OLED_ShowChar(20,0,calendar.w_year/10+48,16);
- OLED_ShowChar(31,0,calendar.w_year%10+48,16);
- }
-
-
- if(set==2)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
- OLED_ShowChar(59,0,calendar.w_month/10+48,16);
- OLED_ShowChar(68,0,calendar.w_month%10+48,16);
- }
- else
- {
- OLED_ShowString(59,0," ",16); //不顯
- OLED_ShowString(68,0," ",16); //不顯
- }
- }
- else{
- OLED_ShowChar(59,0,calendar.w_month/10+48,16);
- OLED_ShowChar(68,0,calendar.w_month%10+48,16);
-
- }
-
-
-
- if(set==3)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
- OLED_ShowChar(96,0,calendar.w_date/10+48,16);
- OLED_ShowChar(105,0,calendar.w_date%10+48,16);
- }
- else
- {
- OLED_ShowString(96,0," ",16); //不顯
- OLED_ShowString(105,0," ",16); //不顯
- }
- }
- else{
- OLED_ShowChar(96,0,calendar.w_date/10+48,16);
- OLED_ShowChar(105,0,calendar.w_date%10+48,16);
- }
-
- // OLED_ShowCHinese(40,0,0);//在2列6行顯示”年“
- // OLED_ShowChar(59,0,calendar.w_month/10+48,16);
- // OLED_ShowChar(68,0,calendar.w_month%10+48,16);
- // OLED_ShowCHinese(78,0,1);//在2列6行顯示”月“
- // OLED_ShowChar(96,0,calendar.w_date/10+48,16);
- // OLED_ShowChar(105,0,calendar.w_date%10+48,16);
- // OLED_ShowCHinese(113,0,14);//在2列6行顯示”日“
- //顯示時間
-
- if(set==5)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
- OLED_Show16X32(0,2,calendar.hour/10);
- OLED_Show16X32(17,2,calendar.hour%10);
- }else{
- OLED_Show16X32(0,2,11); //不顯
- OLED_Show16X32(17,2,11);//不顯
- }
-
- }
- else{
- OLED_Show16X32(0,2,calendar.hour/10);
- OLED_Show16X32(17,2,calendar.hour%10);
- }
-
- if(set>0)
- OLED_Show16X32(33,2,10);//:號
-
- if(set==6)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
- OLED_Show16X32(48,2,calendar.min/10);
- OLED_Show16X32(64,2,calendar.min%10);
- }else{
- OLED_Show16X32(48,2,11); //不顯
- OLED_Show16X32(64,2,11);//不顯
- }
-
- }
- else{
- OLED_Show16X32(48,2,calendar.min/10);
- OLED_Show16X32(64,2,calendar.min%10);
- }
-
- if(set>0)
- OLED_Show16X32(80,2,10);//:號
-
- // if(set==7)
- // {
- // DS3231_WR_Byte(0x00,0);//寫DS3231
- // t++;
- // if(t==16) t=0;
- // if(t>8){
- // OLED_Show16X32(96,2,calendar.sec/10);
- // OLED_Show16X32(111,2,calendar.sec%10);
- // }else{
- // OLED_Show16X32(96,2,11);
- // OLED_Show16X32(111,2,11);
- // }
- // }
- // else{
- // OLED_Show16X32(96,2,calendar.sec/10);
- // OLED_Show16X32(111,2,calendar.sec%10);
- // }
-
-
-
- // OLED_Show16X32(0,2,calendar.hour/10);
- // OLED_Show16X32(17,2,calendar.hour%10);
- // OLED_Show16X32(33,2,10);//:號
- // OLED_Show16X32(48,2,calendar.min/10);
- // OLED_Show16X32(64,2,calendar.min%10);
- // OLED_Show16X32(80,2,10);//:號
- // OLED_Show16X32(96,2,calendar.sec/10);
- // OLED_Show16X32(111,2,calendar.sec%10);
-
- //顯示星期
- // OLED_ShowCHinese(2,6,6);//在2列6行顯示”星“
- // OLED_ShowCHinese(18,6,7);//在18列6行顯示”期“
- OLED_ShowCHinese(0,6,2);//在2列6行顯示”周“
- if(set==4)
- {
- t++;
- if(t==16) t=0;
- if(t>8){
- OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行顯示”星期數“
-
-
- }else{
- OLED_ShowCHinese(20,6,15); //在34列6行不顯示”星期數“
-
- }
- }
- else{
- OLED_ShowCHinese(20,6,calendar.week+7); //在34列6行顯示”星期數“
- }
-
-
-
- //顯示溫度數據
- OLED_ShowChar(70,6,127,16); //溫度計圖標
- // OLED_ShowCHinese(46,6,4);//在2列6行顯示”溫“
- // OLED_ShowCHinese(64,6,5);//在18列6行顯示”度“
- OLED_ShowChar(80,6,calendar.temper_H/10+48,16);//顯示溫度十位
- OLED_ShowChar(89,6,calendar.temper_H%10+48,16);//顯示溫度個位
- OLED_ShowString(97,6,".",16);//.點
- OLED_ShowChar(104,6,calendar.temper_L/10+48,16);//顯示小數
- OLED_ShowCHinese(113,6,3);//溫度C
- }
-
- if(a1==0)
- {
- if(KEY0==0)
- {
- delay_ms(10);
- if(KEY0==0)
- {
- set++;
- a1=1;
- if(set==7)
- {
- set=0;
- DS3231_WR_Byte(0x00,0);//DS3231秒寫0
- }
-
- }
- }
- }
- if(KEY0==1)
- {
- a1=0;
- }
- if(a2==0)
- {
- if(KEY1==0)
- {
- delay_ms(10);
- if(KEY1==0)
- {
- a2=1;
- switch(set)
- {
- case 1:year++;if(year>99)year=22;
- temp1=B_BCD(year);//十進制轉BCD
- DS3231_WR_Byte(0x06,temp1);//寫DS3231
- break;
-
- case 2:month++;if(month>12)month=1;
- temp1=B_BCD(month);//十進制轉BCD
- DS3231_WR_Byte(0x05,temp1);//寫DS3231
- break;
- case 3:day++;if(day>31)month=1;
- temp1=B_BCD(day);//十進制轉BCD
- DS3231_WR_Byte(0x04,temp1);//寫DS3231
- break;
-
- case 4:week++;if(week>7)hour=1;
- temp1=B_BCD(week);//十進制轉BCD
- DS3231_WR_Byte(0x03,week);//寫DS3231
- break;
-
- case 5:hour++;if(hour>23)hour=0;
- temp1=B_BCD(hour);//十進制轉BCD
- DS3231_WR_Byte(0x02,temp1);//寫DS3231
- break;
- case 6:min++;if(min>59)min=0;
- temp1=B_BCD(min);//十進制轉BCD
- DS3231_WR_Byte(0x01,temp1);//寫DS3231
- break;
- // case 7:
- // temp1=B_BCD(min);//十進制轉BCD
- // DS3231_WR_Byte(0x00,0);//寫DS3231
-
- break;
-
- }
-
- }
- }
- }
- if(KEY1==1)
- {
- a2=0;
- }
- // switch(set)
- // {
- // case 1:year++;if(year>99)year=22;
- // temp1=B_BCD(year);//十進制轉BCD
- // DS3231_WR_Byte(0x06,temp1);//寫DS3231
- // break;
- // case 2:month++;if(month>31)month=1;
- // temp1=B_BCD(month);//十進制轉BCD
- // DS3231_WR_Byte(0x05,temp1);//寫DS3231
- //
- // break;
- //
- // }
-
-
- }
- }
復制代碼
Keil代碼下載:
IIC OLED+DS3231時鐘.7z
(197.66 KB, 下載次數: 184)
2022-3-24 17:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|