欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
采用DS12CR887時鐘芯片驅動的51單片機數字時鐘,lcd1602顯示
[打印本頁]
作者:
51hei學習技術中
時間:
2017-3-16 02:53
標題:
采用DS12CR887時鐘芯片驅動的51單片機數字時鐘,lcd1602顯示
基于51單片機數字時鐘,網上一般都是用51單片機+ds1302做的精度沒有我這個好,這次是采用DS12CR887時鐘芯片,1602液晶顯示,經過本人測試成功.特發布在51黑電子論壇.
0.png
(64.25 KB, 下載次數: 80)
下載附件
2017-3-16 02:49 上傳
完整源碼下載:
51-clock.rar
(75.05 KB, 下載次數: 37)
2017-3-16 02:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
DS12CR887的驅動
程序:
/*
* RTC.c
*
* Created: 12/3
* Author: 詹磊
*/
#include"File_h\main.h"
#include"File_h\LCD1602.h"
#include"File_h\key.h"
#include"File_h\RTC.h"
//-------------------------------------------//
//函數名:寫DS12CR887數據函數
//入口:Addre:所寫數據的地址
// Data:需要寫入的數據
//出口:Void
//功能:寫DS12CR887內數據
//-------------------------------------------//
void WriteDS12CR887(unsigned char Addre,unsigned char Data)
{
DS12CR887_DS=1;
DS12CR887_RW=1;
DS12CR887_AS=1;
DS12CR887_DataPutIO=Addre;
DS12CR887_CS=0;
DS12CR887_AS=0;
DS12CR887_DataPutIO=Data;
DS12CR887_RW=0;
DS12CR887_RW=1;
DS12CR887_CS=1;
DS12CR887_AS=1;
}
//-------------------------------------------//
//函數名:讀DS12CR887數據函數
//入口:Addre:所讀數據的地址
//出口:unsigned char :所讀出的數據
//功能:讀DS12CR887內數據
//-------------------------------------------//
unsigned char ReadDS12CR887(unsigned char Addre)
{
unsigned char ds_date;
DS12CR887_RW=1;
DS12CR887_DS=1;
DS12CR887_AS=1;
DS12CR887_DataPutIO=Addre;
DS12CR887_CS=0;
DS12CR887_AS=0;
DS12CR887_DataPutIO=0xff;
DS12CR887_DS=0;
ds_date=DS12CR887_DataPutIO;
DS12CR887_DS=1;
DS12CR887_CS=1;
DS12CR887_AS=1;
return ds_date;
}
//-------------------------------------------//
//函數名:時鐘芯片始化
//入口:Void
//出口:Void
//功能:配置相關寄存器等
//-------------------------------------------//
void RTC_Init()
{
/*
WriteDS12CR887(0x00,0x57);
WriteDS12CR887(0x02,0x59);
WriteDS12CR887(0x04,0x23);
WriteDS12CR887(0x06,0x07);
WriteDS12CR887(0x07,0x30);
WriteDS12CR887(0x08,0x12);
WriteDS12CR887(0x09,0x01);
*/
///*
WriteDS12CR887(0x00,57);
WriteDS12CR887(0x02,59);
WriteDS12CR887(0x04,23);
WriteDS12CR887(0x06,07);
WriteDS12CR887(0x07,30);
WriteDS12CR887(0x08,12);
WriteDS12CR887(0x09,01);
//*/
WriteDS12CR887(0x0A,0x20);
WriteDS12CR887(0x0B,0x06);
}
//-------------------------------------------//
//函數名:讀時鐘數據函數
//入口:*tp:所讀時間數據的結構體指針
// *dp:所讀日期數據的結構體指針
//出口:Void
//功能:讀時鐘數據
//-------------------------------------------//
void GetRTC_Data(TimeData *tp,DateData *dp)
{
tp->second=ReadDS12CR887(0x00);
tp->minute=ReadDS12CR887(0x02);
tp->hour=ReadDS12CR887(0x04);
dp->day=ReadDS12CR887(0x06);
dp->date=ReadDS12CR887(0x07);
dp->month=ReadDS12CR887(0x08);
dp->year=ReadDS12CR887(0x09);
}
//-------------------------------------------//
//函數名:調時間數據函數
//入口:*tp:所寫時間數據的結構體指針
//出口:Void
//功能:調時間數據
//-------------------------------------------//
void WriteRTC_TimeData(TimeData *tp)
{
WriteDS12CR887(0x00,tp->second);
WriteDS12CR887(0x02,tp->minute);
WriteDS12CR887(0x04,tp->hour);
}
//-------------------------------------------//
//函數名:調日期數據函數
//入口:*dp:所寫日期數據的結構體指針
//出口:Void
//功能:調日期數據
//-------------------------------------------//
void WriteRTC_DateData(DateData *dp)
{
WriteDS12CR887(0x06,dp->day);
WriteDS12CR887(0x07,dp->date);
WriteDS12CR887(0x08,dp->month);
WriteDS12CR887(0x09,dp->year);
}
//-------------------------------------------//
//函數名:調鬧鐘數據函數
//入口:*atp:所寫鬧鐘數據的結構體指針
//出口:Void
//功能:調鬧鐘數據
//-------------------------------------------//
void WriteRTC_AlarmData(TimeData *atp)
{
WriteDS12CR887(0x01,atp->second);
WriteDS12CR887(0x03,atp->minute);
WriteDS12CR887(0x05,atp->hour);
}
復制代碼
按鍵驅動程序:
/*
* key.c
*
* Created: 12/3
* Author: 詹磊
*/
#include"File_h\main.h"
#include"File_h\LCD1602.h"
#include"File_h\key.h"
#include"File_h\RTC.h"
//-------------------------------------------//
bit KEY_flag=0;
bit LongKEY_flag=0,LongKEY_START=1;
unsigned char KeyBuffer[KeyBufferSize]={0,0,0,0}; //鍵盤緩存區數組
unsigned char KeyIndexW=0; //鍵盤緩存隊列寫入指針
unsigned char KeyIndexR=0; //鍵盤緩存隊列讀取指針
unsigned char KeyCount=0; //鍵盤緩存隊列內記錄的按鍵次數
//-------------------------------------------//
//函數名:按鍵始化
//入口:Void
//出口:Void
//功能:配置按鍵IO口模式等
//-------------------------------------------//
void InitKey()
{
KEYControl|=KEYFullValue;
}
//-------------------------------------------//
//函數名:按鍵壓棧函數
//入口:Key:需要壓入按鍵緩存的鍵值
//出口:Void
//功能:將一次鍵值壓入按鍵緩存中
//-------------------------------------------//
void KeyInBuffer(unsigned char Key)
{
bit tempEA;
if(KeyCount>=KeyBufferSize) //緩存已滿,放棄本次按鍵
return;
tempEA=EA;
EA=0; //涉及共享數據,關中斷
KeyCount++;
KeyBuffer[KeyIndexW]=Key;
if(++KeyIndexW>=KeyBufferSize) //如果隊列頭指針越界,循環隊列
KeyIndexW=0;
EA=tempEA; //開中斷
}
//-------------------------------------------//
//函數名:按鍵出棧函數
//入口:Void
//出口:unsigned char 返回鍵值
//功能:從鍵盤緩存中讀取一次鍵值,調用一次會把按鍵緩存中所調用的那個按鍵的鍵值刪除
//-------------------------------------------//
unsigned char GetKey()
{
uchar Key;
bit tempEA;
if(KeyCount==0)
return 0;
tempEA=EA;
EA=0; //涉及共享數據,關中斷
KeyCount--;
Key=KeyBuffer[KeyIndexR];
if(++KeyIndexR>=KeyBufferSize) //如果隊列頭指針越界,循環隊列
KeyIndexR=0;
EA=tempEA; //開中斷
return Key;
}
//-------------------------------------------//
//函數名:按鍵掃描函數
//入口:Void
//出口:Void
//功能:掃描IO口按鍵輸入情況,如果有按鍵事件,那么就保存鍵值到按鍵堆棧區中
//-------------------------------------------//
void CheckKey()
{
static unsigned char KeyTemp,KeyStateTime;
unsigned int temp;
unsigned char timeTemp;
if((TestKey!=KEYFullValue)&&(KEY_flag!=1)) //查詢是否有按鍵按下
{
for(temp=KeyDelayTime;temp>0;temp--) //延時消抖
if(TestKey==KEYFullValue)
return;
if(TestKey!=KEYFullValue) //消抖后檢測按鍵是否還按下;如果是,
//則說明是有效按鍵;如果不是,
//則認為抖動
{
LongKEY_START=1; //長按開始標志
KEY_flag=1; //標志有按鍵按下
KeyTemp=KEYControl&KEYFullValue; //記錄鍵值
}
}
if((TestKey==KEYFullValue)&&(KEY_flag==1)&&(LongKEY_flag==0)) //松手且之前有按鍵按下去過,但未響應過長按鍵
{
KEY_flag=0;
switch(KeyTemp) //鍵值壓棧
{
case KEY1:KeyInBuffer(1);
break;
case KEY2:KeyInBuffer(2);
break;
case KEY3:KeyInBuffer(3);
break;
case KEY4:KeyInBuffer(4);
break;
case KEY5:KeyInBuffer(5);
break;
case KEY6:KeyInBuffer(6);
break;
/*case KEY7:
break;
case KEY8:
break;*/
default:
break;
}
}
else if((TestKey!=KEYFullValue)&&(KEY_flag==1)) //如果消抖完成且一直按鍵按著
{
KeyStateTime++; //那么按鍵狀態時間自++
if(LongKEY_START)
timeTemp=LongKeyActionTime;
else
timeTemp=KeyStateTimeFull;
if(KeyStateTime>timeTemp) //檢測按鍵狀態時間是否達到所需時間
{
LongKEY_flag=1; //長按鍵標志置位,表示響應長按鍵
KeyStateTime=0; //清除按鍵狀態時間,為下次做準備
LongKEY_START=0;
switch(KeyTemp) //鍵值壓棧
{
case KEY1:KeyInBuffer(0x81);
break;
case KEY2:KeyInBuffer(0x82);
break;
case KEY3:KeyInBuffer(0x83);
break;
case KEY4:KeyInBuffer(0x84);
break;
case KEY5:KeyInBuffer(0x85);
break;
case KEY6:KeyInBuffer(0x86);
break;
/*case KEY7:
break;
case KEY8:
break;*/
default:
break;
}
}
}
if((LongKEY_flag==1)&&(TestKey==KEYFullValue)) //如果響應過長按鍵,且按鍵現在松開了
{
KEY_flag=0;
KeyStateTime=0;
LongKEY_flag=0;
}
}
復制代碼
作者:
dzbj
時間:
2017-3-16 09:34
已經下載收藏 慢慢學習 感謝分享
作者:
lxa0
時間:
2017-3-16 19:06
沒有硬件接線圖嗎?
作者:
maya593
時間:
2017-7-12 12:39
努力賺黑比啊!
作者:
aiii66
時間:
2019-3-1 16:27
下載學習中
作者:
sunnywu503
時間:
2019-3-1 19:38
可惜沒有硬件接線圖,試著從源碼查看,只能逐一實驗單片機腳看看能否接的對
。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1