資源簡介
此程序為12864液晶顯示ds1302實時時鐘,程序經本人修改后親測正確。硬件連接說明很清楚,適合新手學習。

代碼片段和文件信息
#define?TRUE?1
#define?FALSE?0
#include?“12864.h“ //包含12864液晶函數文件
/*
cpu晶振??????8Mhz
ds1302晶振???32.768khz
*/
/******************RTC常量******************/
#define?RTC_CLK??? PB0
#define?RTC_DATA?? PB1
#define?RTC_CS???? PB2
//命令
#define?RD ?? ????0x01
#define?WR ?? ????0x00
#define?C_SEC 0x80 //秒
#define?C_MIN 0x82 //分
#define?C_HR 0x84 //時
#define?C_DAY 0x86 //日
#define?C_MTH 0x88 //月
#define?C_WK 0x8A //星期?DATE
#define?C_YR 0x8C //年
#define?C_WP 0x8E //控制(寫保護)
#define?C_CHARGE 0x90 //涓流充電
#define?C_BURST 0xBE //時鐘多字節
//配置
#define?CLK_HALT 0x80 //停止時鐘控制位????SECOND bit7
#define?CLK_START 0x00 //啟動時鐘
#define?M12_24 0x80 //12/24小時值選擇位?HOUR bit7?
#define?PROTECT 0x80 //寫保護控制位??????CONTROL bit7?
#define?UPROTECT 0x00 //寫保護控制位??????CONTROL bit7?
//涓流充電控制常量
#define?TC_D1R2 0xA5 //high?1?Diode?+2K?Resistors??
#define?TC_D2R8 0xAB //low??2?Diodes+8K?Resistors??
#define?TC_DISABLED 0x00 //Disabled(TCS<>1010?or?DS=00?or?RS=00)
//RAM?命令
#define?C_RAMbase 0xC0 //RAM0~RAM30<<1?地址需左移一位?
void?Delayus(uint?US) ??
{
?uint?i;
?US=US*5/4; ?? ?//5/4是在8MHz晶振下,通過軟件仿真反復實驗得到的數值
?for(?i=0;i }
void?Delayms(uint?MS) ??
{
?uint?ij;
?for(?i=0;i ?for(j=0;j<1141;j++); //1141是在8MHz晶振下,通過軟件仿真反復實驗得到的數值
}
/*******************************************
函數名稱:?DS1302_init
功????能:?初始化DS1302的數據接口
參????數:?無
返回值??:?無
/********************************************/
void?DS1302_portinit(void) ??
{
?DDRB|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);//將時鐘端(RTC_CLK)數據端(RTC_DATA)片選端(RTC_CS)設置為輸出
}
/*******************************************
函數名稱:?DS1302_writeB
功????能:?向DS1302寫入一個字節數據(沒有RST操作)
參????數:?byte--要寫入的數據
返回值??:?無
/********************************************/
void?DS1302_writeB(uchar?byte)
{
?uchar?i;
?for(i=0;i<8;i++) ? ??//8位數據計數
?{
??PORTB&=~BIT(RTC_CLK); ??//拉低時鐘端
??if(byte&0x01) ??//當前位是否是1
??{
???PORTB|=BIT(RTC_DATA); ??//當前位是1,拉高數據端
??}
??else ??
??{
???PORTB&=~BIT(RTC_DATA); ??//當前位是0,拉低數據端
??}??
??Delayus(10); ??//調整時鐘和脈沖寬度
??PORTB|=BIT(RTC_CLK); ??//時鐘上升沿(DS1302采樣數據)
??byte>>=1; ??//數據右移1位,為送出新數據位做準備
?}
}
/*******************************************
函數名稱:?DS1302_readB
功????能:?從DS1302讀出一個字節數據(沒有RST操作)
參????數:?無
返回值??:?byte--讀出的數據
/********************************************/
uchar?DS1302_readB(void)
{
?uchar?ibyte=0;
?DDRB&=~BIT(RTC_DATA); ?//將數據端口設置為輸入 ??
?PORTB&=~BIT(RTC_DATA); ?//無上拉電阻
?for(i=0;i<8;i++) ?//8位數據計數
?{
??byte>>=1;?? ?//保存讀入的數據位
??PORTB|=BIT(RTC_CLK); ?//時鐘上升沿
??Delayus(10); ?//延時,調整時鐘脈沖寬度
??PORTB&=~BIT(RTC_CLK); ?//時鐘下降沿,DS1302輸出數據位
??Delayus(10); ?//等待數據變化(MEGA16太快,必須等待DS1302的數據位輸出,否則不能正確讀出)
??if(PINB&BIT(RTC_DATA)) ?//當前位是否是高電平
??{
???byte|=BIT(PB7); ?//是高電平就將返回數據的當前位置1
??}
??else
??{
???byte&=~BIT(PB7); ?//是低電平就將返回數據的當前位置0
??}
?}
?DDRB|=BIT(RTC_DATA); ?//最后將數據端口設置為輸出
?return?byte; ?//返回讀出的數據
}
/*******************************************
函數名稱:?DS1
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2133??2011-04-13?11:11??12864.h
?????文件??????10258??2011-04-13?11:16??1302.c
-----------?---------??----------?-----??----
????????????????12391????????????????????2
- 上一篇:TXTkiller文本分割工具TXT殺手
- 下一篇:YUVpla
yer1.3
評論
共有 條評論