MCU使用STC15W408AS,DS1302小模塊,ssd1306驅動的12864;
兩個按鍵接在p3.0,p3.1用于時間設置;
實物圖片:
1.jpg (212.24 KB, 下載次數: 87)
下載附件
2018-5-21 09:57 上傳
2.jpg (187.99 KB, 下載次數: 81)
下載附件
2018-5-21 09:57 上傳
3.jpg (187.16 KB, 下載次數: 72)
下載附件
2018-5-21 09:57 上傳
4.jpg (194.1 KB, 下載次數: 85)
下載附件
2018-5-21 09:57 上傳
單片機源程序如下:
- /*
- 啟動時間:2018年5月8日;
- 工作頻率:11.0592Mhz
- 作者:Oachw;
- 完成時間:2018年5月12日;
- MCU:STC15W408AS
- */
- #include <ds1302.h>
- #include <stc15.h>
- #include <12864.h>
- #include <delay.h>
- #include <character.h>
- #define KEYSET1 0x01
- #define KEYSET2 0x02
- sbit key1=P3^0;
- sbit key2=P3^1;
- //bit key1_on,key2_on;
- u8 cnt_plus;
- //u8 a=0;
- //按鍵程序來源百度;
- unsigned char timer=0;
- unsigned char Trg;
- unsigned char Cont;
- unsigned char se[2],mi[2],ho[2],da[2],mo[2],ye[2],we,rd;
- unsigned char se_rs[2],mi_rs[2],ho_rs[2],da_rs[2],mo_rs[2],ye_rs[2],we_rs,rd_rs;
- unsigned char setmode=0;
- u8 rd_ye;
- u8 rd_mo;
- u8 rd_da;
- u8 rd_mi;
- u8 rd_ho;
- u8 rd_se;
- u8 rd_we;
- u8 timemode;
- u8 settime;
- u8 rd_xx;
- u8 nyrsfm;
- u8 mop,dap,hop,mip,sep,wep;
- void time_dis();
- void Timer0Init(void);
- void key_init();
- void key_process();
- void KeyRead();
- void stopcnt();
- void key_process1();
- void settimedis();
- void main()
- { unsigned char i=4;
- Delay_n_50ms(10);
- //ds1302init(); 首次刷寫程序,建議啟用下;后續未做測試是否可直接使用;
- Timer0Init();
- Initial_12864();
- clear_12864();
- key_init();
-
- while(1)
- {
- if(setmode==0)
- {
- time_dis();
- mop=0;
- dap=0;
- hop=0;
- mip=0;
- wep=0;
- sep=0;
- }
- if(timer==1)
- {
- timer=0;
- key_process();
- }
- if(setmode==1)
- {
- settimedis();
- }
-
-
- }
- }
- void KeyRead() //牛逼的按鍵程序。
- { // RD Trg Cont
- unsigned char ReadData = P3^0xff; //無按鍵式時/松開時 0 0 0
- Trg = ReadData & (ReadData ^ Cont); //按下一次時 1 1 1
- Cont = ReadData; //不松、下次周期檢測仍未松時 1 0 1
- } //總結,Trg、Cont全局變量; Trg用來判單單次按下;Cont通過計次實現長時間按鍵按下檢測;
- void key_init()
- {
- key1=1;
- key2=1;
- }
- void key_process()
- {
- u8 i;
- KeyRead();
- if(setmode==0)//mode0,待機模式下的按鍵處理程序;
- {
- write1302(Set_protect,0x80);
- if (Cont & KEYSET1) //k1長按2s以上,進入時間設置模式;
- {
- cnt_plus++; // 計時
-
- if (cnt_plus > 50) // 20ms*100 = 2S 如果時間到,頻率or哪里有點問題,實際時間為設置時間的2倍;
- {
- cnt_plus=0;
- stopcnt();
- setmode=1;
- settime++; //區分設置時、分、秒、年...
- }
- }
- if(Cont==0)
- {
- cnt_plus=0;
- }
-
- }
- if(setmode==1)
- {
- if(settime==1)
- {
- rd_xx=rd_ye;
- nyrsfm=159;
- }
- if(settime==2)
- {
- rd_xx=rd_mo;
- nyrsfm=18;
- }
- if(settime==3)
- {
- rd_xx=rd_da;
- nyrsfm=49;
- }
- if(settime==4)
- {
- rd_xx=rd_we;
- nyrsfm=6;
- }
- if(settime==5)
- {
- rd_xx=rd_ho;
- nyrsfm=35;
- }
- if(settime==6)
- {
- rd_xx=rd_mi;
- nyrsfm=95;
- }
- if(settime==7)
- {
- rd_xx=rd_se;
- nyrsfm=95;
- }
- write1302(Set_protect,0);
- if(Trg & KEYSET1) //k1短按;
- {
- settime++;
- if(settime==8)
- {
- settime=0;
- }
- }
- if(Trg & KEYSET2) //k2短按;
- {
- rd_xx++;
- if((rd_xx&0x0f)>9)
- rd_xx+=6;
- if(rd_xx>nyrsfm)
- rd_xx=0x00;
- }
- if(Cont==0)
- {
- cnt_plus=0;
- }
- if(Cont & KEYSET2) //k2長按;
- {
-
- cnt_plus++;
- if (cnt_plus > 12) //
- {
- rd_xx++;
- if((rd_xx&0x0f)>9)
- rd_xx+=6;
- if(rd_xx>nyrsfm)
- rd_xx=0x00;
- }
- if(Cont==0)
- i=0;
- }
-
- }
- }
- void settimedis()
- {
- if(settime==1)
- {
- rd_ye=rd_xx;
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(0,24,6); //年
- hanzi(13,36,6); //:
- dxzm(((rd_ye)>>4)+48,48,6);
- dxzm((((rd_ye)&0x0f)+48),56,6);
- }
- if(settime==2)
- {
- if(mop==0)
- {
- mop=1;
- write1302(Set_year,rd_ye);
- rd_xx=rd_mo;
- }
- rd_mo=rd_xx;
- dxzm(((rd_mo)>>4)+48,48,6);
- dxzm((((rd_mo)&0x0f)+48),56,6);
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(1,24,6); //月
- hanzi(13,36,6); //:
- }
- if(settime==3)
- {
- if(dap==0)
- {
- dap=1;
- write1302(Set_month,rd_mo);
- rd_xx=rd_da;
-
- }
- rd_da=rd_xx;
- dxzm(((rd_da)>>4)+48,48,6);
- dxzm((((rd_da)&0x0f)+48),56,6);
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(2,24,6); //日
- hanzi(13,36,6); //:
-
- }
- if(settime==4)
- {
- if(wep==0)
- {
- wep=1;
- write1302(Set_day,rd_da);
- rd_xx=rd_we;
- }
- rd_we=rd_xx;
- dxzm((rd_we+48),60,6);
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(3,24,6); //星期
- hanzi(4,36,6); //星期
- hanzi(13,48,6); //:
- }
- if(settime==5)
- {
- if(hop==0)
- {
- hop=1;
- write1302(Set_week,rd_we);
- rd_xx=rd_ho;
- }
- rd_ho=rd_xx;
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(29,24,6); //時
- hanzi(31,36,6); //24
- hanzi(32,48,6); //制
- hanzi(33,60,6); //式
- hanzi(13,72,6); //:
- dxzm(((rd_ho)>>4)+48,84,6);
- dxzm((((rd_ho)&0x0f)+48),92,6);
- }
- if(settime==6)
- {
- if(mip==0)
- {
- mip=1;
- write1302(Set_hour,rd_ho);
- rd_xx=rd_mi;
- }
- rd_mi=rd_xx;
-
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(30,24,6); //分
- hanzi(13,36,6); //:
- dxzm(((rd_mi)>>4)+48,48,6);
- dxzm((((rd_mi)&0x0f)+48),56,6);
- writekong(64,64,6);
- }
- if(settime==7)
- {
- if(sep==0)
- {
- sep=1;
- write1302(Set_minute,rd_mi);
- rd_xx=rd_se&0x7f;
- }
- rd_se=rd_xx;
- time_dis();
- hanzi(27,00,6); //設
- hanzi(28,12,6); //置
- hanzi(25,24,6); //秒
- hanzi(13,36,6); //:
- dxzm(((rd_se)>>4)+48,48,6);
- dxzm((((rd_se)&0x0f)+48),56,6);
- }
- if(settime==0)
- {
- setmode=0;
- writekong(0,127,6);
- write1302(Set_second,rd_se); //寫秒并開始計數;
- }
- }
- void stopcnt()
- {
- rd_se=read1302(Read_second);
- write1302(Set_protect,0);
- write1302(Set_second,0x80|rd_se); //寫停止計數;
- rd_ye=read1302(Read_year); //保存當前時間計數;
- rd_mo=read1302(Read_month);
- rd_da=read1302(Read_day);
- rd_ho=read1302(Read_hour);
- rd_mi=read1302(Read_minute);
- rd_we=read1302(Read_week);
- //write1302(Set_protect,0xff);
- }
- void time_dis()
- {
- rd=read1302(Read_second);
- se[1]=(rd>>4)&0x07;
- se[0]=rd&0x0f;
- rd=read1302(Read_minute);
- mi[1]=rd>>4;
- mi[0]=rd&0x0f;
- rd=read1302(Read_hour);
- ho[1]=rd>>4;
- ho[0]=rd&0x0f;
- rd=read1302(Read_day);
- da[1]=rd>>4;
- da[0]=rd&0x0f;
- rd=read1302(Read_month);
- mo[1]=rd>>4;
- mo[0]=rd&0x0f;
- rd=read1302(Read_year);
- ye[1]=rd>>4;
- ye[0]=rd&0x0f;
- we=read1302(Read_week);
- //日期
- dxzm('2',23,0);
- dxzm('0',31,0);
- dxzm(ye[1]+48,39,0);
- dxzm(ye[0]+48,48,0);
- dxzm(45,56,0);
- dxzm(mo[1]+48,64,0);
- dxzm(mo[0]+48,72,0);
- dxzm(45,80,0);
- dxzm(da[1]+48,88,0);
- dxzm(da[0]+48,96,0);
- //時間
- dxzm(ho[1]+48,26,2);
- dxzm(ho[0]+48,35,2);
- dxzm(58,44,2);
- dxzm(mi[1]+48,53,2);
- dxzm(mi[0]+48,62,2);
- dxzm(58,71,2);
- dxzm(se[1]+48,80,2);
- dxzm(se[0]+48,89,2);
- //星期
- rd=read1302(Read_week);
- hanzi(3,45,4);
- hanzi(4,57,4);
- switch (rd)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
12864&ds130202.zip
(89.67 KB, 下載次數: 437)
2018-5-21 10:00 上傳
點擊文件名下載附件
keil工程源碼 下載積分: 黑幣 -5
|