久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
DS1302時(shí)鐘程序
[打印本頁(yè)]
作者:
xiaos
時(shí)間:
2015-4-3 01:28
標(biāo)題:
DS1302時(shí)鐘程序
ds1302.h頭文件:
http://m.zg4o1577.cn/bbs/dpj-32396-1.html
//關(guān)閉DS1302充電二級(jí)管,不能對(duì)后備電池進(jìn)行充電,防止發(fā)脹
//如果同時(shí)按下UP和DOWN鍵則初始化1302,該語(yǔ)句在while(1)前,只執(zhí)行一次,需要復(fù)位,防止誤操作
#include <REGX51.H>
#include "ds1302.h" //包含DS1302頭文件
#define leddata P0 //定義LED數(shù)據(jù)口
#define sec 0x80 //1302秒寄存器地址
#define min 0x82 //1302分寄存器地址
#define hou 0x84 //1302時(shí)寄存器地址
#define read 0x01 //讀操作,因?yàn)樽x的時(shí)候地址要加1,使最低位為1
sbit MODE=P3^4; //按鍵定義,下同
sbit SET=P3^5;
sbit UP=P3^6;
sbit DOWN=P3^7;
sbit led0=P2^0; //LED位選,因?yàn)椴季不是按順序布的,程序定義一下就可以了,下同
sbit led1=P2^3;
sbit led2=P2^7;
sbit led3=P2^4;
sbit led4=P2^6;
sbit led5=P2^5;
//**************函數(shù)聲明*****************
void delays(unsigned char);
void display(void);
void Scan_Key(void);
void id_case1_key();
void Set_id(unsigned char ,unsigned char);
//*************變量定義******************
unsigned char id=0,timecount,re_disp=0; //定義用到的變量,id為調(diào)整模式用,不為0時(shí)表示調(diào)整模式,調(diào)整哪個(gè)量由id值確定
//timecount用于500ms定時(shí)記數(shù),時(shí)間到取反flag標(biāo)志位,re_disp記數(shù)200次共10s,調(diào)整狀態(tài)下按鍵無(wú)操作10s自動(dòng)返回正常顯示狀態(tài)
bit hour,minute,second,flag; //定義位變量,hour,minute,second分別為調(diào)整時(shí)閃爍標(biāo)志位,flag 500ms取反一次,調(diào)整位閃爍及冒號(hào)閃爍用
unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60}; //LED碼表,根據(jù)硬件修改
unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04}; //初始化1302時(shí)用到的初始化數(shù)據(jù)
// 秒 分鐘 小時(shí) 日 月 年 星期
void t0(void) interrupt 1 using 0 //中斷處理程序,主要用于取反標(biāo)志位,返回正常顯示狀態(tài)
{
TH0=(65535-50000)/256; //50ms定時(shí)
TL0=(65535-50000)%256;
timecount++;re_disp++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
if(re_disp>200){re_disp=0;if(id)id=0;}
}
void delays(unsigned char k) //延時(shí)函數(shù)
{
unsigned char i,j;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
void display(void) //顯示函數(shù)
{
if(flag&hour) //如hour為1表示調(diào)整時(shí),flag為1時(shí)不顯示
{
led0=0;leddata=0xff;delays(10);led0=1; //這句中的0xff是數(shù)碼管的滅碼
led1=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led1=1; //&~((unsigned char)~flag<<6)該句根據(jù)flag的值決定來(lái)顯示小數(shù)點(diǎn),為1時(shí)顯示,4個(gè)小數(shù)點(diǎn)組成兩對(duì)冒號(hào),下同
}
else //flag為0時(shí)顯示,產(chǎn)生閃爍效果,下同
{
leddata=tab[Read1302(hou|read)/16];led0=0;delays(10);led0=1;
leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<6);led1=0;delays(10);led1=1;
}
if(flag&minute)
{
led2=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led2=1; //這句中的0xff是數(shù)碼管的滅碼
led3=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led3=1;
}
else
{
leddata=tab[Read1302(min|read)/16]&~((unsigned char)~flag<<6);led2=0;delays(10);led2=1;
leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<6);led3=0;delays(10);led3=1;
}
if(flag&second)
{
led4=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);led4=1;
led5=0;leddata=0xff;delays(10);led5=1;
}
else
{
leddata=tab[Read1302(sec|read)/16]&~((unsigned char)~flag<<6);led4=0;delays(10);led4=1;
leddata=tab[Read1302(sec|read)%16];led5=0;delays(10);led5=1;
}
}
void Scan_Key(void) //鍵盤(pán)檢測(cè)函數(shù)
{
display(); //程序開(kāi)頭調(diào)用顯示函數(shù)
if(!SET)
{
while(!SET)display(); //等待按鍵釋放,如一直按下一直調(diào)用顯示函數(shù),防止顯示中斷
re_disp=0; //清除記數(shù),重新開(kāi)始10s定時(shí)
id++;if(id>3)id=0; //id加1,后面根據(jù)id值對(duì)應(yīng)調(diào)整項(xiàng)目
}
if(id==0){hour=0;minute=0;second=0;} //根據(jù)id值跳到相應(yīng)處理函數(shù)
if(id==1){hour=1;id_case1_key();} //id為1,選擇調(diào)整小時(shí)位,閃爍標(biāo)志位置1,然后跳到鍵盤(pán)處理函數(shù),下同
if(id==2){hour=0;minute=1;id_case1_key();}
if(id==3){minute=0;second=1;id_case1_key();}
}
void id_case1_key(void) //鍵盤(pán)處理函數(shù),只有按下set鍵時(shí)才會(huì)進(jìn)入,
{
display();
if (!DOWN) //減少
{
while(!DOWN)display(); //等待按鍵釋放,如一直按下一直調(diào)用顯示函數(shù),防止顯示中斷
re_disp=0; //清除記數(shù),重新開(kāi)始10s定時(shí)
Set_id(id,0); //跳到加減判斷函數(shù),下同,
}
if (!UP) //增加
{
while(!UP)display();
re_disp=0;
Set_id(id,1);
}
}
//根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目并寫(xiě)入DS1302
void Set_id(unsigned char sel,unsigned char sel_1) //執(zhí)行調(diào)整項(xiàng)目的函數(shù)
{
signed char max,mini,address,item;
if(sel==1) {address=hou; max=23;mini=0;} //小時(shí) //根據(jù)id值確定要調(diào)整的項(xiàng),并確定調(diào)整上下限,下同
if(sel==2) {address=min; max=59;mini=0;} //分鐘
if(sel==3) {address=sec; max=0;mini=0;} //秒
item=Read1302(address|read)/16*10+Read1302(address|read)%16; //從相應(yīng)的地址讀取當(dāng)前數(shù)據(jù)并轉(zhuǎn)換為十進(jìn)制
if (sel_1==0) item--; else item++; //確定是對(duì)項(xiàng)目加還是減,并對(duì)越限處理
if(item>max) item=mini;
if(item<mini) item=max;
Write1302(0x8e,0x00);//允許寫(xiě)操作
Write1302(address,item/10*16+item%10); //將調(diào)整結(jié)果轉(zhuǎn)換成壓縮BCD碼重新寫(xiě)入1302
Write1302(0x8e,0x80);//寫(xiě)保護(hù),禁止寫(xiě)操作
}
void main() //主函數(shù)
{
TMOD=0x01; //初始化定時(shí)器
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
Write1302(0x90,0xa0);//關(guān)閉充電二級(jí)管,不能對(duì)后備電池進(jìn)行充電,防止發(fā)脹,原來(lái)的程序是打開(kāi)的請(qǐng)關(guān)閉
Write1302(0x8e,0x80);//寫(xiě)保護(hù),禁止寫(xiě)操作
if(!UP&!DOWN)Set1302(inittime); //如果同時(shí)按下UP和DOWN鍵則初始化1302,該語(yǔ)句在while(1)前,只執(zhí)行一次,需要復(fù)位,防止誤操作
while(1)
{
Scan_Key(); //主程序一直調(diào)用鍵盤(pán)檢測(cè)函數(shù)即可
}
}
復(fù)制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
美女毛片视频
|
欧美性生交xxxxx久久久
|
久久国产精品免费
|
欧美一区二区在线播放
|
国产毛片av
|
中文字幕在线观看免费
|
国内av在线
|
少妇高潮露脸国语对白
|
国产精品成人免费视频
|
日韩精品一区二区三区免费视频
|
亚洲在线观看视频
|
黄网免费看
|
www.日本黄色
|
国产精品久久久久久精
|
亚洲国产区
|
成人在线视频网
|
精品国产视频
|
性色av浪潮av
|
伊人久久av
|
久久国产小视频
|
免费观看一区二区
|
毛片精品
|
精品在线免费观看
|
一区二区三区免费看
|
18成人免费观看网站
|
在线观看视频一区二区
|
cao视频
|
国产美女永久免费无遮挡
|
日韩性生活视频
|
韩国av一区二区
|
一区二区三区成人
|
九色在线视频
|
日韩成人中文字幕
|
日韩欧美高清
|
天天操天天操天天
|
一级理论片
|
色综合久久天天综合网
|
日韩成人精品
|
蜜桃精品噜噜噜成人av
|
日本不卡视频
|
五月天婷婷丁香
|