|
業(yè)余時(shí)間把論壇上一位大神的51單片機(jī)LCD12864萬年歷移植到STMC8T6+0.96OLED屏上,可按鍵設(shè)置時(shí)間日期鬧鐘,代碼不規(guī)范,有一些暫時(shí)沒發(fā)現(xiàn)的bug歡迎指教。
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
- #include "main.h"
- #include "delay.h"
- #include "sys.h"
- #include "led.h"
- #include "usart.h"
- #include "oled.h"
- #include "timer.h"
- #include "stm32f10x.h"
- #include "key.h"
- #include "nonli.h"
- #include "yangli.h"
- #include "ds18b20.h"
- #include "DS1302.h"
- enum eStaSystem staSystem = E_NORMAL; //系統(tǒng)運(yùn)行狀態(tài)
- u8 flag1s = 0; //1s定時(shí)標(biāo)志位
- u8 flag200ms = 0; //200ms定時(shí)標(biāo)志
- extern void KeyDriver(void);
- extern void RefreshLunarn(void);
- extern void KeyScan(void);
- int main()
- {
-
-
-
- SystemInit();
- delay_init(72); //延時(shí)初始化
- NVIC_Configuration();
- uart_init(9600); //串口初始化
- //Timerx_Init(5000,7199);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到5000為500ms
- Timerx_Init(99,719);//10Khz的計(jì)數(shù)頻率,計(jì)數(shù)到50為1ms
- OLED_Init();
- Init_DS1302();
- LED_Init();
- DS18B20_Init();
-
- KEY_Init();
- delay_ms(50);
- RefreshTime(); //刷新時(shí)間
- RefreshDate(1); //立即刷新日期
- RefreshTemp(1); //立即刷新溫度顯示
- RefreshLunarn();
- while(1)
- {
-
-
- KeyScan();//按鍵掃描
- KeyDriver(); //按鍵檢測(cè)
- if(flag200ms) //200ms時(shí)間到
- {
- flag200ms = 0; //清零標(biāo)志位
- AlarmMonitor(); //監(jiān)控鬧鐘
- if (staSystem == E_NORMAL)//如果系統(tǒng)正常運(yùn)行
- {
- RefreshTime(); //刷新時(shí)間
- RefreshDate(0);//刷新日期
- RefreshLunarn();//刷新主界面農(nóng)歷
- }
- if (staSystem == Dis_Alarm)
- {
- RefreshLunar(); //刷新陰歷
- }
- }
- if(flag1s && (staSystem == E_NORMAL))//1s時(shí)間到并且系統(tǒng)為正常運(yùn)行
- {
- flag1s = 0;//清零標(biāo)志位
- RefreshTemp(0);//刷新溫度
- }
- }
-
- }
- /* 溫度刷新函數(shù),讀取當(dāng)前溫度并根據(jù)需要刷新液晶顯示,
- ** ops-刷新選項(xiàng):為0時(shí)只當(dāng)溫度變化才刷新,非0則立即刷新 */
- void RefreshTemp(uint8_t ops)
- {
- short temp;
-
- static int16_t backup = 0;
-
- temp=DS18B20_Get_Temp(); //獲取當(dāng)前溫度值
- //DS18B20_Start(); //啟動(dòng)下一次轉(zhuǎn)換
- //temp >>= 4; //舍棄4bit小數(shù)位
-
- if ((backup!=temp) || (ops!=0)) //按需要刷新液晶顯示
- {
-
- if(temp/10 > 0)
- OLED_P8x16Str(80,6,temp/100); //顯示溫度十位
- else
- OLED_P8x16Str(80,6,12); //否則溫度十位為0不顯示
- OLED_P8x16Str(88,6,temp % 100/10); //顯示溫度個(gè)位
- OLED_P8x16Str(96,6,14); //顯示小數(shù)點(diǎn)
- OLED_P8x16Str(104,6,temp % 10); //顯示溫度小數(shù)第1位
- OLED_ShowCHinese(112,6,14); //顯示℃符號(hào)
- OLED_ShowCHinese(96, 0, 43); //顯示星期
- OLED_ShowCHinese(64,6,21); //顯示溫度圖標(biāo) 大
- //RefreshLunarn();//刷新主界面農(nóng)歷
- temp= 0;
- backup = temp; //刷新上次溫度值
- }
- }
- void TIM3_IRQHandler(void) //TIM3中斷
- {
- static uint8_t tmr1s = 0;
- static uint8_t tmr200ms = 0;
-
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
- tmr200ms++; //定時(shí)200ms
- if (tmr200ms >= 1)
- {
- tmr200ms = 0;
- flag200ms = 1;
- tmr1s++; //定時(shí)1s
- if (tmr1s >= 5)
- {
- tmr1s = 0;
- flag1s = 1;
- }
- }
- //KeyScan();//按鍵掃描
-
- }
- }
復(fù)制代碼
所有代碼51hei附件下載:
51黑論壇OLED萬年歷.7z
(211.71 KB, 下載次數(shù): 660)
2021-9-30 17:08 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|