c語言的單片機模塊化編程初階入門_第1頁
c語言的單片機模塊化編程初階入門_第2頁
c語言的單片機模塊化編程初階入門_第3頁
c語言的單片機模塊化編程初階入門_第4頁
c語言的單片機模塊化編程初階入門_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

例如:LCD1602液晶模塊應(yīng)用要求:LCD1602字符型液晶顯示實驗。在屏幕的第一行顯示“224166320@qq”,第二行那么顯示“Tel:1308645xxxx”[實驗原理——LCD根底知識]LCD顯示器是一種利用液晶的扭曲/向列效應(yīng)制成的新型顯示器。具有體積小、重量輕、功耗低、抗干擾能力強等優(yōu)點,因而在單片機系統(tǒng)中被廣泛應(yīng)用。[實驗原理——LCD結(jié)構(gòu)及工作原理]LCD本身不發(fā)光,是通過借助外界光線照射液晶材料而實現(xiàn)顯示的被動顯示器件。向列型液晶材料被封裝在上、下兩片導(dǎo)電玻璃電極之間,液晶分子平行排列,上下扭曲90度,外部入射光線通過上偏振片后形成偏振光,該偏振光通過平行排列的液晶材料后被旋轉(zhuǎn)90度,再通過與上偏振片垂直的下偏振片,被反射極反射過來,呈透明狀態(tài)。假設(shè)在上、下電極之間加一定電壓,在電場的作用下迫使加在電極局部的液晶分子轉(zhuǎn)成垂直排列,其旋光作用也隨之消失,致使從上偏振片入射的偏振光不旋轉(zhuǎn),光無法通過下偏振片返回,呈黑色。去掉電壓后,液晶分子又恢復(fù)其扭轉(zhuǎn)結(jié)構(gòu)。實驗原理——SMC1602A液晶模塊引腳功能實驗原理——液晶控制器接口說明實驗原理——液晶控制器接口說明實驗原理——液晶控制器接口說明實驗原理——液晶控制器接口說明實驗原理——1602液晶控制器自帶標(biāo)準(zhǔn)字庫每一個字符都有一個固定的代碼,比方“A”的代碼是41H,顯示時模塊把41H中的點陣字符圖形顯示出來,就能看到字母“A”。#include<AT89x52.h>#include<INTRINS.h>#defineucharunsignedchar#defineuintunsignedint#defineDOUTP0sbitrs=P2^0;sbitrw=P2^1;sbite=P2^7;codeuchartab1[]={0x32,0x32,0x34,0x31,0x36,0x36,0x33,0x32,0x30,0x40,0x71,0x71,0x2e,0x63,0x6f,0x6d,0xff,};codeuchartab2[]={0x54,0x65,0x6c,0x3a,0x20, 0X31,0X33,0x30,0x38,0x36,0x34,0x35,0x78,0x78,0x78,0x78,0xff,};//延時函數(shù)voiddelayms(unsignedintms){unsignedchari;while(ms--){for(i=0;i<120;i++);}}參考例如程序〔程序?qū)懺谝粋€C文件中〕//以下為讀忙狀態(tài)的時序程序unsignedcharread_status(void){unsignedcharLCD_Status;DOUT=0xff;rs=0;rw=1;e=1;delayms(1);LCD_Status=DOUT;e=0;returnLCD_Status;}//以下為寫命令的時序程序voidwrite_com(unsignedcharcmd){while((read_status()&0x80)==0x80);rs=0;rw=0;e=0;P0=cmd;e=1;delayms(1);e=0;}//以下為液晶初始化程序voidlcd_ini(void){write_com(0x38);delayms(1);write_com(0x01);delayms(1);write_com(0x06);delayms(1);write_com(0x0c);delayms(1);}//以下為寫數(shù)據(jù)的時序程序voidwrite_dat(unsignedchardat){while((read_status()&0x80)==0x80);rs=1;rw=0;e=0;P0=dat;e=1;delayms(1);e=0;}//以下為主函數(shù)voidmain(void){uchari=0;lcd_ini();write_com(0x80);//設(shè)置第一行數(shù)據(jù)地址指針,為80H+地址碼

