欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5181|回復: 7
打印 上一主題 下一主題
收起左側

51單片機開發環境的搭建 由點亮一個LED引入

[復制鏈接]
跳轉到指定樓層
樓主
ID:105323 發表于 2016-3-4 13:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
第一章 51單片機環境的搭建1.1 由點亮一個LED引入用單片機來點亮LED,這幾乎是每個同學學習單片機的第一個實驗。那么誰來點,怎么亮?注意這里面涉及到兩個研究對象,單片機和LED。要想知道單片機如何來點,先要知道LED為什么亮。這種由分析被控制對象來研究控制對象的思路在本教程后面會反復用到,這里先提出來亮個相。我們先來看LED為什么會亮,也就是說先來了解LED的工作原理。當有電流通過時(達到一定值比如5mA),LED便會發光。至于進一步的工作原理我們不去追究,有興趣的可以自己查查,不屬于我們討論的內容。根據這個原理,我們只需要給LED一端(右邊)接在5V電源下,LED左邊接地,如圖1所示,產生電勢差,正向導通,那么LED有電流通過,就發光了。



圖1 點亮LED,由于電流過高,LED很快熄滅
但是LED會很快熄滅,為什么?LED正向導通時,電阻幾乎為0,根據歐姆定律,電流無窮大,LED很快被燒掉。因此我們需要給這個電路加個限流電阻,這個限流電阻應該取多大,這里我們把LED的電阻當作0,電壓為5V,電流設定為5mA(具體的數值需要看你購買的LED廠家提供的參數),根據歐姆定律就能算出限流電阻為1K。這樣LED就能持續發光了,如圖2所示。



圖2 串聯一個電阻,LED正常發光
那么LED怎么熄滅呢?沒有電流通過就可以了。如何實現沒有電流?LED兩邊等電勢就行了。因此只需要在LED左邊提供一個高電平5V,LED就熄滅了,如圖3所示


?
圖3 兩邊等電勢,LED熄滅
以上我們完成了對LED的分析。前面說了,我們要通過分析被控制對象(LED)來操作控制對象(MCU).下面再來分析,如何操作控制對象。首先要知道MCU是什么?根據定義,MCU是具有一定可編程能力的數字電路集合體。那么什么叫做可編程呢?通俗的講,就是根據人給單片機的不同指令去執行不同的任務。那這樣就好辦了,如下圖所示,LED左邊接在了MCU的P1.0引腳。根據前面的分析,只要跟MCU講:”把你的P1.0引腳輸出低電平“,(假設這里我們的單片機輸出高電平是5V,低電平是0V。因為有的單片機高電平為3.3V)。這時候LED就點亮了,如果輸出高電平,LED就熄滅了,這樣就實現了單片機對LED的控制,如圖4所示。



