日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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

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

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

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

sbit RW=P2^1; //讀寫(xiě)選擇位,將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 // 器件地址以及寫(xiě)入操作,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,才允許讀寫(xiě)

_nop_(); //空操作

_nop_();

_nop_();

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

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

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

return result;

}

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

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

入口參數(shù):dictate

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

void WriteInstruction (unsigned char dictate)

{

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

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

RW=0;

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

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

_nop_();

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

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

_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í),液晶模塊開(kāi)始執(zhí)行命令

}

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

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

入口參數(shù):x

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

void WriteAddress(unsigned char x)

{

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

}

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

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

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

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

void WriteData(unsigned char y)

{

while(BusyTest()==1);

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

RW=0;

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

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

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

_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í),液晶模塊開(kāi)始執(zhí)行命令

}

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

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

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

void LcdInitiate(void)

{

delaynms(15); //延時(shí)15ms,首次寫(xiě)指令時(shí)應(yīng)給LCD一段較長(zhǎng)的反應(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è)置:顯示開(kāi),無(wú)光標(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); //寫(xiě)顯示地址,將十位數(shù)字顯示在第2行第7列

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

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

}

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

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

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

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

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

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

void start()

// 開(kāi)始位

{

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

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

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

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

SDA = 0; //SDA的下降沿被認(rèn)為是開(kāi)始信號(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ù)通過(guò)按位“或“運(yùn)算存入x中

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

}

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

}

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

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

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

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

//在調(diào)用此數(shù)據(jù)寫(xiě)入函數(shù)前需首先調(diào)用開(kāi)始函數(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); //通過(guò)按位“與”運(yùn)算將最高位數(shù)據(jù)送到S

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

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

SCL = 1; //在SCL的上升沿將數(shù)據(jù)寫(xiě)入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é)

//若送高電平,表示沒(méi)有接收到,傳送異常

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

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

}

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

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

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

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

void WriteSet(unsigned char add, unsigned char dat)

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

{

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

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

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

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

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

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

}

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

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

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

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

unsigned char ReadCurrent()

{

unsigned char x;

start(); //開(kāi)始數(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(); //開(kāi)始數(shù)據(jù)傳遞

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

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

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); //寫(xiě)地址,從第1行第4列開(kāi)始顯示

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

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

{

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

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

}

while(1) //無(wú)限循環(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,重新開(kāi)始計(jì)數(shù)

}

WriteSet(0x10,sum); //將計(jì)件值寫(xiě)入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)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