當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]//DS1302時鐘程序//液晶用的ST7920控制芯片的12864#include #include /********************************************************************/#define LCD12864_IOP0#defineCLERADISPLAYLCD12864_command(0x01);#d

//DS1302時鐘程序
//液晶用的ST7920控制芯片的12864
#include
#include
/********************************************************************/
#define LCD12864_IOP0
#defineCLERADISPLAYLCD12864_command(0x01);
#define uchar unsigned char
#define uint unsigned int
/********************************************************************/
sbit LCD12864_EN=P2^7; //E
sbit LCD12864_DIN=P2^5; // RS
sbit LCD12864_CLK=P2^6; //RW
sbit DS1302_CLK =P2^0;// P1^0;
sbit DS1302_IO =P2^1;// P1^1;
sbit DS1302_RST =P2^2;// P1^2;
unsigned char time[]={0x10,0x01,0x27,0x03,0x14,0x00,0x00};// 初始化時間年月日星期時分秒
uchar Display_Buffer[]="12-22-00";//時、分、秒 的格式
uchar riqi[]="11-03-28";//年、月、日 的格式
uchar xingqi[]="week-3";//星期
unsigned char second,minute,hour,week,day,month,year;
/********************************************************************/
void LCD12864_busy(void);
void LCD12864_command(unsigned char command);
void LCD12864_data(unsigned char dat);
void LCD12864_address(unsigned char row,unsigned char line);
void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s);
void LCD12864_picture(unsigned char *gImage);
void LCD12864_init(void);
void LCD12864_char (unsigned char row,unsigned char line,unsigned char a);
/********************************************************************/