圖4 單片機實現對LED的控制
你使用人類語言與單片機交流,單片機是聽不懂的。因此你對單片機發送的指令無法傳送給單片機。單片機只認識0和1.那么我們馬上想到用0和1來和單片機對話,這當然可以。其實早期的程序就是直接寫0和1的。可以這樣做對程序員來說太痛苦了,單片機是認識了,程序員卻暈倒了。不信的話,你自己在一張A4的紙上填滿0和1,姑且不論什么含義,看著就暈倒了。這樣就產生了一個問題,用人類語言,單片機聽不懂,用單片機的語言,人類使用不方便。因此就各退一步,來個折中吧。用什么呢,C語言(早期是匯編,我們后面再談)。把人類語言轉成C語言,然后再按照一定的規則把C語言轉成機器語言。前者叫開發環境,后者就是我們通常所說的編譯。你完全可以理解為翻譯。編譯出來的結果就是單片機認識的機器指令。那么這個指令如何傳送給單片機呢,這個過程就叫程序燒寫,或者程序下載,燒寫過程中用到的工具就是燒寫器。把機器指令輸送到單片機,但上電后,單片機就開始執行這個指令,從而到達我們控制器件的目的。
這個例子非常簡單,但是給出了單片機開發的基本流程。首先我們要知道工作器件的原理。工作器件是我們最終的目的,比如控制led,用來照明;溫度傳感器測量溫度;液晶顯示內容等等。單片機只是達到最終目的的手段或者途徑。因此用單片機來控制工作器件,一開始就要理解工作器件是如何工作的。然后在這個基礎上,根據工作器件的需要對單片機傳遞不同的指令(人類語言)。單片機是看不懂人類指令的,因此需要翻譯成單片機看得懂的語言。然后把翻譯的結構傳送給單片機。
前面羅嗦了這么多,主要是為初學者講解了單片機開發的初步思想以及單片機開發環境的搭建。主要總結如下兩點:1.從被控制對象入手來研究如何操作控制對象。所謂被控制對象其實就是我們想要使用的外圍工作器件,他可以是LED,也可以是溫度傳感器,步進電機等等,是我們的最終目的,比如讓LED閃爍,測量溫度,控制轉速等等。如何了解他們的工作原理,最好的方式就是閱讀廠家提供的說明資料。對于控制對象(單片機),這個也很多,51,MSP430,AVR,PIC等等,如何與他們對話,同樣的道理,查看芯片手冊(也是官方資料)。這里反復強調是因為看到很多初學者一碰到問題就去網上論壇發帖求助,殊不知最好的解決問題的方式是去查看官方資料。2.了解這兩個對象之間的關系后,我們就開始搭建單片機開發環境,編寫指令,編譯指令,最后燒寫指令。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:105323 發表于 2016-3-4 13:52 | 只看該作者
1. 下載Keil_C51安裝文件和破解工具:http://www.raoushi.com/keil%E4%B8%8B%E8%BD%BD.html

2. 雙擊Keil_C51_v9.02a文件

這里可根據個人情況,隨便填寫


然后點擊下一步開始安裝,等待安裝完成。



Keil破解
3. 右鍵點擊keil軟件,選擇以管理員身份運行:


點擊File->License Management,復制CID內容,比如在本例中為:CBCDR-IXPAG


4. 解壓破解器Keil_Lic.rar文件,右鍵單擊Keil_Lic.exe,以管理員身份運行,將剛才復制的CID內容,粘貼到破解器中的CID框中,如下
   

   點擊Generate生成序列號,并將該序列號復制
   

5. 回到Keil中的License Management界面,
   找到New License ID(LIC)輸入框,并將序列號復制進去,點擊Add LIC



執行成功后的界面如下:


這樣Keil軟件就可以使用了
回復

使用道具 舉報

板凳
ID:105323 發表于 2016-3-4 13:53 | 只看該作者
本帖最后由 51黑黑黑 于 2016-3-4 13:58 編輯

1.3指令下載/燒寫程序下載STC-ISP:打開http://www.raoushi.com/mcuteach/250.html  在網頁底部下載
將STC-ISP-v4.80.rar文件解壓,即可使用

回復

使用道具 舉報

地板
ID:105323 發表于 2016-3-4 13:54 | 只看該作者
51單片機環境的搭建-1.4點亮一個LED

1.4 點亮一個LED
在本教程中,我們使用最常見的STC89C52RC-DIP40單片機作為主控芯片,這也是很多初學者入門的單片機。IDE采用Keil軟件,該軟件自帶編譯器,然后通過燒寫器將指令下載到單片機。
1.4.1 新建一個keil工程
(1) 雙擊keil軟件


(2) 點擊project->New uvision Project,選擇保存路徑,取一個工程名字LED



(3)在CPU中選擇Atmel,找到并選擇AT89C52,點擊確定



接下來彈出一個對話框,選擇"否"



(5) 點擊"創建一個空白文件"或者使用ctrl+N(File下面的那個圖標)


?然后點擊保存(ctrl+s),文件名為led.c
我們發現這個字體比較小,現在我們把它調大一點,
(6) 點擊Edit->Configuration->Color&Fonts


在Window中,選中 8051: Editor C Files, Element中選擇Text,Font中點擊Courier New...



最后把我們新建的這個文檔添加到工程中,右鍵點擊SourceGroup,



選擇Add Files to Group ''Sources Group...''
找到我們新建的led.c這個文件,點擊"add",然后關閉
1.4.2 復制如下代碼到led.c文件中(編寫指令)

