业余时间把论坛上一位大神的51单片机LCD12864万年历移植到STMC8T6+0.96OLED屏上,可按键设置时间日期闹钟,代码不规范,有一些暂时没发现的bug欢迎指教。
制作出来的实物图如下:
单片机源程序如下:
- #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; //系统运行状态
- u8 flag1s = 0; //1s定时标志位
- u8 flag200ms = 0; //200ms定时标志
- extern void KeyDriver(void);
- extern void RefreshLunarn(void);
- extern void KeyScan(void);
- int main()
- {
-
-
-
- SystemInit();
- delay_init(72); //延时初始化
- NVIC_Configuration();
- uart_init(9600); //串口初始化
- //Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms
- Timerx_Init(99,719);//10Khz的计数频率,计数到50为1ms
- OLED_Init();
- Init_DS1302();
- LED_Init();
- DS18B20_Init();
-
- KEY_Init();
- delay_ms(50);
- RefreshTime(); //刷新时间
- RefreshDate(1); //立即刷新日期
- RefreshTemp(1); //立即刷新温度显示
- RefreshLunarn();
- while(1)
- {
-
-
- KeyScan();//按键扫描
- KeyDriver(); //按键检测
- if(flag200ms) //200ms时间到
- {
- flag200ms = 0; //清零标志位
- AlarmMonitor(); //监控闹钟
- if (staSystem == E_NORMAL)//如果系统正常运行
- {
- RefreshTime(); //刷新时间
- RefreshDate(0);//刷新日期
- RefreshLunarn();//刷新主界面农历
- }
- if (staSystem == Dis_Alarm)
- {
- RefreshLunar(); //刷新阴历
- }
- }
- if(flag1s && (staSystem == E_NORMAL))//1s时间到并且系统为正常运行
- {
- flag1s = 0;//清零标志位
- RefreshTemp(0);//刷新温度
- }
- }
-
- }
- /* 温度刷新函数,读取当前温度并根据需要刷新液晶显示,
- ** ops-刷新选项:为0时只当温度变化才刷新,非0则立即刷新 */
- void RefreshTemp(uint8_t ops)
- {
- short temp;
-
- static int16_t backup = 0;
-
- temp=DS18B20_Get_Temp(); //获取当前温度值
- //DS18B20_Start(); //启动下一次转换
- //temp >>= 4; //舍弃4bit小数位
-
- 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); //显示温度个位
- OLED_P8x16Str(96,6,14); //显示小数点
- OLED_P8x16Str(104,6,temp % 10); //显示温度小数第1位
- OLED_ShowCHinese(112,6,14); //显示℃符号
- OLED_ShowCHinese(96, 0, 43); //显示星期
- OLED_ShowCHinese(64,6,21); //显示温度图标 大
- //RefreshLunarn();//刷新主界面农历
- 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中断发生与否:TIM 中断源
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
- tmr200ms++; //定时200ms
- if (tmr200ms >= 1)
- {
- tmr200ms = 0;
- flag200ms = 1;
- tmr1s++; //定时1s
- if (tmr1s >= 5)
- {
- tmr1s = 0;
- flag1s = 1;
- }
- }
- //KeyScan();//按键扫描
-
- }
- }
复制代码
所有代码51hei附件下载:
51黑论坛OLED万年历.7z
(211.71 KB, 下载次数: 660)
|