當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]將按鍵次數(shù)寫入AT24C08,再讀出并用1602LCD顯示

 //將按鍵次數(shù)寫入AT24C08,再讀出并用1602LCD顯示

#include //包含單片機(jī)寄存器的頭文件

#include //包含_nop_()函數(shù)定義的頭文件

sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳

sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳

sbit E=P2^2; //使能信號(hào)位,將E位定義為P2.2引腳

sbit BF=P0^7; //忙碌標(biāo)志位,,將BF位定義為P0.7引腳

sbit K5=P1^4; //將S位定義為P1.4引腳

#define OP_READ 0xa1 // 器件地址以及讀取操作,0xa1即為1010 0001B

#define OP_WRITE 0xa0 // 器件地址以及寫入操作,0xa1即為1010 0000B

sbit SDA=P3^5; //將串行數(shù)據(jù)總線SDA位定義在為P3.5引腳

sbit SCL=P3^4; //將串行時(shí)鐘總線SDA位定義在為P3.4引腳

unsigned char code digit[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字

unsigned char code string[ ]={"24C08 RW-TEST"}; //定義字符數(shù)組顯示提示信息

/*****************************************************

函數(shù)功能:延時(shí)1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以認(rèn)為是1毫秒

***************************************************/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函數(shù)功能:延時(shí)若干毫秒

入口參數(shù):n

***************************************************/

void delaynms(unsigned char n)

{

unsigned char i;

for(i=0;i delay1ms();

}

/*******************************************************************************

以下是對(duì)液晶模塊的操作程序

********************************************************************************/

/*****************************************************

函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根據(jù)規(guī)定,RS為低電平,RW為高電平時(shí),可以讀狀態(tài)

RW=1;

E=1; //E=1,才允許讀寫

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

result=BF; //將忙碌標(biāo)志電平賦給result

E=0; //將E恢復(fù)低電平

return result;

}

/*****************************************************

函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊

入口參數(shù):dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根據(jù)規(guī)定,RS和R/W同時(shí)為低電平時(shí),可以寫入指令

RW=0;

E=0; //E置低電平(根據(jù)表8-6,寫指令時(shí),E為高脈沖,

// 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"

_nop_();

_nop_(); //空操作兩個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

P0=dictate; //將數(shù)據(jù)送入P0口,即寫入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

E=1; //E置高電平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

E=0; //當(dāng)E由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令

}

/*****************************************************

函數(shù)功能:指定字符顯示的實(shí)際地址

入口參數(shù):x

***************************************************/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"

}

/*****************************************************

函數(shù)功能:將數(shù)據(jù)(字符的標(biāo)準(zhǔn)ASCII碼)寫入液晶模塊

入口參數(shù):y(為字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS為高電平,RW為低電平時(shí),可以寫入數(shù)據(jù)

RW=0;

E=0; //E置低電平(根據(jù)表8-6,寫指令時(shí),E為高脈沖,

// 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"

P0=y; //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

E=1; //E置高電平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間

E=0; //當(dāng)E由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令

}

/*****************************************************

函數(shù)功能:對(duì)LCD的顯示模式進(jìn)行初始化設(shè)置

***************************************************/

void LcdInitiate(void)

{

delaynms(15); //延時(shí)15ms,首次寫指令時(shí)應(yīng)給LCD一段較長的反應(yīng)時(shí)間

WriteInstruction(0x38); //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口

delaynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間

WriteInstruction(0x38);

delaynms(5);

WriteInstruction(0x38); //連續(xù)三次,確保初始化成功

delaynms(5);

WriteInstruction(0x0c); //顯示模式設(shè)置:顯示開,無光標(biāo),光標(biāo)不閃爍

delaynms(5);

WriteInstruction(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移

delaynms(5);

WriteInstruction(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除

delaynms(5);

}

/***************************************************

函數(shù)功能:顯示小時(shí)

***************************************************/

void Display(unsigned char x)

{

unsigned char i,j;

i=x/10; //取整運(yùn)算,求得十位數(shù)字

j=x%10; //取余運(yùn)算,求得各位數(shù)字

WriteAddress(0x47); //寫顯示地址,將十位數(shù)字顯示在第2行第7列

WriteData(digit[i]); //將十位數(shù)字的字符常量寫入LCD

WriteData(digit[j]); //將個(gè)位數(shù)字的字符常量寫入LCD

}

/*******************************************************************************

以下是對(duì)AT24C02的讀寫操作程序

********************************************************************************/

/***************************************************

函數(shù)功能:開始數(shù)據(jù)傳送

***************************************************/

void start()

// 開始位

{

SDA = 1; //SDA初始化為高電平“1”

SCL = 1; //開始數(shù)據(jù)傳送時(shí),要求SCL為高電平“1”

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SDA = 0; //SDA的下降沿被認(rèn)為是開始信號(hào)

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SCL = 0; //SCL為低電平時(shí),SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)

}

/***************************************************

函數(shù)功能:結(jié)束數(shù)據(jù)傳送

***************************************************/

void stop()

// 停止位

{

SDA = 0; //SDA初始化為低電平“0”

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SCL = 1; //結(jié)束數(shù)據(jù)傳送時(shí),要求SCL為高電平“1”

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SDA = 1; //SDA的上升沿被認(rèn)為是結(jié)束信號(hào)

}

/***************************************************

函數(shù)功能:從AT24Cxx讀取數(shù)據(jù)

出口參數(shù):x

***************************************************/

unsigned char ReadData()

// 從AT24Cxx移入數(shù)據(jù)到MCU

{

unsigned char i;

unsigned char x; //儲(chǔ)存從AT24Cxx中讀出的數(shù)據(jù)

for(i = 0; i < 8; i++)

{

SCL = 1; //SCL置為高電平

x<<=1; //將x中的各二進(jìn)位向左移一位

x|=(unsigned char)SDA; //將SDA上的數(shù)據(jù)通過按位“或“運(yùn)算存入x中

SCL = 0; //在SCL的下降沿讀出數(shù)據(jù)

}

return(x); //將讀取的數(shù)據(jù)返回

}

/***************************************************

函數(shù)功能:向AT24Cxx的當(dāng)前地址寫入數(shù)據(jù)

入口參數(shù):y (儲(chǔ)存待寫入的數(shù)據(jù))

***************************************************/

//在調(diào)用此數(shù)據(jù)寫入函數(shù)前需首先調(diào)用開始函數(shù)start(),所以SCL=0

bit WriteCurrent(unsigned char y)

{

unsigned char i;

bit ack_bit; //儲(chǔ)存應(yīng)答位

for(i = 0; i < 8; i++) // 循環(huán)移入8個(gè)位

{

SDA = (bit)(y&0x80); //通過按位“與”運(yùn)算將最高位數(shù)據(jù)送到S

//因?yàn)閭魉蜁r(shí)高位在前,低位在后

_nop_(); //等待一個(gè)機(jī)器周期

SCL = 1; //在SCL的上升沿將數(shù)據(jù)寫入AT24Cxx

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SCL = 0; //將SCL重新置為低電平,以在SCL線形成傳送數(shù)據(jù)所需的8個(gè)脈沖

y <<= 1; //將y中的各二進(jìn)位向左移一位

}

SDA = 1; // 發(fā)送設(shè)備(主機(jī))應(yīng)在時(shí)鐘脈沖的高電平期間(SCL=1)釋放SDA線,

//以讓SDA線轉(zhuǎn)由接收設(shè)備(AT24Cxx)控制

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

SCL = 1; //根據(jù)上述規(guī)定,SCL應(yīng)為高電平

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

_nop_(); //等待一個(gè)機(jī)器周期

ack_bit = SDA; //接受設(shè)備(AT24Cxx)向SDA送低電平,表示已經(jīng)接收到一個(gè)字節(jié)

//若送高電平,表示沒有接收到,傳送異常

SCL = 0; //SCL為低電平時(shí),SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)

return ack_bit; // 返回AT24Cxx應(yīng)答位

}

/***************************************************

函數(shù)功能:向AT24Cxx中的指定地址寫入數(shù)據(jù)

入口參數(shù):add (儲(chǔ)存指定的地址);dat(儲(chǔ)存待寫入的數(shù)據(jù))

***************************************************/

void WriteSet(unsigned char add, unsigned char dat)

// 在指定地址addr處寫入數(shù)據(jù)WriteCurrent

{

start(); //開始數(shù)據(jù)傳遞

WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對(duì)其寫入數(shù)據(jù)

WriteCurrent(add); //寫入指定地址

WriteCurrent(dat); //向當(dāng)前地址(上面指定的地址)寫入數(shù)據(jù)

stop(); //停止數(shù)據(jù)傳遞

delaynms(4); //1個(gè)字節(jié)的寫入周期為1ms, 最好延時(shí)1ms以上

}

/***************************************************

函數(shù)功能:從AT24Cxx中的當(dāng)前地址讀取數(shù)據(jù)

出口參數(shù):x (儲(chǔ)存讀出的數(shù)據(jù))

***************************************************/

unsigned char ReadCurrent()

{

unsigned char x;

start(); //開始數(shù)據(jù)傳遞

WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀其數(shù)據(jù)

x=ReadData(); //將讀取的數(shù)據(jù)存入x

stop(); //停止數(shù)據(jù)傳遞

return x; //返回讀取的數(shù)據(jù)

}

/***************************************************

函數(shù)功能:從AT24Cxx中的指定地址讀取數(shù)據(jù)

入口參數(shù):set_add

出口參數(shù):x

***************************************************/

unsigned char ReadSet(unsigned char set_add)

// 在指定地址讀取

{

start(); //開始數(shù)據(jù)傳遞

WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對(duì)其寫入數(shù)據(jù)

WriteCurrent(set_add); //寫入指定地址

return(ReadCurrent()); //從指定地址讀出數(shù)據(jù)并返回

}

/*********************************************************************

函數(shù)功能:主函數(shù)

***********************************************************************/

void main(void)

{

unsigned char sum; //儲(chǔ)存計(jì)數(shù)值

unsigned char x; //儲(chǔ)存從AT24C08讀出的值

unsigned char i;

LcdInitiate(); //調(diào)用LCD初始化函數(shù)

sum=0; //將計(jì)數(shù)值初始化為0

WriteAddress(0x01); //寫地址,從第1行第4列開始顯示

i=0; //從字符數(shù)組的第1個(gè)元素開始顯示

while(string[i]!='\0') //只要沒有顯示到字符串的結(jié)束標(biāo)志'\0',就繼續(xù)

{

WriteData(string[i]); //將第i個(gè)字符數(shù)組元素寫入LCD

i++; //指向下一個(gè)數(shù)組元素

}

while(1) //無限循環(huán)

{

if(K5==0) //如果該鍵被按下

{

delaynms(80); //軟件消抖,延時(shí)80ms

if(K5==0) //確實(shí)該鍵被按下

sum++; //計(jì)件值加1

while(!K5); //等待按鍵釋放

if(sum==99) //如果計(jì)滿99

sum=0; //清0,重新開始計(jì)數(shù)

}

WriteSet(0x10,sum); //將計(jì)件值寫入AT24C02中的指定地址"0x10"

x=ReadSet(0x10); //從AT24C02中讀出計(jì)件值

Display(x); //將計(jì)件值用1602LCD顯示

}

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(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)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

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