#include
sbit LED = P1^0;
void main(void)
{
       while(1)
       {
               LED=0;
       }
}
至于includereg52.h,sbit等,暫時不要理會,你把它當成固定格式,語法都可以,后面我們會談到這個問題。我們這章的重點是把單片機的開發環境搭建起來,暫時不要扯遠了

1.4.3 編譯工程(翻譯指令)
(1) 工程設置 project->Options for Target...


(2) 點擊target,在Xtal中輸入11.0592



(3) 點擊target, 選中create HEXfile



(4) 點擊編譯



1.4.4燒寫程序(傳送指令到單片機)(后面補充)

回復

使用道具 舉報

5#
ID:105323 發表于 2016-3-4 13:56 | 只看該作者
                                                                                                     第二章 初步認識51單片機





前面我們學會了如何操作一個MCU的管腳(P1.0),讓它設置為低電平(sbit LED= P1^0;LED=0),那么我們很容易的就能想到如何將MCU的管腳設置成高電平.這一講,我們就來討論如何控制單片機的IO口,也就是輸入輸出端口(input and outputport)

2.1單片機IO口操作與延時
既然我們學會了如何控制P1.0,那么同樣的方式我們就能控制P1.1,P1.2, ...P1.7了。很奇怪,為什么單片機的引腳從P1.0開始到P1.7,為什么不是從P1.1到P1.8?基本上你所見到的控制芯片都是以0為起始的。我們把P1.0到P1.7叫做P1端口。那么這樣的端口有多少個呢,在STC89C52中,一共有4組這樣的端口,分別是P0,P1,P2,P3.每個端口都有8個管腳,這樣很快,我們應該知道操作這4組共32個管腳了。我相信寫到這里,每個人都已經知道了如何使用這32個任意一個管腳來控制LED。
既然我們學會了如何控制一個LED,那么如何控制兩個LED?很容易的能猜到代碼如下:
#include
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit LED3 = P2^1;
void main(void)
{
    while(1)
        {
           LED1=0;
           LED2=0;
           LED3=0;
        }

}  
通過以上方式我們能用任意的IO端口來點亮LED。這里就不再贅述了。
既然我們學會了如何點亮一個LED,相信熄滅一個LED也會了,并且你能很快的寫出代碼:
#include
sbit LED = P1^0;
void main(void)
{
        while(1)
        {
           LED = 0;
           LED = 1;
        }
}
這樣對不對?是對的。LED=0,燈亮了,LED=1燈滅了。程序確實是沒有問題,LED也是這樣操作的。問題是人的肉眼分辨不出來,為什么呢?這里就涉及到了單片機的運行速度以及人眼的分辨間隔。下面我們來分析從LED=0(亮)到LED=1(滅),中間的間隔是多長時間?這個涉及到單片機的執行速度與時鐘周期,機器周期,指令周期相關,我們暫且不討論。現在我們通過keil軟件調試的方法找到從LED=0到LED=1這個過程花了多長時間。

(1)打開keil軟件,新建一個工程,并將以上代碼拷入led.c文件



(2) 點擊Project->options for TargetTarget1...



(3) 在彈出的對話框中選擇target,Xtal選擇11.0592,然后點擊OK



(4) 點擊debug圖標,紅色方框所示



(5)彈出來的界面比較糟糕,可以自己調節,如何調節?這里舉一個例子,比如我想移動Register這個窗口,用鼠標左鍵點擊Register窗口的標題欄(窗口的藍色部分),按住鼠標不松開并拖動。



此時界面如上圖所示,四個紅色方框內的方框表示四個方向。此時將鼠標不松開繼續拖動到右邊紅色方框中(注意是要把鼠標放到方框內),結果如下:



此時右邊區域會變為藍色,該區域表示Register即將存放的區域,然后松開鼠標,拖動結束。
    點擊Register窗口中Autohide圖標,如下圖紅色方框所示,將Register窗口自動隱藏。


其他窗口的調整方法類似。
(6) 插入斷點。如下圖所示,在紅色方框位置雙擊鼠標,則自動插入斷點,并且出現紅色斷點標志。


