大蝦電子網(wǎng)30章c51入門教程_第1頁
大蝦電子網(wǎng)30章c51入門教程_第2頁
大蝦電子網(wǎng)30章c51入門教程_第3頁
大蝦電子網(wǎng)30章c51入門教程_第4頁
大蝦電子網(wǎng)30章c51入門教程_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第一課C51隨著單片機的不斷發(fā)展,以C為主流的單片機高級語言也不斷被的單片機者這樣單片機才能執(zhí)行編寫好的程序。KEILuVISION2是眾多單片機應(yīng)用開發(fā)軟件中優(yōu)秀的軟件之一,它支持眾多不同公司的MCS51架構(gòu)的,它集編輯,編譯,仿真等于一體,程語言所要求的第一步――建立學(xué)習(xí)環(huán)境。KEIL51是一個商業(yè)的軟件,對于普通者可以到KEIL中國周立功公司的上一份能編譯2K的DEMO版軟件 C程序項目呢?下面就讓我們一ProjectNewProject1-2。接著彈目名稱,這里我們用“testuv2,這是KEILuVision2項目文件擴圖 NewProject菜圖 AtemlAT89C51。此時屏幕如圖-4所示。AT89C51有什么功能、特點呢?看圖中右邊有簡單的介紹。完成上面步驟后,Ctrl+N來實現(xiàn)。好了,現(xiàn)在可以編寫程序了。下面是經(jīng)典的一段程序,呵,如果您#include<stdio.h>void{SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器1定時方式2TCON=0x40;//設(shè)定時器1開始計數(shù)TH10xE8;//11.0592MHz1200波特率TL1=0xE8;TI=TR11;{}}