delayms(1);while(tab1[i]!=0xff){write_dat(tab1[i]);i++;delayms(1);}i=0;write_com(0xc0);//設(shè)置第二行數(shù)據(jù)地址指針,為80H+地址碼

delayms(1);while(tab2[i]!=0xff){write_dat(tab2[i]);i++;delayms(1);}i=0;while(1);}參考程序://LCD1602.C//液晶控制與顯示程序#include<reg51.h>#include<intrins.h>sbitRS=P2^0;//存放器選擇位,將RS位定義為P2.0引腳sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳sbitEN=P2^2;//使能信號位,將E位定義為P2.2引腳//延時函數(shù)voiddelayms(unsignedintms){unsignedchari;while(ms--){for(i=0;i<120;i++);}}程序可作如下修改,寫法如下://忙檢測函數(shù)unsignedcharbusy_check(void){unsignedcharLCD_Status;//定義忙狀態(tài)變量

RS=0;RW=1;EN=1;delayms(1);LCD_Status=P0;//讀取忙狀態(tài)

EN=0;returnLCD_Status;//返回忙狀態(tài)}//寫命令voidwrite_LCD_Command(unsignedcharcmd){while((busy_check()&0x80)==0x80);//等待忙狀態(tài)結(jié)束

RS=0;RW=0;EN=0;P0=cmd;EN=1;delayms(1);EN=0;}//寫數(shù)據(jù)voidwrite_LCD_data(unsignedchardat){while((busy_check()&0x80)==0x80);RS=1;RW=0;EN=0;P0=dat;EN=1;delayms(1);EN=0;}//初始化voidinit_LCD(void){write_LCD_Command(0x38);//顯示模式設(shè)置

delayms(1);write_LCD_Command(0x01);//清屏

delayms(1);write_LCD_Command(0x06);//字符進入模式:屏幕不動,字符后移

delayms(1);write_LCD_Command(0x0c);//顯示開,關(guān)光標(biāo)

delayms(1);}//顯示字符串voidShowString(unsignedcharx,unsignedchary,unsignedchar*str){unsignedchari=0;//設(shè)置起始位置if(y==0){write_LCD_Command(0x80|x);}if(y==1){write_LCD_Command(0xc0|x);}//輸出字符串for(i=0;i<16;i++){write_LCD_data(str[i]);}}//主函數(shù)voidmain(void){init_LCD();ShowString(0,0,"224166320@qq");ShowString(0,1,"Tel:1308645xxxx");while(1);}根本思路:將一個文件的程序按照其模塊功能劃分為兩個或兩個以上的文件,每個文件表示系統(tǒng)實現(xiàn)特定的功能。如本程序可分為主函數(shù)C文件、液晶顯示C文件、液晶顯示頭文件、includes頭文件。//main.c:#include"includes.h"voidmain(void){init_LCD();ShowString(0,0,"224166320@qq");ShowString(0,1,"Tel:1308645xxxx");while(1);}大型模塊化程序的肇始〔LCD16023.0版〕//lcd1602test.c:#include<reg51.h>#include<LCD1602.h>voidShowString(unsignedcharx,unsignedchary,unsignedchar*str){unsignedchari=0;if(y==0){write_LCD_Command(0x80|x);}if(y==1){write_LCD_Command(0xc0|x);}

for(i=0;i<16;i++){write_LCD_data(str[i]);}}大型模塊化程序的肇始〔LCD16023.0版〕//includes.h:#ifndef__INCLUDES_H__#define__INCLUDES_H__#include<reg51.h>#include<intrins.h>voidShowString(unsignedcharx,unsignedchary,unsignedchar*str);init_LCD();#endif大型模塊化程序的肇始〔LCD16023.0版〕//lcd1602.h:#ifndefLCD_CHAR_1602_2010_11_8#defineLCD_CHAR_1602_2010_11_8sbitRS=P2^0;//存放器選擇位,將RS位定義為P2.0引腳sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳sbitEN=P2^2;//使能信號位,將E位定義為P2.2引腳voiddelayms(unsignedintms){unsignedchari;while(ms--){for(i=0;i<120;i++);}}大型模塊化程序的肇始〔LCD16023.0版〕接上頁://忙檢測函數(shù)unsignedcharbusy_check(void){unsignedcharLCD_Status;//定義忙狀態(tài)變量