這里我們插入兩個斷點如圖所示



點擊紅色方框(1)中的RST,然后點擊紅色方框(2)中的run,此時黃色箭頭會跳到紅色方框(3)處,記錄紅色方框(4)中的時間t1=0.00042209s
點擊方框(2)中的run,此時黃色箭頭會跳到紅色方框(5)處,記錄紅色方框(4)中的時間t2=0.00042426s,那么t2-t1=0.00000217s=2.17us,
表示LED從點亮到熄滅只用了2.17微秒,而人眼的最小分辨時間間隔大約為0.27s(270000微秒),因此感知不到燈的亮滅過程。你可以將這個程序下載到單片機中做做實驗,你會發現LED很暗。事實上以上程序將導致LED循環亮滅,由于變化時間太快,幾個微秒,我們無法感知,因此給人的感覺就是燈很暗。現在我們如何設置延時,讓我們能更清楚的觀察燈的亮滅過程?思路很簡單,讓單片機點亮LED后,去干點別的事情,然后再熄滅LED。這個就好比你坐火車時,提前到了一個小時,你可以看看書,玩玩手機。目的是坐火車,看書,玩手機只起到消磨時間的作用。那么同樣,在本例中,我們讓單片機干什么事情呢?可以選擇休眠(我們后面講到),或者讓它去數數。比如從1數到10000等等。這種方式就叫做軟件延時。
#include
sbit LED = P1^0;
void main(void)
{
    unsigned int i;
        while(1)
        {
               LED = 0;              
             for(i=0;i<40000;i++);
              LED =1;
             for(i=0;i<40000;i++);                    
        }                                 
}

將以上代碼復制到led.c文件中并保存。該段代碼中,通過去做別的事情來達到延時的作用。我們再次調試看看LED熄滅和點亮時間的間隔,設置斷點如下:



以上可以看出,1.60636393s-0.00042318s大約1.6s,遠遠大于人的分辨時間。
既然我們能控制一個LED的亮滅了,那么同理可知,我們當然知道如何控制并延時其他LED了,這樣我們就學會如何操作單片機的IO端口以及如何通過軟件延時了。
下面我們來看看就這兩招能干什么事情?

回復

使用道具 舉報

6#
ID:105323 發表于 2016-3-4 13:57 | 只看該作者
                                                                                                     第二章 初步認識51單片機-2.2單片機控制LCD1602液晶顯示模塊





上面學的兩招,控制IO和延時,在這里要舉的第一個例子就是LCD1602。LCD1602什么意思,表示一行可以顯示16個字符,一共有兩行。先來個LCD1602的簡單介紹,1602LCD主要技術參數:
顯示容量:16×2個字符
芯片工作電壓:4.5—5.5V
工作電流:2.0mA(5.0V)
模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
引腳功能說明
1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1所示:


第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7~14腳:D0~D7為8位雙向數據線。
第15腳:背光源正極。
第16腳:背光源負極。
我們來看看如何使用這兩招控制LCD1602液晶模塊。既然是用單片機控制LCD1602,那么根據前面的分析思想,首先要搞清楚誰是控制對象,誰是被控制對象。很顯然,LCD1602是被控制對象,那么我們就先從LCD1602開始分析。所謂控制也可以理解為溝通,那么如何與LCD1602溝通呢?可以想一想,平時人與人是如何溝通的?溝通之前先要打個招呼吧,比如“你好”之類的,電話里面要先講個“喂?”,之后才進入溝通正題了。其實單片機與LCD1602的溝通方式也一樣,“喂?”在這個例子里面就叫初始化。后面也會經常碰到這個“初始化”的概念。其實器件也是人設計的,所以他的工作方式從某種程度上講,也是人的溝通方式。打完招呼后,就開始進入真正主題了。什么主題呢?LCD1602是顯示模塊,主要作用當然是顯示了。那么顯示什么呢?很明顯,顯示內容當然來自于單片機了,單片機讓它顯示什么它就顯示什么。這個‘顯示什么’就是傳送的數據。那么怎么往1602傳送數據呢?1602什么意思,表示2行16個字符,也就是有不同的顯示地點,那么如何確定顯示地點呢?因此前面的分析可以總結為三個問題,如何初始化,如何傳送顯示的內容(顯示什么),在哪里顯示。這三個問題如何解答呢?當然要去看芯片手冊了。

