標(biāo)題: 單片機(jī)講義14:復(fù)習(xí)綜合實(shí)驗(yàn)一&&IO擴(kuò)展 [打印本頁(yè)]

作者: heiba    時(shí)間: 2017-11-19 03:17
標(biāo)題: 單片機(jī)講義14:復(fù)習(xí)綜合實(shí)驗(yàn)一&&IO擴(kuò)展
第14講 復(fù)習(xí)綜合實(shí)驗(yàn)一&&IO擴(kuò)展
知識(shí)點(diǎn):
1、 綜合實(shí)驗(yàn)一的一種編程思路
2、 IO擴(kuò)展之輸入擴(kuò)展
3、 基于74HC165按鍵擴(kuò)展實(shí)驗(yàn)
4、 學(xué)會(huì)根據(jù)器件真值表和時(shí)序圖編寫器件驅(qū)動(dòng)程序

一、綜合實(shí)驗(yàn)一的一種編程思路
1、 首先這個(gè)實(shí)驗(yàn)的目的主要是訓(xùn)練大家,對(duì)矩陣式按鍵與數(shù)碼管動(dòng)態(tài)顯示的掌 握程度,要求必須用矩陣式按鍵和 8 位數(shù)碼管,我們現(xiàn)在開始分析程序設(shè)計(jì)思路。
2、 首先要明確實(shí)驗(yàn)的要求:實(shí)驗(yàn)要求我們從矩陣式按鍵中任選兩支鍵作為加 1 和減 1 輸入按鍵,最大加到 100。所以,我們要在內(nèi)存中開辟一個(gè) char型變 量,定義為 char num,此變量就是我們通過按鍵可以修改的。
3、 我前幾次課講過按鍵的有效方式,這里,我們選一個(gè)最簡(jiǎn)單的有效方式――抬起有效。言外之意,就是當(dāng)我們按下按鍵并松開的時(shí)候,num 值才會(huì)改變。通過矩陣式按鍵的掃描,我們獲得了 0—15 個(gè)鍵值。這些鍵值是我們按下按 鍵的時(shí)候獲得的,不是松開的時(shí)候獲得的,而我們想松開的時(shí)候讓按鍵有效, 所以我們應(yīng)該在程序中加一個(gè)等待按鍵釋放的程序 while(!GPIO_KEY !=0xf0);一定要注意這條語(yǔ)句的位置。
4、 一旦全局變量 KeyValue 獲得了鍵值,它是不會(huì)自行清除的,這就造成了觸 發(fā)一次動(dòng)作很多次,為了解決這個(gè)問題,我們把按鍵不動(dòng)作或消抖不通過的鍵值設(shè)置為 0-15之外的數(shù),這里設(shè)置為 0XFF,也就是當(dāng)無(wú)按鍵動(dòng)作時(shí)
KeyValue = OXFF。
5、 關(guān)于 num 值如何在數(shù)碼管上顯示,這里運(yùn)用了除和取余法,目的是獲得百位、 十位、個(gè)位的十進(jìn)制數(shù)。
百位:bai = num /100; 十位:shi = num%100/10; 個(gè)位:ge =  num%100%10;
然后把要顯示的百位、十位、個(gè)位送到相應(yīng)的數(shù)碼管上,程序如下:
if(i == 0)
{
P0 = smgduan[bai];
}
else if(i == 1)
{
P0 = smgduan[shi];
}
else if(i == 2)
{
P0 = smgduan[ge];
}

通過以上的計(jì)算,我們就可以在數(shù)碼管編碼數(shù)組中找到對(duì)應(yīng)的顯示編碼。 至此,程序設(shè)計(jì)完成!

二、IO 擴(kuò)展之輸入擴(kuò)展:
這里所討論的 IO 輸入擴(kuò)展,意思是如何通過單片機(jī)一位 IO 端口去讀取外部輸入的一個(gè)字節(jié)的數(shù)據(jù)(8 位)。下面我們介紹一下器件 74HC165。

三、74HC165 用法:


引腳介紹

SH//LD:移位控制/置入控制(低電平有效),移位:使能移位輸出;置入:把數(shù)據(jù)放入移位寄存器中
CLK,CLK_INH:時(shí)鐘輸入端 SER:串行數(shù)據(jù)輸入端QH:輸出端
/QH:互補(bǔ)輸出端
A- H:并行數(shù)據(jù)輸入端 其實(shí)看一個(gè)芯片如何使用的,不只是看引腳功能,更重要的是要看時(shí)序圖和真值表。

真值表:

時(shí)序圖:

這個(gè)時(shí)序圖包含兩大部分內(nèi)容:裝載數(shù)據(jù)(LOAD)和串行移位(SERIALSHIFT),其中 LOAD 時(shí),必須 inhibit(時(shí)鐘禁止),CLOCK _INHIBIT =1;
首先分析如何 LOAD,所謂 LOAD 就是把通過此器件獲得的 8 位數(shù)據(jù),加載到此器件的內(nèi)部移 位寄存器里。比如外接的是 8 個(gè)按鍵,平時(shí)沒按下按鍵時(shí)是高電平,這時(shí),加載到器件內(nèi)部 移位寄存器里的是 0XFF,當(dāng)其中某一個(gè)鍵被按下時(shí),對(duì)應(yīng)的 8 位編碼數(shù)據(jù)就被加載內(nèi)部移位 寄存器里。通過時(shí)序圖和真值表,我們不難發(fā)現(xiàn),LOAD 時(shí),SHIFT//LOAD 必須保持低電平。 所以加載數(shù)據(jù)時(shí),我們可以這樣編碼:
SHIFT//LOAD= 0;
_NOP_();   //保持一段時(shí)間的低電平


隨后,在 CLOCK_HAIBIT 保持低電平,SHIFT//LOAD 保高電平,開如一段 8 位串行數(shù)據(jù)的移 位輸出,時(shí)鐘上升沿狀態(tài)下開始移位輸出。以下是上升沿的寫法,一定要記住!

CLOCK = 0;
_NOP_();
indata |= indata; CLOCK = 1;

四、基于 74HC165 按鍵擴(kuò)展實(shí)驗(yàn): 實(shí)驗(yàn)現(xiàn)象:下載程序后,按下獨(dú)立按鍵可以點(diǎn)亮對(duì)應(yīng) LED 燈。注意事項(xiàng):必須將 74HC165模塊的JP165 短接片短接,否則不會(huì)出現(xiàn)象。

五、時(shí)序與真值表時(shí)序,就是按照一定的時(shí)間順序給出信號(hào)。按照這個(gè)時(shí)間順序,你就能得到你想要的數(shù)據(jù)或者把你要寫的數(shù)據(jù)寫進(jìn)芯片。
真值表:輸入與輸出物理電平關(guān)系
六、學(xué)會(huì)根據(jù)器件真值表和時(shí)序圖編寫器件驅(qū)動(dòng)程序




這是以前給小學(xué)生培訓(xùn)單片機(jī)做的一套講義,盡可能的做到了通俗易懂,現(xiàn)分享給大家,絕對(duì)的純?cè)瓌?chuàng)資料.
全部資料下載地址(共15章,pdf格式):http://www.torrancerestoration.com/bbs/dpj-98524-1.html








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1