這段程序的功能是不斷從串口輸出“oWorld!”字符,先不管程序的語法和意思吧,先點擊圖1-5中的3保存新建的程序,也可以用菜單File-Save或快捷鍵Ctrl+S進行保存。因是新文件所以保存時會彈出類似圖1-3的文件操作窗口,把第一個程序命名為test1.c,保存在項目所在的 中,這時您會發(fā)現(xiàn)程序單詞有了不同的顏色,說明KEIL的C語法檢查生效了。如圖1-6鼠標在屏幕左邊的SourceGroup1文件夾圖標上右擊彈出彈出文件窗口,選擇剛剛保存的文件,按ADD按鈕,關(guān)閉文件窗,程序文件已加到項目中了。這時在SourceGroup1文件夾圖標左邊出現(xiàn)了一個小+號說明,文件組中有了文件,點(5)C程序文件已被加到了項目中了,下面就剩下編譯運行了。這個項目只是用做學(xué)于燒寫的HEX文件。先來看圖1-7吧,圖中1、2、3都是編譯按鈕,不同是1是用時再點擊是不會再次重新編譯的。3是重新編譯,每點擊一次均會再次編譯一次,不管會生效。54中可以看到編譯的錯誤信息和使用的系統(tǒng)資源情況等,以后我們要查錯就靠它了。6是有一個小放大鏡的按鈕,這就是開啟\關(guān)閉調(diào)試模式的按鈕,它也存在于菜單Debug-Start\StopDebugSession,快捷鍵為Ctrl+F5。狀態(tài)時才有效,2為停止,程序處于運行狀態(tài)時才有效。3是復(fù)位,模擬的復(fù)位,程序回到最開頭處執(zhí)行。按4可以打開5中的串行調(diào)試窗口,這個窗口可以看到從51的串式按鈕。然后就可以進行關(guān)閉KEIL等相關(guān)操作了。第二 生成HEX文件和最小化系上一篇建了第一單片機語項,但了譯好程能過程寫入5芯片中,要用編譯生成HE文,面來看用KEILuVSION2來編譯生成用于寫的EX文件。EX文件格式是In 司按排數(shù)息據(jù)為字節(jié)有使用6數(shù)示,來單或處的程碼保項在 .Uv2的文就以開先的目。后擊圖21中的1Optionsforaege’,出目項置口,roec轉(zhuǎn)到Oupu選項圖2-12是設(shè)置編譯出生成文件3則是決定否要創(chuàng)建HEXEX我HEX文件創(chuàng)建到指定的路徑2-3結(jié)。(技巧:一、在圖2-1中的1里的項目文件樹形中,先選中對象,再單擊它就可對它進。圖 2-3設(shè)為1200,就可以看到不停輸出的“oWorld!”字樣。如果您還沒有實驗板,那這里31執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序器。下面建一個新的項目名為OneLEDvoidmain(void){unsignedinta;aintdo{dowhilefor(a=0;a<50000;aP1_00;P1.0LEDfor(a=0;a<50000;aP1_01;P1.0LED}}2-4AT89C51OneLED,第三 認識數(shù)據(jù)類3-1,KEILuVision2C51長值unsignedsigned-unsignedsigned-unsignedsigned *位0位03-1KEILuVision2C51char字符或用于處理小于或等于255的整型數(shù)。 unsignedint表示的數(shù)值范圍是0~65535。D2點亮表明正在用unsignedchar數(shù)值延時。3-1第3#include<AT89X51.h>//預(yù)處理命令voidmain(void){unsignedinta;aunsignedint//dowhilefor(a=0;a<65535;P1_0=1P1.0LEDfora=0;a<30000afor(b=0;b<255;b++)fora=0;a<30000a}}for(b=0;b<256;b++)b的值不應(yīng)超出0~65535。longunsignedlongsignedlongsignedint的數(shù)值范圍是-~7,字節(jié)中最表示數(shù)據(jù)的符號,“0”表示正數(shù),“1unsignedlong0~。據(jù),占用節(jié)。因浮點數(shù)的結(jié)構(gòu)較復(fù)雜在以后的章節(jié)中再做詳細的討論。*言中的Boolean類型中的TrueFalse。sfr也是一種擴充數(shù)據(jù)類型,點用一個內(nèi)存單元,值域為0~255。利用它可以51P1255(對P1)之類的器,所不同的是它用于操作占兩個字節(jié)的寄存器,如定時器T0和T1。sbitC51RAMsbitP1_1P1^1;P1_1P1P1.1第四 常L104L,034L,0xF340浮點型常量可分為十進制和指數(shù)表示形式。十進制由數(shù)字和小數(shù)點組成,如況可有可無,但其余部分必須有,如125e3,7e9,-3.0e-3。字符型常量是單引號內(nèi)的字符,如‘a(chǎn)’,‘d’等,不可以顯示的控制字符,可以表4-1。換行符回車符水平制表符退格符換頁符4-1#difineFalse0x0;//用預(yù)定義語句可以定義常量unsignedintcodea=100;//這一句用code把a定義在程序器中并賦值constunsignedintc=100;//用constcint常量并賦值所以如果在這兩句后面用了類似a=110,a++這樣的賦值語句,編譯時將會出錯。路如圖4-1所示。voidmain(void){constunsignedcharunsignedinta;

for(b=0;b<32;{}}

for(a=0;a<30000;a程序中的花樣數(shù)據(jù)可以自以去定義,因這里我們的LEDAT89C51P1腳剛好對應(yīng)P1口特殊寄存器的八個二進位,如向P1口定數(shù)據(jù)0xFE4-1編譯運行上面的程序,然后按外部設(shè)備菜單Peripherals-I/OPorts-Port1就打開4-31許/斷點、所有斷點,菜單也有一樣的功能,另外菜單中還有Breakpoints可打開斷點設(shè)置窗口它的功能更強大,不過這里先不用它。在“P1=design[b];”這一句設(shè)置一器置1才能正確。圖4-2中2旁邊的{}樣的按鈕分別為單步入,步越,步出和執(zhí)行View4-234-24-3第五 變[種類]數(shù)據(jù)類型[器類型]變量名s的數(shù)據(jù)類型后,還可選擇說明該變量的器類型。器類型的說明就是指定該變量在高128位則在52中才有用,并和特殊寄存器地址。說程序器(64KB),用MOVC@A+DPTR指表5-1器類 sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);sfrP10x90;P1I/O口,其地址sfr16T20xCC;8052定時器2,地址為低位地址之上。注意的是不能用于定時器0和1的定義。用的如要P1口中的第2個引腳P1.1??梢哉找韵碌姆椒ㄈザx:sbitP1_1=sftP1=sbitP1_1=0x90^于單片機的可位尋址區(qū)中,可以將要求可位錄址的數(shù)據(jù)定義為bdata,如:unsignedcharbdataib;ucsignedcharibintbdataab[2];ab[2],這些也稱為可尋址位對象sbitab12=ab[1]^12;sfrP1=0x90;//這里沒有使用預(yù)定義文件,sbitP1_0P1^0;sbitP1_70x90^7sbitP1_1=0x91;P1P10,P11,P17void{unsignedinta;a為intunsignedcharb;bcharforP1_00;P1_0for(a=0;a<50000;a++)P1_70;P1_7for(b=0;b<255;b++){for}for(b=0;b<255;b++){}}

P1_1=for(a=0;a<10000;a++)P1_1=1;第六 運算符和表達式定義,在用C51時你還想用回這個的話,你可以這樣寫:typedefintinteger;integera,b;typedefintinteger;integer=100;構(gòu)類型,這一點在后面詳細解說結(jié)構(gòu)類型時再一并說明。typedef的語法是typedefbc33;b,c在一些朋友的來信中會出現(xiàn)“==”與“=”這兩個符號的錯誤原碼,問為何編譯報+-*/1算術(shù)運算符表達式如:a+b*(10-a),(x+9)/(y-(++--然同是加1或減1。如:I++,++I,I--,--I。是先使用MAX232,TTL少量的電路去替換MAX232,可以省一點,效果也不錯(可以查6-1PCcom6-2DB9加上了一個了。你會用Windows的超級終端也行,不過我從不用它。我用 6-4

第七 運算符和表達式 大 中是用“=”,“!=”則是用“not優(yōu)先級,但是前四個的優(yōu)先級要高于后2個的。的真與假,當指定的條件滿足時結(jié)果為1,不滿足時結(jié)果為0。表達式1關(guān)系運算符表達式如#include<AT89X51.H>#include<stdio.h>void{intSCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;{printfint,XY\n"); if(x<y) XY{if(x==printf("X=Y\n");//當XY}}}

printf("X>Y\n");//當X大于Y車符,以使scanf函數(shù)確認有數(shù)據(jù)輸入。7-1!True||False&&True!True||False&&False||False&&True//!Ture先運算得FalseFalse||False //False&&True運算得False //最終False||False得False#include<AT89X51.H>#include<stdio.h>void{unsignedcharTrue1;unsignedcharFalse=0;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;if(!True||False&&True)}

第八 運算符和表達式6種位運算符。12移)→“&”(按位與)→“^”(按位異或)→“|”(按位或)XY00110000110011100101111001108-1#include<at89x51.h>voidmain(void){unsignedinta;unsignedintunsignedchartemp;P1=0xAA;//點亮D1,D3,D5,D7P1口的二進制為 ,為0時點亮LEDfor(a=0;a<1000;a++)forb=0;b<1000;b譯forP1=0xFF;//熄滅LEDforforb=0;b<1000;bP1=0xAA;//點亮D1,D3,D5,D7P1口的二進制為 ,為0時點亮LEDfor(a=0;a<1000;a++)forb=0;b<1000;bP1P1&0x7;//這時LEDD2//因為之前 //結(jié)果存入P1 for(a=0;a<1000;a++)P1=0xFF;//熄滅LED}--變量復(fù)合賦值運算符a+=56等價于a=a+56y/=x+9y=y/(x+9)1以與表達式1和表達式2的類型不一樣。下面是一個邏輯表達式的例子。ifmin=min=(a<b)?a:第九 運算符和表達式*&變量=*指針變量&unsignedint變量ABCCBA0x0028,0x002A另有一個指針變量portA存放在0x002C中unsignedintdataABC_at_0x0028;unsignedintdataCBA_at_0x002A;unsignedintdata*Port_at_0x002C;#include<at89x51.h>#include<stdio.h>void{SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;ABC10;CBA=20;Port&CBACBAprintf("1:CBA=%d\n",CBACBAPort&ABCABC ABC=%d\n",ABC);ABC}值放入0x0A值CBA20;值值值圖9-1器查看9-2在串行調(diào)試窗口的最終結(jié)果是和大小有關(guān)的吧?是的,sizeof是用來求數(shù)據(jù)類型、變量或是表達式的字節(jié)數(shù)的一個運sizeof{unsignedchara;unsignedintb;}字節(jié)值最大只能是255。但編譯時為何不出錯呢?先來看看這程序的運行情況:9-3watch頁中輸入所要查看的變量名對它的值進行查看。做法是按圖中1watch#1(或longunsignedunsigned類型。從上面的規(guī)則可以大概知道有那幾種數(shù)據(jù)類型是可以進行隱式轉(zhuǎn)換的。是的,在C51#include<at89x51.h>#include<stdio.h>void{charxdata*XROM;chara;intAa=0xFB1C;longBa=0x893B7832;floatCa=3.4534;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;*XROMR’;//給XROMa*((charxdata*0xB012aprintfbx%xdc\n”,(charAa,int)Ba,(int)Caa);//轉(zhuǎn)換類型并輸出}程序運行結(jié)果:1c78323在外部數(shù)據(jù)器XDATA中定義了一個字符型指針變量XROM,當用XROM=(charxdata*)這種方法特別適合于用標識符來存取絕對地址,如在程序前用#defineROM0xB012語句,在程序中就可以用上面的方法用ROM0xB012進行存取操作了。第十課是C語言學(xué)習(xí)中的重點。b=b*10;X=A;Y=Page=(a+b)/a- for(;a<50000;a++);第一個分號也應(yīng)該算是空語句,它會使a賦值為0(但要注意的是如程序前有a值,則a的初值為a的當前值),最后一個分號則使整個語句行成一個空循環(huán)。若此時a=0,那么for(;a<50000;a++);就相當于for(a=0;a<50000;a++);我個人習(xí)慣是寫后面的寫法,這樣能使人更容易讀明白。的位置。這會用在goto語句中。#includevoid{unsignedinta;{P10xFFP1P10;while(1);//點亮一段時間后關(guān)閉再次判斷P3_7,如此循環(huán)}實驗電路。這個改變的關(guān)鍵就是把改用SST89C58,并在入仿真程序。錄到中(使用編程器或用CA版的SST89C58燒錄SOFTICE的具體方法和文件可以參考 a/mywz/_1.htm),就可以把上面的電路升級為MON51仿真實驗器。那么怎么用它和KEIL實現(xiàn)聯(lián)機仿真呢?10-210-3Debug頁中選擇對應(yīng)本仿真器的KeilMon51驅(qū)10110-332進行圖10-4中的仿真器設(shè)置。設(shè)置好串,波特率,晶振為11.0592M時選38400。CacheOptions為仿真10-51F-MON51V3.43中小紅點位置時為設(shè)置和取消斷點,點擊2則運行到下一個斷點。圖10-7則是變量和器的查看。仿真器在10-410-510-610-7第十一課曾經(jīng)在BBSC{},[],()等,確實會讓一些初的朋友不解。在VB等一些語言中同一個()號會有不同的#include<at89x51.h>#include<stdio.h>void{SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;a=b=c=d=8;//這會在整個函數(shù)有效 a=10,e=printf("1:b=11,f=printf("2:printf("1:printf("0:}1:2:1:1:if如if(a==b)a++;當aba12:ifif(a==b)elseif(條件表達式3)語句3elseifm)n第十二 開關(guān)語switch{case3:3;break;casen:n;break;default:語句}時不做任何處理,則可以不寫default語句。做好的硬件,以串口和PC連接,用LED查看實驗的結(jié)果。原代碼請到在筆者的1.htm,上面有C51下位機源碼、P0CN[1]=if(CN[1]==0)這樣的判斷語句來的清晰明了。當然它們的效果沒有太大IOvoid(unsignedcharBaudRate),參數(shù)。如調(diào)用(6),9600。當然這段代碼只使用了一種波特SBUF數(shù)據(jù)緩沖寄存器這是一個可以直接尋址的串行口寄存器。有朋友這樣問起sfrSBUF0x99reg51.hat89x51.h頭文件中已對其做了定義,只要用#include就可以了。SCON串行口控制寄存器通常在或設(shè)備中為了監(jiān)視或控制接口狀態(tài),都會到8-1串行口控制寄存器SM0、SM1模功0000118位1029位fosc/321139位8-2串行口工作模式設(shè)置foscUART(UniversalAsynchronousReceiver)的英文縮寫。接收。大家也可以用上面的實際源碼加入REM=0來進行實驗。用軟件對其時,當未收到有效的停止位,則不會對RIRI也必須要靠軟件清除。是89C52系列才有的。在使用串口做通訊時,一個很重要的參數(shù)就是波特率,只有上下位機的波特率9600率用模式1傳輸時,每秒傳輸?shù)淖止?jié)數(shù)是9600÷10=960字節(jié)。51的串口工作模式0定時器12TL1TH1這個定時模式下,定時器溢出后,TH1TL1,再次開始計數(shù),這樣可以不時器1為模式2,SMOD設(shè)為1,分別看看那所要求的TH1為何值。代入:TH1=250第十三 循環(huán)語循環(huán)語句是幾乎每個程序都會用到的,它的作用就是用來實現(xiàn)需要反復(fù)進行多次的操個M的1現(xiàn)1行0結(jié)構(gòu)清晰明了,而且使其編譯的效率大大的提高。在C語言中構(gòu)成循環(huán)控制的語句有g(shù)otovoid{unsignedchara;start:a++;if(a==10)gotoend;gotostart;}gotoa++,a1,a10gotoCgoto多的跳轉(zhuǎn)就使程序又回到了匯編的編程風(fēng)格,使程序失去了C的模塊化的優(yōu)點。while后面的循環(huán)體(語句或復(fù)合語句)將一次都不執(zhí)行就退出循環(huán)。在調(diào)試程序時要會使你的調(diào)試工作更加順利。當然有時會使用到死循環(huán)來等待中斷或IO#include<stdio.h>void{unsignedintI=unsignedintSUM0;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器1定時方式2TCON=0x40;//設(shè)定時器1開始計數(shù)TH10xE8;//11.0592MHz1200波特率TL1=0xE8;TI=TR11;{SUMISUM;printfdSUM=%d\n",I,SUM)顯示}}dowhile#include<AT89X51.H>#include<stdio.h>void{unsignedintI=unsignedintSUM0;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TCON=0x40;//設(shè)定時器1開始計數(shù)TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;{SUMISUM;printfdSUM=%d\n",I,SUM}}前一個程序不會得到顯示結(jié)果,而后一個程序則會得到SUM=11。forforrr代入初值,再判斷條件是否為真,條件滿足時執(zhí)行循環(huán)體并更新條件,再判斷條件是否為#include<AT89X51.H>#include<stdio.h>void{unsignedintunsignedintSUM0;SCON0x50;1,允許接收TMOD0x2012TCON0x401TH10xE8;11.0592MHz1200TL1=0xE8;TI=1;TR11;for(I=1;I<=10;I{SUMISUM;printfdSUM=%d\n",I,SUM}}值。如果改成for(;;)會怎么樣呢?試試看。continue的循環(huán)體加入if(I==5)continue;看看什么結(jié)果?return#include<AT89X51.H>#include<stdio.h>intCount(void);//函void{unsignedintSCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器12TCON=0x40;//設(shè)定時器1開始計數(shù)TH10xE8;11.0592MHz1200TL1=0xE8;TI=TR11;temp=printf1-10SUM=%d\n",temp}int{unsignedintI,for(I=1;I<=10;{SUMISUM;}return}第十四課 函數(shù)類型函數(shù)名稱(形式參數(shù)表{}函數(shù)定義好以后,要被其它函數(shù)調(diào)用了才能被執(zhí)行。C語言的函數(shù)是可以相用的,說明會被按功能分別寫在不同的頭文件中,使用時只要在文件最前面用#include預(yù)處理語printfstdio.h頭文件中。調(diào)用就是指一個函數(shù)體中另一個已定義的函數(shù)來實現(xiàn)所需要的功能,這時函它就是main主函數(shù)。調(diào)用函數(shù)的一般形式如下:如printf(" oWorld!\n");這是在我們的第一個程序中出現(xiàn)的,它以" World!\n"為參數(shù)調(diào)用printf這個庫函數(shù)。在這里函數(shù)調(diào)用被看作了一條語句。tempCount();這樣一句,這時函數(shù)的調(diào)用作為一個運算Count()返回一個int前面說到調(diào)用函數(shù)前要對被調(diào)用的函數(shù)進行說明。標準庫函數(shù)只要用#include件名.h#include.h"引入。如果被調(diào)函數(shù)的定義和主調(diào)函數(shù)不是在同一extern類型標識符ROM的某一段地址上,而函數(shù)說明是告訴編譯器要在程序中使用那些函數(shù)并確定函數(shù)的地interrupt,它是函數(shù)定義時的還可以加上一個選項using51內(nèi)部4組工作寄存器中的函數(shù)類型interruptnusing指明所使用的中斷號。n的取值范圍為0-31,但具體的中斷號要取決于的型號,像01234表9-1AT89C51中斷號和中斷向筆者的閱讀相關(guān)文章下面是簡單的例子。首先要面做好的實驗電路中加多一個按鍵,接在P3.2(12引腳外#includevoidmain(void){EA=1;//總中斷開關(guān)}voidInt0Demo(void)interrupt0using{}unsignedchar{unsignedcharreturnTemp;}第十五課數(shù)組的使用數(shù)據(jù)類型數(shù)組名[常量表達式數(shù)據(jù)類型數(shù)組名[1].[[unsignedintxcount10定義無符號整形數(shù)組,10數(shù)組也是可以賦初值的。在上面介紹的定義方式只適用于定義在內(nèi)存DATA器使變數(shù)值的,這時就要把這些數(shù)據(jù)在程序編寫時就賦給數(shù)組變量。因為51的片內(nèi)RAM內(nèi)的CODE區(qū),以節(jié)省寶貴的RAM。賦初值的方式如下:數(shù)據(jù)類型[器類型]數(shù)組名[常量表達式]={常量表達式數(shù)據(jù)類型[器類型]數(shù)組名[常量表達式1][常量表達式N]={{常量表達式}.{常量表達式N}};unsignedcharLEDNUM[2]={12,35一維數(shù)組賦初值intKey[2][3]={{1,2,4},{2,2,1}};//二維數(shù)組賦初值//#include<stdio.h>voidtaxisfun(int{unsignedchariftaxis2[TempCycB+1]>taxis2[TempCycB數(shù){Temp=taxis2[TempCycB];//前后2數(shù)交換taxis2[TempCycB]=taxis2[TempCycB+1];taxis2[TempCycB+1]=Temp;因函數(shù)參數(shù)是數(shù)組名調(diào)用形}}}void{inttaxis[]=charText1[]={"sourcedata:"};//"源數(shù)據(jù)"charText2sorteddata排序后數(shù)據(jù)"unsignedcharTempCyc;SCON=0x50;//串口方式1,允許接收TMOD=0x20;//定時器1定時方式2TCON=0x40;//設(shè)定時器1開始計數(shù)TH10xE8;//11.0592MHz1200波特率TL1=0xE8;TI=TR11;);//printf("%d",taxis[TempCyc]); }維的字符數(shù)組就組成了一個字符串,在C語言中字符串是以字符數(shù)組來表達處理的。為了能測定字符串的長度,C語言中規(guī)定以‘\o’來做為字符串的結(jié)束標識,編譯時會自動在字ASCII00H00H結(jié)束的,在程序中操作字符數(shù)面一例1602LCD顯示模塊的驅(qū)動演示例子進行理解。這里要注意就是可以用單個字符數(shù)組使用1602液晶顯示的實驗例子 |LCM | 51||DB0P1.0|DB4P1.4| P2.0|DB1P1.1|DB5P1.5| P2.1|DB2P1.2|DB6P1.6| P2.2|DB3P1.3| P1.7|VLCD1K#defineLCM_RWP2_0定義引腳#defineLCM_RSP2_1#defineLCM_EP2_2#defineLCM_Data#includevoidWriteDataLCM(unsignedcharmandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);voidLCMInit(void);voidDisyOneChar(unsignedcharX,unsignedcharY,unsignedcharvoidDisyListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelay5Ms(void);voidunsignedcharcodecdle_net[]={" unsignedcharcode []={"pnzwzw@cdlenet"};void{DisyListChar(0,0,cdle_net);DisyListChar(0,1,);}voidWriteDataLCM(unsignedchar{LCM_Data=WDLCM;LCM_RS=1;LCM_RW=LCM_E0若晶振速度太高可以在這后加小的延時LCM_E=0;//延時LCM_E=}{

mandLCM(unsignedcharWCLCM,BuysCBuysC0ifBuysCReadStatusLCM根據(jù)需要檢測忙LCM_Data=WCLCM;LCM_RS=LCM_RW=LCM_E=LCM_E=LCM_E=}unsignedchar{LCM_RS=LCM_RW=LCM_E=LCM_E=LCM_E=}unsignedchar{LCM_RS=0;LCM_RW=LCM_E=LCM_E=LCM_E=whileLCM_Data&Busy檢測忙信號}voidLCMInit(void)LCM{LCM_Data=mandLCM(0x08,1);//關(guān)閉顯示mandLCM(0x01,1);//顯示清屏mandLCM(0x06,1);//顯示光標移動設(shè)置);//}voidDisyOneChar(unsignedcharX,unsignedcharY,unsignedchar{Y&=X&=0xF;//X15,Y1ifYX|0x40當要顯示第二行時地址碼+0x40;X|0x80;}voidDisyListChar(unsignedcharX,unsignedcharY,unsignedcharcode{unsignedcharListLength=0;Y&=0x1;{ifX0xFX{DisyOneChar(X,Y,DData[ListLength]);//顯示單個字符}}}//5msvoid{unsignedintTempCyc=5552;}void{unsignedcharTempCycA=5;unsignedintTempCycB;{}第十六課指針的使用指針就是指變量或數(shù)據(jù)所在的區(qū)地址。如一個字符型的變量STR存放在內(nèi)存單元是不可能代替的。C語言也因此引入了指針類型的數(shù)據(jù)類型,專門用來確定其他類型數(shù)據(jù)的STRIPSTR51HSTRIP就是指針變量。下面用一個變量的指針就是變量的地址,用取地址運算符‘&’取得賦給指針變量。&STR就是把要變量STR除了可以用‘STR’這個變量名來之外,還可以用變量地址來訪問。方法是先用&STRSTRIP指針變量,然后就可以用*STRIPSTR數(shù)據(jù)類型[器類型] unsignedcharxdata*pi//指針會占用二字節(jié),指針自身存放在編譯器默認區(qū),指向xdata區(qū)的char類型voidmain(void){unsignedcharcodeunsigned

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論