為了解決這三個問題,我們先來看看人與人之間是如何溝通的,如果當面溝通,你的信號(聲音)能夠直接傳到對方,而且能讓對方聽懂。如果相距比較遠,那么就使用電話等通信工具。前者信號傳遞載體是空氣,后者是電話線。那么我們來看看MCU與LCD1602的信號傳遞載體是什么樣的。查看原理圖。因為是MCU與1602之間的溝通,當然這里我們只查看與單片機相連接的部分。



從圖中我們看到,單片機通過P2.7,P2.6分別與RS,EN連接,P0端口與D0到D7連接,一共10根線。那么也就是說,單片機的所有指令,數據等都是通過這10根線來完成的。怎么樣去控制LCD呢,當然是閱讀LCD的說明手冊。這里來個比喻,房間內一個人規定,敲三下門,屋內的人才把門打開。如果你要進入屋內,就必須敲三下,如果你不知道這個規則,敲了四下,或者大喊大叫,門也開不了。這個規定可以是多樣化,比如一共敲兩下,第一下要敲重一點,第二下要敲輕一點。或者重敲三下,輕敲一下,等等。而且這里你不需要問為什么,照著做就行了。其實LCD1602包括后面會講到的其他模塊同樣如此,你要與它溝通,當然必須按照它的規則來。下面我們就來解讀它的規則,來解決前面提到的三個問題,

LCD1602初始化;在哪里顯示;顯示什么。
(1)LCD1602初始化
關于這一點,說明手冊上已經告訴我們了,這里全盤復制過來。
延時15ms
寫指令38H
延時5ms
寫指令38H
寫指令08H
寫指令01H
寫指令06H
寫指令0CH
以上為初始化過程,延時部分好解決,前面講過了。這里就看如何寫指令了。寫指令這個過程肯定是通過上圖中10根線來完成的。D0-D7一共八根線應該是用來存放指令的內容。問題來了,1602怎么知道單片機給我的是命令還是數據。(命令是什么,在哪里顯示,屏幕清零;數據是什么,顯示什么內容,顯示A還是B)。LCD1602看到RS為高時,就明白了,哦,你要通過P0端口給我數據了,于是LCD1602就把這些數據拿過來了。看到RS為低時,就知道你要給我指令了。通過這種方式,單片機能準確的傳遞指令或者數據信息,實現與LCD1602的溝通。是不是這樣就能讓LCD1602正常執行了。不是的。回到我們前面講的那個例子,這里加個條件,屋內人聽到敲門三下后,判斷暗號正確了,但是沒有直接開門,而是通知了他的上級,得到上級的授權后,才開門。也就是兩個條件,暗號正確和上級授權。LCD1602也一樣,收到指令沒有立即執行,還要等另外一個信號,就是EN使能信號。此時EN給個一定寬度的脈沖,LCD1602開始執行。




時序圖如上圖所示,這里少了R/W信號,用于控制從LCD1602讀取還是寫入的,為了簡化過程,在硬件上把R/W接地了,也就是只能寫不能讀。同時,讀忙信號也不能操作,這里采用延時的方法替代。根據前面的分析很容易的寫出寫指令的代碼:
?void write_com(unsigned charmycmd)
{
  delayMs(5);//注意這里需要延時5ms比較保險 代替判斷忙信號
  P0=mycmd;       //準備好指令
  RS=0;        //告訴LCD1602,P0中放的是指令不是數據
  EN=1;
  delayUs(5); //根據時序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執行
}
同樣的道理,以上代碼中,只需改一下RS信號為1,就是寫數據的代碼了

void write_com(unsigned char mydata)
{
  delayMs(5);//注意這里需要延時5ms比較保險 代替判斷忙信號
  P0=mycmd;       //準備好指令
  RS=1;        //告訴LCD1602,P0中放的是數據不是指令
  EN=1;
  delayUs(5); //根據時序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執行
}
講到這里,LCD1602初始化代碼應該能寫出了。同時我們也已經寫出了傳遞指令的代碼,那么現在我們只要知道指令內容就可以了。
1602LCD的指令說明及時序
1602液晶模塊內部的控制器共有11條控制指令,如表2所示:



