單片機與接口技術(shù)
課程設(shè)計(論文)
點陣LED顯示屏設(shè)計
院(系)名稱
電子與信息工程學(xué)院
摘要
隨著單片機技術(shù)的快速發(fā)展,現(xiàn)如今LED點陣廣告牌隨處可見,它的應(yīng)用領(lǐng)域極其廣泛。像證券交易實時信息的顯示,LED顯示屏需求量都是非常大的,而這些LED的基本單元都是8x8的點陣,它是組成漢字及其它圖形的基礎(chǔ),可通過單片機的控制實現(xiàn)顯示功能,因此具有廣泛應(yīng)用的意義。
設(shè)計的點陣LED顯示屏包括兩個部分電路。一是單片機控制部分電路,包括AT89C51單片機、時鐘電路、復(fù)位電路和按鍵控制電路等,通過Keil軟件編程實現(xiàn)控制LED顯示的功能;二是點陣LED顯示電路,由LED點陣、74HC595移位寄存器芯片和74159編碼器芯片構(gòu)成。以74HC595移位寄存器芯片為主要器件,設(shè)計的點陣LED顯示屏要求分辨率為64x16點,可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式。整體電路結(jié)構(gòu)緊湊、參數(shù)設(shè)置合理,具有斷電儲存,控制靈敏度高,電路穩(wěn)定性好,抗干擾能力強等優(yōu)點。
整體電路設(shè)計采用Proteus仿真軟件進行繪圖和測試。經(jīng)過仿真測試,LED顯示屏能夠靜止或滾動顯示4個漢字,分辨率達(dá)到64x16點,滿足可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式的設(shè)計要求。
目 錄
第1章 緒論
1.1 點陣LED顯示屏的應(yīng)用意義
1.2 本文研究內(nèi)容
第2章 方案設(shè)計與論證
2.1 核心控制電路設(shè)計與論證
2.2 點陣LED顯示模塊論證
2.3 系統(tǒng)設(shè)計要求
2.4 總體設(shè)計
第3章 單元電路設(shè)計
3.1 單片機最小系統(tǒng)
3.1.1 最小系統(tǒng)
3.1.2 時鐘電路
3.1.3 復(fù)位電路
3.2 按鍵控制模塊
3.3 斷電儲存模塊
3.4 驅(qū)動模塊
3.4.1 行驅(qū)動
3.4.2 列驅(qū)動
3.5 點陣LED模塊
第4章 系統(tǒng)軟件設(shè)計
4.1 主程序的設(shè)計
4.2 按鍵程序設(shè)計
4.3 編程C語言代碼
第5章 系統(tǒng)仿真與調(diào)試
第6章 總結(jié)
參考文獻
附錄I
附錄II
第1章 緒論1.1 點陣LED顯示屏的應(yīng)用意義隨著現(xiàn)代電子技術(shù)的快速發(fā)展,各類智能電子產(chǎn)品的功能日益強大,與人們?nèi)粘I畹穆?lián)系也日益緊密。電子產(chǎn)品向小型化,精密化的趨勢快速發(fā)展。在任何的電子系統(tǒng)中,顯示電路都是實現(xiàn)人機交互、信息顯示的重要組成部分,所以對點陣LED顯示技術(shù)的研究具有廣泛的意義。 目前應(yīng)用最廣的是紅色、綠色、黃色。LED顯示屏可以顯示變化的數(shù)字、文字、圖形圖像;不僅可以用于室內(nèi)環(huán)境還可以用于室外環(huán)境,具有投影儀、電視墻等無法比擬的優(yōu)點。LED點陣顯示屏以高亮度、工作電壓低、功耗小、小型化、壽命長和性能穩(wěn)定的優(yōu)點迅速的發(fā)展。在信息顯示領(lǐng)域得到廣泛的應(yīng)用,例如證券交易、金融信息的顯示、機場航班動態(tài)的顯示等服務(wù)領(lǐng)域的業(yè)務(wù)宣傳及信息顯示。未來的LED顯示屏?xí)蛑鴺?biāo)準(zhǔn)化、規(guī)范化,產(chǎn)品結(jié)構(gòu)多樣化的方向發(fā)展。 采用LED點陣屏與AT89C51單片機作為主要器件設(shè)計的64x16點陣LED顯示屏,通過不同的模塊相互聯(lián)系,其中每個模塊之間只需要極少的聯(lián)系,極大的提高了系統(tǒng)的穩(wěn)定性、可靠性。調(diào)試、維護的難度大大降低。顯示部分被分為不同的單元獨立進行掃描,每個單元之間的信號采用信號鎖存進行同步控制。整個點陣LED顯示屏具有反應(yīng)靈敏度高、抗干擾能力強、顯示精準(zhǔn)度高和電路穩(wěn)定性良好等優(yōu)點,完全滿足常規(guī)室內(nèi)環(huán)境下的使用需要。 1.2 本文研究內(nèi)容設(shè)計分辨率為64x16點的點陣LED顯示屏,能夠輸出四個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式,同時具有斷電儲存的功能。采用AT89C51單片機作為控制模塊的主要器件,設(shè)置獨立按鍵,可通過控制獨立按鍵使輸出狀態(tài)在滾動或靜止之間切換,LED顯示模塊由16塊8x8的單色點陣、74159芯片和8塊74HC595移位寄存器芯片組成,在默認(rèn)狀態(tài)下采用滾動方式顯示字符,可通過按鍵進行狀態(tài)轉(zhuǎn)換。顯示電路采用行掃描和列掃描的方法,各單元之間的信號進行同步控制。整個系統(tǒng)達(dá)到了輸出4個漢字或字母具有滾動、靜止顯示的設(shè)計要求且電路穩(wěn)定工作。
第2章 方案設(shè)計與論證2.1 核心控制電路設(shè)計與論證方案一:采用由51單片機實現(xiàn)控制功能,由74138譯碼器和74LS273地址鎖存器進行16塊8x8單色LED點陣的行掃描和列掃描。但是多片鎖存器的控制極為困難,而且51單片機的I/O資源有限。這種方法的單片機編程控制較為困難,在調(diào)試過程中有可能出現(xiàn)信號不同步、掃描出現(xiàn)延時錯誤等情況,電路結(jié)構(gòu)復(fù)雜,可靠性不高。 方案二:采用AT89C51單片機和獨立按鍵構(gòu)成控制電路,采用74159芯片對LED顯示屏進行行掃描,同時使用74HC595移位寄存器芯片進行顯示屏的列掃描。因為74HC595采用串行控制,大大節(jié)約了單片機的I/O口資源,同時降低了編程和調(diào)試的難度。這種方法控制較為方便,輸出穩(wěn)定性好,可靠性高。 與方案一相比,本系統(tǒng)選用方案二作為設(shè)計方案。獨立按鍵能有效控制輸出狀態(tài),使輸出能在靜止和滾動之間切換,單片機的I/O口資源能夠大大的節(jié)約,工作穩(wěn)定可靠,抗干擾能力高,實用性強。 2.2 點陣LED顯示模塊論證方案一:采用74LS273地址鎖存器與8x8點陣構(gòu)成列掃描,采用兩級74138譯碼器級聯(lián)構(gòu)成顯示屏的行掃描。為實現(xiàn)動態(tài)掃描單片機的控制較為復(fù)雜,編程難度較高。 方案二:選用74HC595移位寄存器構(gòu)成顯示屏的列掃描。I/O口資源得到大大節(jié)約,同時各級之間的信號能夠?qū)崿F(xiàn)同步控制。采用74159 4-16線譯碼-多路分配器作為行掃描。單片機的控制編程難度大大降低,可靠性大大提高,實用性更強。 綜上所述,選擇方案二做點陣LED顯示。 2.3 系統(tǒng)設(shè)計要求設(shè)計一個點陣LED顯示屏,其分辨率為64x16點,基于單片機控制能夠?qū)崿F(xiàn)顯示屏的輸出狀態(tài)的控制。整體電路包括單片機最小系統(tǒng),按鍵控制電路,點陣LED顯示電路,斷電儲存電路。其中單片機編程要求程序結(jié)構(gòu)簡單調(diào)試方便,可移植性強,可靠性高。按鍵控制電路要求控制靈敏度高、控制精準(zhǔn)度高。顯示電路要求達(dá)到分辨率為64x16點的輸出穩(wěn)定的要求。整體系統(tǒng)能夠滿足在一般室內(nèi)環(huán)境下的使用要求。 任務(wù)要求: 1、設(shè)計一個單片機控制的室內(nèi)用點陣LED顯示屏。 2、點陣LED顯示屏分辨率為64x16點,可顯示4個漢字或8個字母。 3、具有靜止顯示、滾動顯示等顯示方式。 2.4 總體設(shè)計本設(shè)計采用以AT89C51單片機控制方案。 利用單片機靈活的編程設(shè)計和豐富的I/O口資源,可通過按鍵復(fù)位單片機。通過獨立按鍵控制使輸出的狀態(tài)在滾動和靜止顯示之間切換,通過分辨率為64x16點的點陣LED顯示屏不僅能實現(xiàn)基本的輸出顯示4個漢字的控制功能,整體電路具有斷電儲存的功能,還能根據(jù)實際需要添加控制按鍵實現(xiàn)更多的功能。系統(tǒng)結(jié)構(gòu)框圖如圖2.1所示。 圖2.1 系統(tǒng)結(jié)構(gòu)框圖 第3章 單元電路設(shè)計3.1 單片機最小系統(tǒng)3.1.1 最小系統(tǒng)采用的AT89C51單片機利用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。它作為一種高性能的微處理器帶有4K字節(jié)閃爍可編程可擦除只讀存儲器。AT89C51由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,因此AT89C51是一種高效微控制器得到廣泛的應(yīng)用。由AT89C51單片機,時鐘電路和復(fù)位電路共同組成了單片機最小系統(tǒng),可以上電手動復(fù)位,同時集成4個I/O端口,資源豐富滿足一般控制系統(tǒng)設(shè)計的需求。單片機最小系統(tǒng)如圖3.1所示。 圖3.1 單片機最小系統(tǒng) 3.1.2 時鐘電路為了保證各部件的同步工作,單片機內(nèi)部電路應(yīng)在唯一的時鐘信號下嚴(yán)格地按照時序進行工作。MCS-51系列單片機內(nèi)部有一個高增益反相放大器,用于構(gòu)成振蕩器,但要形成時鐘脈沖,外部還需要附加電路。這里采用內(nèi)部時鐘方式,單片機的兩個引腳XTAL1和XTAL2兩端跨接晶體振蕩器。外接晶振選擇12MHz,電容C1和C2選擇30pF獨石電容,同時為了減小寄生電容,更好的保證振蕩器穩(wěn)定、可靠的工作,振蕩器和電容應(yīng)盡量安裝的靠近單片機的XTAL1和XTAL2引腳。時鐘電路圖如圖3.2所示。 圖3.2 時鐘電路圖 3.1.3 復(fù)位電路復(fù)位是單片機的初始化操作,單片機系統(tǒng)在上電啟動運行時,都需要先復(fù)位。其作用是使CPU和系統(tǒng)中其它部件都處于一個確定的初始狀態(tài),但是單片機本身是不能自動進行復(fù)位的,必須配合相應(yīng)的外部復(fù)位電路才能實現(xiàn)。 利用電容器的充電實現(xiàn),在單片機的RST端連續(xù)給出兩個機器周期的高電平就可以完成復(fù)位操作。選擇22μF的電解電容與電源Vcc和復(fù)位端相連,10K的電阻與復(fù)位端和地相連構(gòu)成復(fù)位電路,也可通過按鍵復(fù)位。復(fù)位電路圖如圖3.3所示。 圖3.3 復(fù)位電路圖 3.2 按鍵控制模塊獨立按鍵具有結(jié)構(gòu)簡單控制方便,但是在實際使用中必須去抖。按鍵在按下和松開的時候都存在抖動問題,不能將抖動誤認(rèn)為多次按鍵,通?梢圆捎密浖ザ兜姆椒,也可以采用硬件去抖的方法。這里選擇軟件去抖的方法。按鍵控制電路要求控制靈敏度高、控制精準(zhǔn)度高。選擇單片機P3.2端口和按鍵相連,在編程中可采用外部中斷0進行判斷控制,使輸出在滾動和靜止的狀態(tài)之間切換。按鍵電路圖如圖3.4所示。 圖3.4 按鍵電路圖 3.3 斷電儲存模塊采用AT24C512作為主要的斷電儲存模塊,它是ATMEL公司生產(chǎn)的64KB串行電可擦的可編程存儲器,內(nèi)部有512頁,每一頁為128字節(jié),任一單元的地址為16位,地址范圍為0000-0FFFH。采用8引腳封裝,具有結(jié)構(gòu)緊湊,存儲容量大等特點,可以在2線總線上并接4片芯片,特別適用于具有大容量數(shù)據(jù)存儲要求的數(shù)據(jù)采集系統(tǒng),因此完全滿足輸出數(shù)據(jù)的存儲且其存儲容量完全滿足要求。斷電存儲電路圖如圖3.5所示。 圖3.5 存儲電路圖 3.4 驅(qū)動模塊
3.4.1 行驅(qū)動采用74159 4-16線譯碼-多路分配器芯片進行行掃描。它抗噪聲能力強,功耗低且與低電壓TTL電路兼容。只要掃描頻率設(shè)置合適,點陣屏就可以看成是穩(wěn)定平滑過渡, 沒有閃爍的感覺,給人以正常的視覺效果。將芯片的使能端均接地讓其正常工作,通過單片機的P1口的低四位輸出0000B-1111B即十進制的0-15的數(shù)值,通過一次譯碼后74159的輸出端有唯一引腳輸出為低電平信號,其它引腳的輸出均為高電平信號。通過 軟件編程循環(huán)就可實現(xiàn)對LED顯示屏的行掃描。行驅(qū)動電路圖如圖3.6所示。 圖3.6 行驅(qū)動電路圖 3.4.2 列驅(qū)動采用74HC595移位寄存器作為列驅(qū)動的主要器件。74HC595是一款漏極開路輸出的CMOS移位寄存器,輸出端口為可控的三態(tài)輸出端,也能串行輸出控制下一級的級聯(lián)芯片,而且功耗低、高速移位時鐘頻率Fmax>25MHz,滿足設(shè)計的需要。 74HC595芯片的SDI為串行數(shù)據(jù)輸入端接單片機的P2.0端口;SH_CP為移位寄存器的時鐘輸入端,上升沿時移位寄存器的數(shù)據(jù)依次移動一位,下降沿保持寄存器的數(shù)據(jù)不變,接單片機的P2.1端口;ST_CP為存儲寄存器的時鐘輸入端,上升沿時移位寄存器中的數(shù)據(jù)進入存儲寄存器,下降沿保持存儲寄存器中數(shù)據(jù)不變。 應(yīng)用時通常ST_CP置為低電平,移位結(jié)束后再在ST_CP端產(chǎn)生一個正脈沖更新顯示數(shù)據(jù),接單片機的P2.2端口。用AT89C51的三個I/O分別控制SDI、SH_CP和ST_CP,將RST和OE分別接Vcc和地。各級之間通過上一級芯片的第9腳即SQH串行數(shù)據(jù)輸出管腳和下一級的SDI串行數(shù)據(jù)輸入引腳相連。可通過編程實現(xiàn)對字符數(shù)據(jù)表的移位輸出,同時各單元之間的信號能夠同步進行控制。列驅(qū)動電路圖如圖3.7所示。
圖3.7 列驅(qū)動電路 3.5 點陣LED模塊為了到達(dá)分辨率64x16點的設(shè)計要求,采用16塊8x8的LED單色點陣組成LED顯示屏。將顯示屏的列控制引腳分別對應(yīng)并聯(lián)至74HC595移位寄存器的輸出端。將上半屏和下半屏的行控制引腳對應(yīng)連接至74159 4-16線譯碼-多路分配器的輸出端。通過單片機控制行掃描和列掃描實現(xiàn)輸出4個漢字的功能。點陣LED電路如圖3.8所示。 圖3.8 點陣LED電路 第4章 系統(tǒng)軟件設(shè)計4.1 主程序的設(shè)計 單片機上電后自動復(fù)位,開始執(zhí)行程序初始化程序,進行行掃描和列掃描,默認(rèn)狀態(tài)是循環(huán)向左滾動顯示“愛我中華”4個漢字。若獨立按鍵則執(zhí)行狀態(tài)切換,此時LED屏靜止顯示“愛我中華”4個漢字。當(dāng)按鍵再次按下則再次切換為循環(huán)向左滾動的狀態(tài),否則一直保持顯示狀態(tài)。主程序流程如圖4.1所示。圖4.1 主程序流程圖 4.2 按鍵程序設(shè)計單片機通過檢測獨立按鍵的狀態(tài),若獨立按鍵被按下開始執(zhí)行去抖程序,如果按鍵有效則在向左滾動或者靜止顯示狀態(tài)之間切換,控制LED顯示屏輸出的狀態(tài),否則不會執(zhí)行切換程序保持原來的狀態(tài),一直維持在行掃描和列掃描的狀態(tài)。同時繼續(xù)檢測是否有按鍵按下,實時根據(jù)按鍵控制顯示屏的顯示模式。按鍵程序流程圖如圖4.2所示。 圖4.2 按鍵程序設(shè)計流程圖
第5章 系統(tǒng)仿真與調(diào)試 使用Proteus軟件繪制原理圖,然后將編程軟件Keil生成的hex程序文件載入到AT89C51單片機中,點擊仿真運行: 1、默認(rèn)LED顯示屏顯示4個漢字“愛我中華”,循環(huán)向左滾動顯示。左滾動顯示仿真結(jié)果如圖5.1所示。 圖5.1 左滾動顯示 2、當(dāng)獨立按鍵按下,若經(jīng)過去抖程序,判斷為有效則在向左滾動或靜止顯示兩種狀態(tài)之間進行轉(zhuǎn)換,控制LED顯示屏輸出顯示的模式。在默認(rèn)左滾動狀態(tài)下,按下按鍵,LED輸出靜止?fàn)顟B(tài)下的“愛我中華”4個漢字。靜止顯示仿真結(jié)果如圖5.2所示。 圖5.2 靜止顯示 綜合以上仿真結(jié)果分析:設(shè)計的點陣LED顯示滿足輸出4個漢字的功能,且可以進行靜止?fàn)顟B(tài)和滾動狀態(tài)之間的切換,滿足設(shè)計的要求。
第6章 總結(jié)本次課程設(shè)計的題目是點陣LED顯示屏設(shè)計。設(shè)計過程包括理解設(shè)計要求,查閱相關(guān)資料,到Proteus軟件設(shè)計和仿真。要求達(dá)到輸出4個漢字或8個字母,且具有靜止或滾動顯示等顯示模式的設(shè)計要求。 設(shè)計的點陣LED顯示屏包括單片機控制部分電路和LED顯示電路。其中單片機控制部分電路,包括AT89C51單片機、時鐘電路、復(fù)位電路和按鍵控制電路,可以通過軟件編程實現(xiàn)對整個系統(tǒng)的控制功能。由多塊LED 8x8點陣構(gòu)成LED顯示屏,通過行列控制引腳分別與74159 4-16線譯碼-多路分配器芯片和74HC595移位寄存器芯片進行相應(yīng)的連接。其中以74HC595芯片為主要器件,設(shè)計的點陣LED顯示屏要求分辨率為64x16點,可顯示4個漢字或8個字母,具有靜止顯示、滾動顯示等顯示方式,且滿足一般室內(nèi)環(huán)境下的使用需求。整個系統(tǒng)結(jié)構(gòu)緊湊、參數(shù)設(shè)置合理,具有控制靈敏度高,電路穩(wěn)定性好,抗干擾能力強等優(yōu)點。 但是設(shè)計點陣LED顯示屏需要結(jié)合實際綜合考慮很多因素,因此該點陣LED顯示屏設(shè)計需要在實際應(yīng)用中進一步改進和完善。另外,在單片機控制程序方面,該設(shè)計只實現(xiàn)了顯示4個漢字,具有靜止顯示或滾動顯示兩種顯示方式的控制。要想在現(xiàn)實生活中推廣,還必須針對實際應(yīng)用場合的需要,進一步完善LED顯示屏的其它功能。
整體電路原理圖
單片機源碼:
- #include <reg51.H>
- #include <intrins.h>
- #define I2Cdelay() {_nop_();_nop_();_nop_();_nop_();}
- #define uchar unsigned char
- #define uint unsigned int
- uchar flag=1,yid,h; //YID為移動計數(shù)器,H為行段計數(shù)器
- //flag=1 左移顯示 flag=0靜態(tài)顯示
- uint zimuo; //字模計數(shù)器
- uchar BUFF[10]; //緩存
- void in_data(void); //調(diào)整數(shù)據(jù)
- void rxd_data(void); //發(fā)送數(shù)據(jù)
- void Scan(void); //掃描
- void I2CStart(void);
- void I2CWrite(uchar dat);
- sbit R=P2^0; //數(shù)據(jù)輸入端口
- sbit CLK=P2^1; //時鐘信號
- sbit STB=P2^2; //鎖存端
- sbit key=P3^2; //定義按鍵
- sbit I2C_SCL = P3^7;
- sbit I2C_SDA = P3^6;
- uchar code table[]={
- /*前4位無顯示*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
- void delay(int z) //延時
- {
- int x,y;
- for(x=0;x<z;x++)
- for(y=0;y<50;y++);
- }
-
- void main(void)
- {
- uchar i,speed=2;
- yid=0;
- zimuo=0;
- I2CStart();
- I2CWrite(0xA0); //10100001讀10100000寫
- EA=1;EX0=1;IT0=1; //全局中斷開,中斷0初始化
-
- while(1)
- {
- if(flag==1)
- {
- while(zimuo<8*32)
- { if(flag==1)
- {
- while(yid<16) //數(shù)據(jù)移位。
- { if(flag==1)
- {
- for(i=0;i<speed;i++) //移動速度
- {
- if(flag==1)
- {Scan();}
- else break;
- }
- yid++; //移動一步
- }
- else break;
- }
- yid=0;
- zimuo=zimuo+32; //后移一個字,
- }
- else break;
- }
- zimuo=0; //到最后從頭開始,有字?jǐn)?shù)決定
- }
- else
- {
- zimuo=128; //靜態(tài)掃描從第一個中文字開始
- Scan();
- }
- }
- }
- /*----------中斷0的服務(wù)子程序-----------*/
- void int_0s() interrupt 0 using 0
- {
- if(key==0)
- {
- delay(2); //去抖
- if(key==0)
- flag=~flag;
- while(key==0); //等待按鍵釋放
- }
-
- }
- /*-------------掃描函數(shù)-----------------*/
- void Scan()
- {
- for(h=0;h<16;h++) //16行掃描
- {
- in_data(); //調(diào)整數(shù)據(jù)
- rxd_data(); //串口發(fā)送數(shù)據(jù)
- P1=h; //送行選
- STB=1;
- STB=0;
- delay(2);
- }
- }
- void in_data(void)
- {
- uchar s;
- for(s=0;s<5;s++)
- {
- BUFF[2*s]=table[zimuo+32*s+2*h]; /*把第一個字模的第一個字節(jié)放入BUFF0
- 中,第二個字模的第一個字節(jié)放入BUFF2中*/
- BUFF[2*s+1]=table[zimuo+1+32*s+2*h]; /* 把第一個字模的第二個字節(jié)放入BUFF1
- 中,第二個字模的第二個字節(jié)放入BUFF3中*/
- }
- }
-
- /**********74HC595輸出函數(shù)*************/
- void rxd_data(void) //串行發(fā)送數(shù)據(jù)
- {
- char s;
- uchar inc,tempyid,temp;
- uchar k;
- R=1;
- if(yid<8)
- inc=0;
- else
- inc=1;
- for(s=0+inc;s<=7+inc;s++) //發(fā)送2字節(jié)數(shù)據(jù)
- {
- if(yid<8)
- tempyid=yid;
- else
- tempyid=yid-8;
- //字模左邊字節(jié)右移tempyid位,右邊字節(jié)左移8-tempyid位,2者相或
- temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));
- for(k=0;k<8;k++)
- {
- I2C_SCL =1; //拉高SCL
- CLK=0;
- //R=(bit)(temp&0x80);
- temp=temp>>1;
- R=CY;
- CLK=1;
- I2C_SDA =R;
- I2C_SCL =0; //再拉低SCL,完成一個位周期
- }
- }
- }
- /*----------AT24C512-------------*/
- /* 產(chǎn)生總線起始信號 */
- void I2CStart()
- {
- I2C_SDA=1; //首先確保SDA、SCL都是高電平
- I2C_SCL=1;
- I2Cdelay();
- I2C_SDA=0; //先拉低SDA
- I2Cdelay();
- I2C_SCL=0; //再拉低SCL
- }
- /* I2C總線寫操作,dat-待寫入字節(jié),返回值-從機應(yīng)答位的值 */
- void I2CWrite(uchar dat)
- {
-
- uchar mask; //用于探測字節(jié)內(nèi)某一位值的掩碼變量
- for (mask=0x80;mask!=0;mask>>=1) //從高位到低位依次進行
- {
- if ((mask&dat)==0) //該位的值輸出到SDA上
- I2C_SDA=0;
- else
- I2C_SDA=1;
- I2Cdelay();
- I2C_SCL=1; //拉高SCL
- I2Cdelay();
- I2C_SCL=0; //再拉低SCL,完成一個位周期
- }
- I2C_SDA=1; //8位數(shù)據(jù)發(fā)送完后,主機釋放SDA
-
- }
復(fù)制代碼
全部資料51hei下載地址:
16X64.zip
(4.64 MB, 下載次數(shù): 98)
2018-7-13 10:08 上傳
點擊文件名下載附件
|