RS=0;RW=1;EN=1;delayms(1);LCD_Status=P0;//讀取忙狀態(tài)

EN=0;returnLCD_Status;//返回忙狀態(tài)}//寫命令voidwrite_LCD_Command(unsignedcharcmd){while((busy_check()&0x80)==0x80);//等待忙狀態(tài)結(jié)束

RS=0;RW=0;EN=0;P0=cmd;EN=1;delayms(1);EN=0;}接上頁://寫數(shù)據(jù)voidwrite_LCD_data(unsignedchardat){while((busy_check()&0x80)==0x80);RS=1;RW=0;EN=0;P0=dat;EN=1;delayms(1);EN=0;}//初始化voidinit_LCD(void){write_LCD_Command(0x38);//顯示模式設(shè)置

delayms(1);write_LCD_Command(0x01);//清屏

delayms(1);write_LCD_Command(0x06);//字符進入模式:屏幕不動,字符后移

delayms(1);write_LCD_Command(0x0c);//顯示開,關(guān)光標(biāo)

delayms(1);}#endif上面這個模塊化程序的缺陷:1、將大量實質(zhì)性函數(shù)代碼寫入到lcd1602.h這個頭文件里面,混淆了頭文件區(qū)別于C語言源文件的功能——頭文件應(yīng)為一份接口描述文件,其文件內(nèi)部不應(yīng)包含實質(zhì)性函數(shù)代碼,它就是一份說明書,說明的內(nèi)容就是模塊對外的接口函數(shù)或接口變量,同時包含很重要的宏定義及一些結(jié)構(gòu)體的信息,離開這些信息就無法正常使用接口接口變量。2、includes.h這個頭文件將程序用到的所有頭文件都包含進去,不要在這個文件中再寫入象函數(shù)聲明這樣的語句;而要在這個頭文件中再聲明函數(shù),本身說明模塊化程序的不標(biāo)準(zhǔn)。思路:將此程序按照其模塊功能劃分為主函數(shù)C文件、初始化函數(shù)C文件、液晶顯示C文件、includes頭文件、液晶顯示C文件的頭文件、初始化函數(shù)C文件的頭文件,共6個文件,其中l(wèi)cd1602.h和init.h實現(xiàn)lcd1602test.c和init.c兩個文件和其他文件的連接。//main.c:#include"includes.h"voidmain(void){init_LCD();ShowString(0,0,"224166320@qq");ShowString(0,1,"Tel:1308645xxxx");while(1);}程序修改如下:對3.0版本程序的修正#include<includes.h>//初始化voidinit_LCD(void){write_LCD_Command(0x38);//顯示模式設(shè)置

delayms(1);write_LCD_Command(0x01);//清屏

delayms(1);write_LCD_Command(0x06);//字符進入模式:屏幕不動,字符后移

delayms(1);write_LCD_Command(0x0c);//顯示開,關(guān)光標(biāo)

delayms(1);}//init.c:#include<includes.h>//延時函數(shù)voiddelayms(unsignedintms){unsignedchari;while(ms--){for(i=0;i<120;i++);}}//lcd1602test.c:接上頁://忙檢測函數(shù)unsignedcharbusy_check(void){unsignedcharLCD_Status;//定義忙狀態(tài)變量

RS=0;RW=1;EN=1;delayms(1);LCD_Status=P0;//讀取忙狀態(tài)

EN=0;returnLCD_Status;//返回忙狀態(tài)}//寫命令voidwrite_LCD_Command(unsignedcharcmd){while((busy_check()&0x80)==0x80);//等待忙狀態(tài)結(jié)束

RS=0;RW=0;EN=0;P0=cmd;EN=1;delayms(1);EN=0;}接上頁://寫數(shù)據(jù)voidwrite_LCD_data(unsignedchardat){while((busy_check()&0x80)==0x80);RS=1;RW=0;EN=0;P0=dat;EN=1;delayms(1);EN=0;}//顯示字符串voidShowString(unsignedcharx,unsignedchary,unsignedchar*str){unsignedchari=0;//設(shè)置起始位置if(y==0){write_L

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論