1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。(說明:1為高電平、0為低電平)
指令1:清顯示,指令碼01H,光標復位到地址00H位置。
指令2:光標復位,光標返回到地址00H。
指令3:光標和顯示模式設置 I/D:光標移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。
指令4:顯示開關控制。 D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示C:控制光標的開與關,高電平表示有光標,低電平表示無光標 B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標或顯示移位 S/C:高電平時移動顯示的文字,低電平時移動光標。
指令6:功能設置命令 DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示 F:低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。
指令7:字符發生器RAM地址設置。
指令8:DDRAM地址設置。
指令9:讀忙信號和光標地址 BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數據,如果為低電平表示不忙。
指令10:寫數據。
指令11:讀數據。
你需要給LCD1602什么指令,只需要傳遞給void write_com(unsignedcharmycmd)函數中的mycmd參數就行了。
(2)在哪里顯示
知道了這個,現在我們就能解決前面提到的第二個問題,在哪里顯示,


例如第二行第一個字符的地址是40H,那么是不是它的地址就是40H了。注意表2中第8條數據存儲地址,D7已經被寫死了。最終的顯示地址是40H+10000000B,因此我們只要把這個值傳給mycom,LCD1602就知道在第二行第一個位置顯示了。
(3)顯示什么
前面講了,如果傳送數據就是要顯示的內容。比如我要顯示字母A,怎么操作呢。


以上圖中可以知道,如果你要顯示A,那么數據的高位為0100,低位為0001,因此為01000001。把這個數據傳送給LCD1602,它就知道要顯示A了。
現在回過頭來看看,我們在使用單片機控制LCD1602這個過程中用到了單片機的哪些知識。回去看看圖1,10根連接線,P2.6和P2.7引腳,再加上P0端口,主要是通過P2.6和P2.7高低變化來發出指令或數據,P0的變化反映指令或數據的內容。可見,這個過程中我們只用到了IO口控制和延時。其他很長的部分我們用在理解1602的使用規則了。注意這里是使用規則,談不上原理。比如你給LCD1602發送清屏指令時,你明白LCD1602收到這個指令是如何操作清屏的嗎?不知道,也沒有必要知道。液晶模塊說明書也不告訴你。好比你使用手機時,你點擊一下某個應用程序就打開了,然后按照它的規則去使用就行了,比如聽歌,上網等等,你不用關心它們是怎么實現的。其實手機也是個模塊,我們只要學會操作就行了,不管它里面發生了什么事情。
附參考代碼如下:
#include
void LCD_init(void);
void delayUs(unsigned char t);
void delayMs(unsigned char t);
void write_com(unsigned char mycmd);
void write_data(unsigned char mydata);
sbit RS=P2^7;
sbit EN=P2^6;
void main (void)
{

       LCD_init();      
       write_com(0x0f);
       write_data(0x41);
       while(1);
}
void LCD_init(void)
{
delayMs(15);
write_com(0x38);
delayMs(5);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void delayUs(unsigned char t)
{
       while(--t);
}
void delayMs(unsigned char t)
{
       while(--t)
       {
              delayUs(245);
              delayUs(245);
       }
}
void write_com(unsigned char mycmd)
{
  delayMs(5);//注意這里需要延時5ms比較保險代替判斷忙信號
  P0=mycmd;      //準備好指令
  RS=0;       //告訴LCD1602,P0中放的是指令不是數據
  EN=1;
  delayUs(5); //根據時序圖,脈沖要有一定寬度
  EN=0;         //使指令有效,開始執行
}              
void write_data(unsigned char mydata)
{
  delayMs(5);//注意這里需要延時5ms比較保險
  P0=mydata;
  RS=1;
  EN=1;
  delayUs(5);
  EN=0;
}

回復

使用道具 舉報

7#
ID:279302 發表于 2018-1-26 16:05 | 只看該作者
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表