|
MCU使用STC15W408AS,DS1302小模塊,ssd1306驅(qū)動(dòng)的12864;
兩個(gè)按鍵接在p3.0,p3.1用于時(shí)間設(shè)置;
實(shí)物圖片:
1.jpg (212.24 KB, 下載次數(shù): 87)
下載附件
2018-5-21 09:57 上傳
2.jpg (187.99 KB, 下載次數(shù): 81)
下載附件
2018-5-21 09:57 上傳
3.jpg (187.16 KB, 下載次數(shù): 72)
下載附件
2018-5-21 09:57 上傳
4.jpg (194.1 KB, 下載次數(shù): 85)
下載附件
2018-5-21 09:57 上傳
單片機(jī)源程序如下:
- /*
- 啟動(dòng)時(shí)間:2018年5月8日;
- 工作頻率:11.0592Mhz
- 作者:Oachw;
- 完成時(shí)間: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(); 首次刷寫程序,建議啟用下;后續(xù)未做測(cè)試是否可直接使用;
- 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; //無(wú)按鍵式時(shí)/松開時(shí) 0 0 0
- Trg = ReadData & (ReadData ^ Cont); //按下一次時(shí) 1 1 1
- Cont = ReadData; //不松、下次周期檢測(cè)仍未松時(shí) 1 0 1
- } //總結(jié),Trg、Cont全局變量; Trg用來判單單次按下;Cont通過計(jì)次實(shí)現(xiàn)長(zhǎng)時(shí)間按鍵按下檢測(cè);
- void key_init()
- {
- key1=1;
- key2=1;
- }
- void key_process()
- {
- u8 i;
- KeyRead();
- if(setmode==0)//mode0,待機(jī)模式下的按鍵處理程序;
- {
- write1302(Set_protect,0x80);
- if (Cont & KEYSET1) //k1長(zhǎng)按2s以上,進(jìn)入時(shí)間設(shè)置模式;
- {
- cnt_plus++; // 計(jì)時(shí)
-
- if (cnt_plus > 50) // 20ms*100 = 2S 如果時(shí)間到,頻率or哪里有點(diǎn)問題,實(shí)際時(shí)間為設(shè)置時(shí)間的2倍;
- {
- cnt_plus=0;
- stopcnt();
- setmode=1;
- settime++; //區(qū)分設(shè)置時(shí)、分、秒、年...
- }
- }
- 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長(zhǎng)按;
- {
-
- 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); //設(shè)
- 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); //設(shè)
- 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); //設(shè)
- 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); //設(shè)
- 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); //設(shè)
- hanzi(28,12,6); //置
- hanzi(29,24,6); //時(shí)
- 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); //設(shè)
- 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); //設(shè)
- 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); //寫秒并開始計(jì)數(shù);
- }
- }
- void stopcnt()
- {
- rd_se=read1302(Read_second);
- write1302(Set_protect,0);
- write1302(Set_second,0x80|rd_se); //寫停止計(jì)數(shù);
- rd_ye=read1302(Read_year); //保存當(dāng)前時(shí)間計(jì)數(shù);
- 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);
- //時(shí)間
- 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)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
12864&ds130202.zip
(89.67 KB, 下載次數(shù): 437)
2018-5-21 10:00 上傳
點(diǎn)擊文件名下載附件
keil工程源碼 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|