//
void delayms(uint k)
{
uint data i,j;
for(i=0;i {
for(j=0;j<121;j++)
{;}
}
}
void delayus(uchar x)
{
while(--x);
}


void Mcu_init(void)
{

LCD12864_init();


CLERADISPLAY
CLERADISPLAY
LCD12864_init();
}



void Delay(void)
{
unsigned char i;
unsigned int j;
for(i=0;i<200;i++)
for(j=1000;j>0;j--);
}

/*****************************************************************************
函數(shù)功能:向DS1302送一字節(jié)數(shù)據(jù)子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
void InputByte(unsigned char BYTE)
{
char i;
for(i=8;i>0;i--)
{ //前面在read_ds1302()函數(shù)里已經(jīng)把CLK清0了
DS1302_CLK=0;//這里再清0一次,看著清楚。呵呵
DS1302_IO=(bit)(BYTE&0x01);//取出低位數(shù)據(jù)給數(shù)據(jù)引腳
DS1302_CLK=1;//置1,時鐘上升沿,引腳上的數(shù)據(jù)傳入1302寄存器中
BYTE>>=1;//因為這里移位的BYTE不是最后要的結(jié)果,雖然最后循環(huán)完會多移一位,但沒影響。
//循環(huán)最后一次后,時鐘狀態(tài)是高電平。
}
}


/*****************************************************************************
函數(shù)功能:讀DS1302一個字節(jié)子程序,讀數(shù)據(jù)是下降沿讀
入口參數(shù):
出口參數(shù):
*****************************************************************************/
unsigned char OutputByte(void)
{
unsigned char i;
unsigned char ucdat=0;
for(i=8;i>0;i--)
{ //前面時鐘狀態(tài)是高電平。
ucdat>>=1; //移位注意,移位不能放在循環(huán)語句末,否則最后循環(huán)完會多移一位。得到結(jié)果就錯了。
DS1302_IO=1;//單片機端置高防止破壞1302傳來的數(shù)據(jù),開始接收1302端的高低數(shù)據(jù)對數(shù)據(jù)線的改變。
DS1302_CLK=0;//緊接著時鐘變低,下降沿數(shù)據(jù)輸出。
if(DS1302_IO)//數(shù)據(jù)已經(jīng)輸出,判斷是1還是0.
ucdat|=0x80;//如果引腳是高則此位保存1。低不保存,右移的時候自然補0了。
DS1302_CLK=1;//讀完一位數(shù)據(jù),再置高時鐘,準(zhǔn)備讀下一個。
_nop_();//延時一下。

}
//讀完數(shù)據(jù)還是把時鐘清0,下次好直接用。
DS1302_CLK=0;//讀完數(shù)據(jù)還是把時鐘清0,下次好直接用。
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
DS1302_RST=0;
return(ucdat);


}


/*****************************************************************************
函數(shù)功能:向DS1302某地址寫一字節(jié)數(shù)據(jù)子程序
入口參數(shù):addr,TDat
出口參數(shù):
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
_nop_();
InputByte(addr);//先寫地址
InputByte(TDat);//再寫數(shù)據(jù)
DS1302_IO=1;//單片機端置高防止破壞1302傳來的數(shù)據(jù),開始接收1302端的高低數(shù)據(jù)對數(shù)據(jù)線的改變。
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
}


/*****************************************************************************
函數(shù)功能:讀DS1302地址子程序
入口參數(shù):add
出口參數(shù):timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
InputByte(addr);//先寫入讀命令
timedata=OutputByte();//再讀出數(shù)據(jù)
DS1302_IO=1;//單片機端置高防止破壞1302傳來的數(shù)據(jù),開始接收1302端的高低數(shù)據(jù)對數(shù)據(jù)線的改變。
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
return(timedata);
}


/*****************************************************************************
函數(shù)功能:初始化DS1302子程序
入口參數(shù):time[](全局變量)
出口參數(shù):
*****************************************************************************/
void initial_ds1302()
{
DS1302_IO=1;//單片機端置高防止破壞1302傳來的數(shù)據(jù),開始接收1302端的高低數(shù)據(jù)對數(shù)據(jù)線的改變。
DS1302_RST=0;
DS1302_CLK=0;
write_ds1302(0x8e,0x00); //寫保護寄存器,在對時鐘或RAM寫前WP一定要為0
write_ds1302(0x8c,time[0]); //年
write_ds1302(0x88,time[1]); //月
write_ds1302(0x86,time[2]); //日
write_ds1302(0x8A,time[3]); //星期
write_ds1302(0x84,time[4]); //時
write_ds1302(0x82,time[5]); //分
write_ds1302(0x80,time[6]); //秒
write_ds1302(0x8e,0x80); //寫保護寄存器
}



/*****************************************************************************
函數(shù)功能:讀DS1302時間子程序
入口參數(shù):
出口參數(shù):全局變量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81); //秒寄存器
minute=read_ds1302(0x83); //讀分
hour=read_ds1302(0x85); //讀時
//week=read_ds1302(0x8B); //讀星期
//day=read_ds1302(0x87); //日
//month=read_ds1302(0x89); //月
//year=read_ds1302(0x8d); //年
}


void main(void)
{
Mcu_init();
DS1302_RST=0;
DS1302_IO=1;
delayms(1000);
DS1302_CLK=0;
delayms(1000);
initial_ds1302(); //初始化DS1302


Delay();Delay();
CLERADISPLAY
LCD12864_string(1,1,"日期");
LCD12864_string(2,1,"星期");
LCD12864_string(3,1,"時間");
while(1)
{


read_time();//讀取時間
Display_Buffer[0]=hour/16+'0';//存儲下時的高位進數(shù)組
Display_Buffer[1]=hour%16+'0';//存儲下時的低位進數(shù)組
Display_Buffer[3]=minute/16+'0';//注意+'0'后存儲的是ASCII。用于下面液晶顯示。
Display_Buffer[4]=minute%16+'0';//注意+'0'后存儲的是ASCII。用于下面液晶顯示。
Display_Buffer[6]=second/16+'0';
Display_Buffer[7]=second%16+'0';
// riqi[0]=year/16+'0';
// riqi[1]=year%16+'0';
// riqi[3]=month/16+'0';
// riqi[4]=month%16+'0';
// riqi[6]=day/16+'0';
// riqi[7]=day%16+'0';
// xingqi[1]=week%16+'0';


//LCD12864_string(1,3,riqi);//液晶的第1行從第3位開始顯示日期
//LCD12864_string(2,3,xingqi);//液晶的第2行從第3位開始顯示星期
LCD12864_string(3,3,Display_Buffer);//液晶的第3行從第3列開始顯示時間
}
}


/*******************************************************************/
void LCD12864_busy(void)
{
bit BF = 0;
LCD12864_EN=0;
LCD12864_DIN=0;
LCD12864_CLK=1;
LCD12864_IO=0xff;//單片機讀數(shù)據(jù)之前必須先置高位
do
{
LCD12864_EN=1;
BF=LCD12864_IO&0x80;
LCD12864_EN=0;
} while(BF);

}
/*******************************************************************/
// 寫入命令
/*******************************************************************/
void LCD12864_command(unsigned char command)
{
LCD12864_busy();
LCD12864_EN=0;
LCD12864_DIN=0;
LCD12864_CLK=0;
LCD12864_IO=0xff;
LCD12864_EN=1;
LCD12864_IO=command;
LCD12864_EN=0;
}
/*******************************************************************/
// 寫入一字節(jié)數(shù)據(jù)
/*******************************************************************/
void LCD12864_data(unsigned char dat)
{

LCD12864_busy();
LCD12864_EN=0;
LCD12864_DIN=1;
LCD12864_CLK=0;
LCD12864_IO=0xff;
LCD12864_EN=1;
LCD12864_IO=dat;
LCD12864_EN=0;
}



/*******************************************************************/
// 設(shè)置顯示位置 X(1~8),Y(1~4)
/*******************************************************************/
void LCD12864_address(unsigned char row,unsigned char line)
{
switch(row)
{
case 1:LCD12864_command(0x7f + line);
break;
case 2:LCD12864_command(0x8f + line);
break;
case 3:LCD12864_command(0x87 + line);
break;
case 4:LCD12864_command(0x97 + line);
default:
break;
}
}


/*****************顯示 一個 字符 **************/


void LCD12864_char (unsigned char row,unsigned char line,unsigned char a)
{

LCD12864_address(row,line);
LCD12864_data(a);
}


/*******************************************************************/
// 在指定位置顯示字符串
/*******************************************************************/
void LCD12864_string(unsigned char row,unsigned char line,unsigned char *s)
{
unsigned char LCD12864_temp;
LCD12864_address(row,line);
LCD12864_temp=*s;
while(LCD12864_temp != 0x00)
{
LCD12864_data(LCD12864_temp);
LCD12864_temp=*(++s);
}
}


/*******************************************************************/
// 繪制一幅圖片
/*******************************************************************/
void LCD12864_picture(unsigned char *gImage)
{
unsigned char X = 0x80,Y = 0x80;
unsigned char i,j;
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
LCD12864_command(0x34);
LCD12864_command(Y);
LCD12864_command(X);
LCD12864_data(*(gImage+i*16+j)); // low 8 bits
LCD12864_data(*(gImage+i*16+j+1)); // high 8 bits
LCD12864_command(0x36);
X++;
j++;
}
Y++;
if(Y>0x9f)
Y=0x80;
X=0x80+((i+1)/32)*8;
}
LCD12864_command(0x30);

}
/*******************************************************************/
// 初始化設(shè)置
/*******************************************************************/
void LCD12864_init(void)
{
CLERADISPLAY // clear DDRAM
LCD12864_command(0x30); // 8 bits unsigned interface,basic instrument
LCD12864_command(0x02); // cursor return
LCD12864_command(0x0c); // display,cursor on
LCD12864_command(0x03);
LCD12864_command(0x06);
CLERADISPLAY // clear DDRAM
}


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