人機(jī)接口電路設(shè)計方案及編程教學(xué)課件名師優(yōu)質(zhì)課賽課一等獎市公開課獲獎?wù)n件_第1頁
人機(jī)接口電路設(shè)計方案及編程教學(xué)課件名師優(yōu)質(zhì)課賽課一等獎市公開課獲獎?wù)n件_第2頁
人機(jī)接口電路設(shè)計方案及編程教學(xué)課件名師優(yōu)質(zhì)課賽課一等獎市公開課獲獎?wù)n件_第3頁
人機(jī)接口電路設(shè)計方案及編程教學(xué)課件名師優(yōu)質(zhì)課賽課一等獎市公開課獲獎?wù)n件_第4頁
人機(jī)接口電路設(shè)計方案及編程教學(xué)課件名師優(yōu)質(zhì)課賽課一等獎市公開課獲獎?wù)n件_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

5.4人機(jī)接口電路設(shè)計及編程第1頁5.4.1鍵盤電路設(shè)計及編程第2頁1.電路鍵盤接口電路如圖5-12所表示,板上擴(kuò)展了一個4×4行列式矩陣鍵盤接口。該鍵盤采取中止掃描方式進(jìn)行工作,行線選取PORTG4~7輸出,列線選取PORTF5~8為輸入。

行線接上拉電阻保持高電平,并經(jīng)過“與”門將輸出信號與MCU中止EXINT0連接; 列線接上拉電阻保持高電平。第3頁第4頁2.編程(1)I/O口和中止初始化①I/O引腳設(shè)置:

rPDATE=0X60; rPCONF=0x2A;列線PORTF5~8為輸入

rPUPF=0x0;列線接上拉電阻

rPDATG=0x0; rPCONG=0x55FF;行線PORTG4~7輸出,

PORTG0作為EXINT0連接

rPUPG=0x0;行線接上拉電阻第5頁②中止初始化

rINTCON=0x5; //非向量模式,IRQ允許,FIQ禁止

rINTMOD=0x0;

//全部IRQ模式

rINTMSK

=~(BIT_GLOBAL|BIT_EINT0);

//EXINT0允許,全部中止屏蔽位允許

pISR_EINT0=(unsigned)keyboard_ISR;

//指定中止服務(wù)程序第6頁(2)程序 將行線PORTG4~7輸出為低電平,當(dāng)有鍵盤按下時,該行線被拉為低電平,使得EXINT0輸入也為低電平,MCU產(chǎn)生中止。 中止產(chǎn)生后經(jīng)過對鍵盤行和列進(jìn)行掃描方法,能夠計算出是哪個鍵按下,并跳到對應(yīng)鍵盤處理程序中去。第7頁

voidkeyboard_ISR(void) { charx,y,xrecord,yrecord,temp; rI_ISPC=BIT_EINT0;

//clearpending_bit Delay(400);

//delay40ms

if((rPDATF&0x1E0)==0x1E0) { return0;

//nokeyboardpress,return }第8頁

else { x=1; y=1; xrecord=(~((rPDATF&0x1E0)>>1)); xrecord=xrecord>>4; while(xrecord!=0x1) //judgerow { x=x+1; xrecord=xrecord>>1;

第9頁

if(xrecord==0) {rPDATG=0X0F; //no,return return0;} }Delay(200); //delay20msrPDATG=0XEF; //inputhigh第10頁

while((rPDATF&0x1E0)==0x1E0) { rPDATG=rPDATG<<1; temp=rPDATG; if((temp&0xf0)==0XF0) //noboardpress,return { rPDATG=0X0F; return0;} }第11頁

Delay(200); //delay10ms yrecord=~((rPDATG&0xF0)>>4)&0x0F; while(yrecord!=0x1) //judgeline{ y=y+1; yrecord=yrecord>>1; if(yrecord==0) { rPDATG=0X0F; //noboardpress,return return0;} }第12頁

Led_Display(x+(y-1)*4-1); Uart_Printf("%3d",x+(y-1)*4-1); Delay(1200); //delay40ms rPDATG=0X0F; }}第13頁5.4.2LCD接口電路設(shè)計及編程第14頁1.LCD接口信號EV44B0II現(xiàn)配有160×240單色顯示器,4比特單掃描。EV44B0II將LCD控制信號線連接到JP6上,與LCD模塊相連,其原理如圖5-13所表示。在LCD模塊上,集成了LCD驅(qū)動器和專門電壓轉(zhuǎn)換電路,用以驅(qū)動LCD屏幕和適配LCD工作電壓。LCD連接器信號定義如表5-4所表示。第15頁第16頁1.LCD接口信號

EV44B0II現(xiàn)配有160×240單色顯示器,4比特單掃描。EV44B0II將LCD控制信號線連接到JP6上,與LCD模塊相連,其原理如圖5-13所表示。在LCD模塊上,集成了LCD驅(qū)動器和專門電壓轉(zhuǎn)換電路,用以驅(qū)動LCD屏幕和適配LCD工作電壓。LCD連接器信號定義如表5-4所表示。第17頁P(yáng)inSignalPinSignalPinSignalPinSignal1VM6VDD11VD216VD72VRAME7GND12VD317TSPX3VLINE8VD413GND18TSMX4VCLKE9VD014VD519TSPY5GPB1010VD115VD620TSMY第18頁2.編程顯示緩沖區(qū)與LCD象素對應(yīng)關(guān)系圖如圖5-14所表示。第19頁第20頁(1)LCD初始化程序通常采取S3C44B0XPORTC口和PPORTD口作為LCD驅(qū)動接口,所以需要設(shè)置它們工作在第3功效狀態(tài),設(shè)置I/O口控制存放器語句以下:

rPDATC=0x8400;

rPCONC=0x5F5FFFFF;

rPUPC=0x33ff; //shouldbeenabled

rPCOND=0xaaaa;

rPUPD=0xff;第21頁LCD初始化程序以下:

voidLcd_MonoInit(void) {

//160x2401bit/1pixelLCD #defineMVAL_USED0 rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);

//disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk, rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);//LINEBLANK=10第22頁

rLCDSADDR1=(0x0<<27)|(((U32)frameBuffer1>>22)<<21)|M5D((U32)frameBuffer1>>1);

//monochrome,LCDBANK,LCDBASEU rLCDSADDR2=M5D((((U32)frameBuffer1+(SCR_XSIZE*LCD_YSIZE/8))>>1))|(MVAL<<21)|(1<<29); rLCDSADDR3=(LCD_XSIZE/16)|(((SCR_XSIZE-LCD_XSIZE)/16)<<9); rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);

//enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk, }第23頁(2)LCD顯示程序LCD顯示程序以下:

#defineframeBuffer10xc400000 externunsignedchar*Buf; voiddisplaylcd(void) { unsignedint*pbuffer,temp_data; inti; pbuffer=(U32*)frameBuffer1;第24頁

for(i=0;i<(4800/4);i++) { temp_data=(Buf[i*4+3]<<24)+(Buf[i*4+2] <<16)+(Buf[i*4+1]<<8)+(Buf[i*4]); pbuffer[i]=~temp_data; Delay(10); } }第25頁(3)LCD清屏程序LCD清屏程序以下:

voidclrscreen(void) { inti,j; unsignedint*pbuffer; pbuffer=(U32*)frameBuffer1; for(i=0;i<4800/4;i++) { pbuffer[i]=0;//(0x0FFFFFFFF); } }第26頁5.4.3觸摸屏電路設(shè)計及編程1.觸摸屏工作原理 觸摸屏按其工作原理不一樣分為表面聲波屏、電容屏、電阻屏和紅外屏幾個。常見又?jǐn)?shù)電阻觸摸屏。如圖5-15所表示,電阻觸摸屏屏體部分是一塊與顯示器表面非常配合多層復(fù)合薄膜,由一層玻璃或有機(jī)玻璃作為基層,表面涂有一層透明導(dǎo)電層,上面再蓋有一層外表面硬化處理、光滑防刮塑料層,它內(nèi)表面也涂有一層透明導(dǎo)電層,在兩層導(dǎo)電層之間有許多細(xì)小(小于千分之一英寸)透明隔離點把它們隔開絕緣。第27頁第28頁

如圖5-16所表示,當(dāng)手指或筆觸摸屏幕時(圖c),日常相互絕緣兩層導(dǎo)電層就在觸摸點位置有了一個接觸,因其中一面導(dǎo)電層(頂層)接通X軸方向5V均勻電壓場(圖a),使得檢測層(底層)電壓由零變?yōu)榉橇?,控制器偵測到這個接通后,進(jìn)行A/D轉(zhuǎn)換,并將得到電壓值與5V相比即可得觸摸點X軸坐標(biāo)為(原點在靠近接地點那端):

Xi=Lx*Vi/V(即分壓原理)同理得出Y軸坐標(biāo),這就是全部電阻觸摸屏共同最基本原理。第29頁第30頁2.觸摸屏電路控制觸摸屏控制采取專用芯片,專門處理是否有筆或手指按下觸摸屏,并在按下時分別給兩組電極通電,然后將其對應(yīng)位置摸擬電壓信號經(jīng)過A/D轉(zhuǎn)換送回處理器.第31頁我們選取GPG口與ADS7843接口。共利用了PG2~PG7口共6條口線。你也能夠選擇其它I/O口,但注意不要與I/O口上已經(jīng)設(shè)定功效(比如串口)相沖突。參考電路圖以下:按照下列圖用導(dǎo)線將兩個模塊連接起來。如圖5-17所表示。第32頁第33頁3.

編程(1)PCONG存放器配置按照以上電路來設(shè)置,PG6和PG5輸入,PG4~PG2輸出,PG7作為中止EINT7且加內(nèi)部上拉電阻,初始化語句以下:rPCONG=0x015f;rPUPG&=0x80;第34頁(2)ADS7843

編程

ADS7843控制字如表5-5所表示,其中S為數(shù)據(jù)傳輸起始標(biāo)志位,該位必為1。A2~A0進(jìn)行通道選擇。

MODE用來選擇A/D轉(zhuǎn)換精度,1--選擇8位,0--選擇12位。

SER/DFR選擇參考電壓輸入模式。

第35頁第36頁

PD1和PD0選擇省電模式:00--為省電模式允許,在兩次A/D轉(zhuǎn)換之間掉電,且中止允許;01同00,只是不允許中止;10保留;11禁止省電模式。

A0~A2用來進(jìn)行開關(guān)切換,如表5-6所表示。第37頁SER/DFR=1時,A0~A2輸入設(shè)置

第38頁我們采取固定參考電壓模式,所以SER/DFR=1。程序中首先探測PENIRQ是否為低電平,假如為高則認(rèn)為觸摸屏沒有接觸;假如探測到PENIRQ為低電平,則認(rèn)為有接觸。利用軟件模擬DIN、DOUT、DCLK上3線串行傳輸時序,將讀取X坐標(biāo)數(shù)值或Y坐標(biāo)數(shù)值控制字串行送入ADS7843,并串行讀出坐標(biāo)值。第39頁①檢測PENIRQ#defineTOUCH_MSR_Y0x9c;//讀Y軸坐標(biāo)命令 #defineTOUCH_MSR_X0xdc;//讀X軸坐標(biāo)命令 …… if((rPDATG&0x80)==0)//PENIRQ電平為低 { //TouchState.pressed=1; _State.Pressed=1;//說明已經(jīng)按下 temp=TOUCH_MSR_X; _State.x=ReadTouch(temp); temp=TOUCH_MSR_Y; _State.y=ReadTouch(temp); ……}第40頁②送控制字并讀取結(jié)果子程序 intReadTouch(unsignedcharcommand) { unsignedchartemp,i,ack,j,k; ack=0;

//PG7<-PENIRQ,PG6<-BUSY,PG5<-DOUT,PG4->CS,PG3->DCLK,PG2->DIN rPDATG&=0xe7; //cs置低;dclk置低 temp=0x80;第41頁 for(i=0;i<8;i++) //發(fā)送1個字節(jié) { if(command&temp) //將控制字分解為位 rPDATG|=0x04; //將din置1 else rPDATG&=0xfb; //將din清0 rPDATG|=0x08; //置高dclk delay(2); rPDATG&=0xf7; //去除dclk,1位送出 delay(2); temp=temp>>1; //移位 }第42頁 while((temp=(rPDATG&0x40))==0);等候BUSY變低 rPDATG&=0xdf;//din清零

//再1個時鐘以后開始接收數(shù)據(jù) rPDATG|=0x08; //置高dclk delay(2); rPDATG&=0xf7; //清零dclk delay(2);第43頁 for(i=0;i<7;i++)取得前7位坐標(biāo)數(shù)據(jù)(高位在前) { rPDATG|=0x08; //置高dclk if(temp=rPDATG&0x20) //取得din上1位數(shù)據(jù) ack+=1; ack=ack<<1; delay(2); rPDATG&=0xf7; //清零dclk delay(2); } rPDATG|=0x08; //置高dclk第44頁 if(temp=rPDATG&0x20) //接收最終1位 ack+=1; delay(2); rPDATG&=0xf7; //清零dclk rPDATG|=0x10; //置高cs returnack; //返回接收結(jié)果 }第45頁4.觸摸屏與顯示器配合

ADS7843送回控制器X與Y值僅是對當(dāng)前觸摸點電壓值A(chǔ)/D轉(zhuǎn)換值,它不含有實用價值。這個值大小不但與觸摸屏分辨率相關(guān),而且也與觸摸屏與LCD貼合情況相關(guān)。而且,LCD分辨率與觸摸屏分辨率普通來說是不一樣,坐標(biāo)也不一樣。所以,假如想得到表達(dá)LCD坐標(biāo)觸摸屏位置,還需要在程序中進(jìn)行轉(zhuǎn)換。第46頁假設(shè)LCD分辨率是320×240,坐標(biāo)原點在左上角;觸摸屏分辨率是900×900,坐標(biāo)原點在左上角,則轉(zhuǎn)換公式以下:

xLCD=[320*(x-x2)/(x1-x2)]; yLCD=[240*(y-y2)/(y1-y2)];第47頁 假如坐標(biāo)原點不一致,比如LCD坐標(biāo)原點在右下角,而觸摸屏原點在左上角,則還能夠進(jìn)行以下轉(zhuǎn)換:

xLCD=320-[320*(x-x2)/(x1-x2)]; yLCD=240-[240*(y-y2)/(y1-y2)]; 最終得到值,便能夠盡可能得使LCD坐標(biāo)與觸摸屏坐標(biāo)一致,這么,更含有實際意義。第48頁5.4.48段數(shù)碼管電路設(shè)計及編程1.電路設(shè)計 系統(tǒng)使用了一個8段數(shù)碼LED,如圖2-18所表示。該數(shù)碼管是共陽極,低電平信號使LED點亮。CPU數(shù)據(jù)總線DATA(0~7)經(jīng)74LS573驅(qū)動器對數(shù)碼管進(jìn)行驅(qū)動。其片選信號由CPUnGCS3信號選通,而8段內(nèi)容則由CPU低8位數(shù)據(jù)線決定。口地址為0x6000000。第49頁第50頁2.

編程

8段數(shù)碼管顯示程序以下: voidLed_Display(unsignedchardata) { unsignedchar*ledbuffer=(unsignedchar*)0x6000000 switch(data){ case0: *ledbuffer=0x12; break; ... case0xf: *ledbuffer=0x68; break;}}第51頁5.5串行接口電路設(shè)計及編程第52頁5.5.1串行電路接口 串行接口電路如圖5-19所表示。系統(tǒng)提供兩個RS232標(biāo)準(zhǔn)串行接口(DB9),UART0/l可與PC或MODOM進(jìn)行串行通信。 PORTC10~15分別作為nRTS1、nCTS1、TXD1、RXD1、nRTS0和nCTS0信號,PE1和PE2作為TXD0和RXD0信號。兩個接口則采取兩片MAX2322C作為電平轉(zhuǎn)換器。第53頁第54頁

5.5.2編程1.I/O接口配置初始化

對PORTC和PORTE初始化語句以下: rPCONC=0x0f000000|rPCONC; rPUPC=0x3000; //設(shè)置內(nèi)部上拉 rPCONE=(rPCONE&0xfc3)|0xeb; rPUPE=0x6;2.UART初始化 對UART口進(jìn)行初始化設(shè)置程序以下:第55頁 staticintUartNum=0; voidmyUart_Init(intwhichuart,intbaud)

//設(shè)置串口波特率等初始化工作。 { if(whichuart==0) { UartNum=0; rUFCON0=0x0; //不使用FIFO rUMCON0=0x0; //不使用自動流控制

rULCON0=0x3;

//不采取紅外線傳輸模式,無奇偶校驗 位,1個停頓位, //8個數(shù)據(jù)位第56頁 rUCON0=0x245;

//發(fā)送中止為電平方式,接收中止為 邊緣方式,禁止超時 //中止,允許產(chǎn)生錯誤狀態(tài)中止,禁止回 送模式,禁止中 //止信號,傳輸模式為中止請求模式,接 收模式也為中止 //請求模式。

rUBRDIV0=((int)(MCLK/16./baud+0.5)-1);

//依據(jù)波特率計算UBRDIV0值

}第57頁 elseif(whichuart==1) { UartNum=1; rUFCON1=0x0; rUMCON1=0x0; rULCON1=0x3; rUCON1=0x245; rUBRDIV1=((int)(MCLK/16./baud+0.5)-1); }}第58頁3.字符發(fā)送程序#defineWrUTXH0(ch)(*(volatileunsignedchar*)0xld00020)=(unsignedchar)(ch)#defineWrUTXH0(ch)(*(volatileunsignedchar*)0xld04020)=(unsignedchar)(ch)VoidmyUart_SendByte(charch){if(UartNum==0){if(ch==“\n”){while(!(rUTRSTAT0&0x2));//等候,直到發(fā)送緩沖區(qū)為空Delay(10);//超級中止響應(yīng)速度較慢WrUTXH0(“\r”);//發(fā)送回車符}while(!(rUTRSTAT0&0x2));//等候,知道發(fā)送緩沖區(qū)為空Delay(10);WrUTXH0(ch);//發(fā)送字符}第59頁

else{if(ch==“\n”){while(!(rUTRSTAT1&0x2));Delay(10);

//因為超級終端響應(yīng)較慢

rUTXH1=“\r”;}While(!(rUTRSTAT1&0x2));//等候THR空。Delay(10);WrUTXH1(ch);}}第60頁字符接收程序#defineRdURXH0()(*(volatileunsignedchar*)(0xld00027))#defineRdURXH1()(*(volatileunsignedchar*)(0xld04027))CharUart_Getch(void){if(whichUart==0)//串口0{while(!(rUTRSTAT0&0x1));//讀出接收到數(shù)據(jù)(一直到讀完)returnRdURXH0();//URXH0:UART0接收緩沖存放器}else//串口1{while(!(rUTRSTAT1&0x1));//ReceivedatareadyreturnrURXH1;}}第61頁5.6ⅡC接口電路設(shè)計及編程第62頁5.6.1EEPROM芯片介紹第63頁 當(dāng)前,通用存放器芯片多為EEPTOM,其慣用協(xié)議主要有兩線串行連接協(xié)議(ⅡC)和三線串行連接協(xié)議。帶ⅡC總線接口EEPROM有許多型號,其中AT24Cxx系列使用十分普遍,產(chǎn)品包含AT2401/02/04/08/16等,其容量(字節(jié)數(shù)×頁)分別為128×8/256×8/512×8/1024×8/2048×8,適合用于2~5V低電壓操作,含有低功耗和高可靠性等優(yōu)點。第64頁

AT24系列存放器芯片采取CMOS工藝制造,內(nèi)置有高壓泵,可在單電壓供電條件下工作。其標(biāo)準(zhǔn)封裝為8引腳DIP封裝形式,如圖5-20所表示。第65頁第66頁1.SCL串行時鐘。遵照ISO/IEC7816同時協(xié)議;漏極開路,需接上拉電阻;在該引腳上升沿,系統(tǒng)將數(shù)據(jù)輸入到每個EEPROM器件,在下降沿輸出。2.SDA雙向串行數(shù)據(jù)線,漏極開路,需接上拉電阻,可與其它開路器件“線或”。第67頁3.A0、A1、A2器件/頁面尋址地址輸入端。在AT24C01/02中,引腳被硬連接。其它AT24Cxx均可接尋址地址線。4.WP讀/寫保護(hù)。接低電平時可對整片空間進(jìn)行讀/寫;接高電平時不能對受保護(hù)區(qū)進(jìn)行讀/寫。5.VCC/GND+5V工作電壓。第68頁5.6.2EEPROM讀/寫操作1.AT24C04結(jié)構(gòu)與應(yīng)用簡述AT24C04由輸入緩沖器和EEPROM陣列組成。因為EEPROM半導(dǎo)體工藝特征寫入時間為5~10

ms,假如從外部直接寫入EEPROM,則每寫一個字節(jié)都要等候5~10ms,成批數(shù)據(jù)寫入時就要等候更長時間。含有SRAM輸入緩沖器EEPROM器件,其寫入操作變成對SRAM緩沖器裝載。裝載完后開啟一個自動寫入邏輯將緩沖器中全部數(shù)據(jù)一次寫入EEPROM陣第69頁對緩沖器輸人稱為頁寫,緩沖器容量稱為頁寫字節(jié)數(shù)。AT24C04頁寫字節(jié)數(shù)為8,占用最低3位地址。當(dāng)寫入不超出頁寫字節(jié)數(shù)時,對EEPROM器件寫入操作與對SRAM寫入操作相同;當(dāng)超出頁寫字節(jié)數(shù)時,應(yīng)等候5~10ms后再開啟一次寫操作。因為EEPROM器件緩沖區(qū)容量較小(只占據(jù)最低3位),且不具備溢出進(jìn)位檢測功效,所以,從非零地址寫入8個字節(jié)數(shù)或從零地址寫入超出8個字節(jié)數(shù)會形成地址翻卷,造成寫入犯錯。第70頁2.設(shè)備地址(DADDR)

AT24C04xx器件地址是1010。第71頁3.AT24Cxx數(shù)據(jù)操作格式在IIC總線中,對AT24C04內(nèi)部存放單元讀/寫,除了要給出器件設(shè)備地址(DADDR)外,還須指定讀/寫頁面地址(PADDR)。二者組成操作地址(OPADDR)以下:1010A2A1–R/W(“–”為無效)系統(tǒng)中引腳A2A1A0為000,所以,系統(tǒng)可尋址AT24C04全部頁面,共4K位。按照AT24C04器件手冊讀/寫地址(ADDR=1010A2A1–R/W)中數(shù)據(jù)操作格式以下:第72頁(1)寫入操作格式任意寫一個字節(jié)到地址ADDR_W,其時序圖如圖5-21所表示,寫入操作格式為:

START_COPADDR_WACKADDR_WACKdataACKSTOP_C第73頁第74頁從地址ADDR_W起連續(xù)寫人n個字節(jié)(同一頁面),其時序圖如圖5-22所表示,寫人格式為:

START_COPADDR_WACK ADDR_WACKdata1ACKdata2 ACK...datanACKSTOP_C第75頁第76頁(2)讀出操作格式 從任意地址ADDR_R讀一個字節(jié)時序圖如圖5-23所表示,讀出操作格式為:START_COPADDR_WACKADDR_RACKOPADDR_RACKdataSTOP_C第77頁第78頁從地址ADDR_R起連續(xù)讀出n個字節(jié)(同一頁面),其時序圖如圖5-24所表示,讀出操作格式為:

START_COPADDR_RACKdata1ACKdata2ACK...datanACKSTOP_C第79頁第80頁在讀任意地址操作中,除了發(fā)送讀地址外,還要發(fā)送頁面地址(PADDR);所以,在連續(xù)讀出72個字節(jié)操作前,要進(jìn)行1個字節(jié)PADDR寫入操作,然后重新開啟讀操作。注意,讀操作完成后沒有ACK。第81頁5.6.3編程1.I/O

端口IIC

功效設(shè)置 我們采取PF0口和PF1口工作在第2功效模式下,分別作為IIC總線SCL和SDA與24LC04B相連。所以,需要設(shè)置PF0和PF1工作在第2功效模式下。采取以下語句:rPCONF|=0xa;//PF0:IICSCL,PF1:IICSDArPUPF|=0x3;//pull-updisable第82頁2.IIC中止使能 因為是采取中止方式了解每個字節(jié)傳輸是否成功。所以需要定義中止處理程序入口,而且使能中止。采取以下語句實現(xiàn):pISR_IIC=(unsigned)IIC_Int;

//將IIC中止處理程序指針指向IIC_IntrINTMSK=~(BIT_GLOBAL|BIT_IIC);

//使能中止第83頁3.初始化IIC接口 對IICCON進(jìn)行設(shè)置:rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);

//使能ACK產(chǎn)生,IICCLK=MCLK/16,使能發(fā)送/接收中止,去除pending位方便響應(yīng)//中止,Txclock=(64MHz/16)/(15+1)=250KHz第84頁4.向24LC04B中寫入數(shù)據(jù)子程序

#defineIICBUFSIZE0x20 U8_iicData[IICBUFSIZE]; //寫數(shù)據(jù)緩存 volatileint_iicDataCount; //數(shù)據(jù)長度 volatileint_iicStatus; volatileint_iicMode; int_iicPt;第85頁voidWr24LCxx(U32slvAddr,U32addr,U8data){_iicMode=WRDATA;//寫數(shù)據(jù)模式_iicPt=0;_iicData[0]=(U8)addr;//字節(jié)寫入模式,數(shù)據(jù)格式 參考教材內(nèi)容_iicData[1]=data;_iicDataCount=2;rIICDS=0xa0;//控制字節(jié)rIICSTAT=0xf0;//主設(shè)備發(fā)送模式,產(chǎn)生起 始條件,使能發(fā)送/接收while(_iicDataCount!=-1);_iicMode=POLLACK;第86頁while(1){rIICDS=slvAddr;_iicStatus=0x100;rIICSTAT=0xf0; //MasTx,StartrIICCON=0xaf; //resumesIICoperation.while(_iicStatus==0x100);if(!(_iicStatus&0x1)) break; //成功接收到ACK}rIICSTAT=0xd0; //產(chǎn)生停頓條件rIICCON=0xaf; //釋放IIC操作Delay(1); //等候,直到停頓條件起作用,寫入成功}第87頁 5.從24LC04B讀出數(shù)據(jù)子程序 voidRd24LCxx(U32slvAddr,U32addr,U8*data) { _iicMode=SETRDADDR; _iicPt=0; _iicData[0]=(U8)addr; _iicDataCount=1; rIICDS=slvAddr; rIICSTAT=0xf0; //MasTx,Start第88頁 while(_iicDataCount!=-1); _iicMode=RDDATA; _iicPt=0; _iicDataCount=1; rIICDS=slvAddr; rIICSTAT=0xb0; //MasRx,Start rIICCON=0xaf; //resumesIICoperation. while(_iicDataCount!=-1); *data=_iicData[1]; }第89頁 6.IIC中止處理子程序 void__irqIIC_Int(void) { U32iicSt,i; rI_ISPC=BIT_IIC;//去除pending位 iicSt=rIICSTAT;//讀入IIC總線單前狀態(tài),以 便進(jìn)行各種錯誤處理 if(iicSt&0x8){} //whenbusarbitrationisfailed. if(iicSt&0x4){} //whenaslaveaddressis matchedwithIICADD if(iicSt&0x2){} //whenaslaveaddressis 0000000b if(iicSt&0x1){} //whenACKisn'treceived第90頁 switch(_iicMode) //依據(jù)當(dāng)前操作模式進(jìn)行對應(yīng)處理 { casePOLLACK: //等候ACK模式 _iicStatus=iicSt; //讀入IICSTAT,第0位表示是否 接收到ACK break; caseRDDATA: //讀數(shù)據(jù)模式 if((_iicDataCount--)==0) //只要讀取1字節(jié)數(shù)據(jù) { _iicData[_iicPt++]=rIICDS; rIICSTAT=0x90; //停頓主設(shè)備讀取模式

rIICCON=0xaf; //釋放IIC操作

Delay(1); //等候直到停頓條件起作用

break; }

第91頁_iicData[_iicPt++]=rIICDS;

//未讀完全部數(shù)據(jù)最終一個字節(jié)不能產(chǎn)生ACK if((_iicDataCount)==0)//假如讀完了全部數(shù)據(jù)(最終一個字節(jié))

rIICCON=0x2f;//產(chǎn)生NOACK.釋放IIC操作 else rIICCON=0xaf;//產(chǎn)生ACK釋放IIC操作 break; caseWRDATA://寫數(shù)據(jù)模式 if((_iicDataCount--)==0)//假如數(shù)據(jù)寫完 {

rIICSTAT=0xd0;//停頓主設(shè)備發(fā)送傳輸

rIICCON=0xaf;//恢復(fù)IIC操作

Delay(1);//等候,直到停頓條件起效

break; }第92頁

rIICDS=_iicData[_iicPt++];//_iicData[0]hasdummy. for(i=0;i<10;i++); //forsetuptimeuntilrisingedgeofIICSCL rIICCON=0xaf; //釋放IIC總線操作 break; caseSETRDADDR: //設(shè)置讀地址模式

//Uart_Printf("[S%d]",_iicDataCount);第93頁 if((_iicDataCount--)==0) { break;

//IICoperationisstoppedbecauseofIICCON[4] } rIICDS=_iicData[_iicPt++] for(i=0;i<10;i++);

//forsetuptimeuntilrisingedgeofIICSCL rIICCON=0xaf; //釋放IIC總線操作 break; default: break; } }第94頁5.7其它接口電路設(shè)計及編程第95頁5.7.1定時器編程讓定時器0TOUT0引腳輸出頻率為16K,占空比為30%PWM脈沖調(diào)制波形;定時約0.5秒后產(chǎn)生定時中止。第96頁1.定時器初始化(1)I/O

口設(shè)置采取以下語句對PE口工作方式進(jìn)行設(shè)置,使之工作在定時器輸出狀態(tài): rPCONE=0xaaa8;//Tout0/1/2/3/4,RxD0,TxD0 rPUPE|=0xf8;(2)定時器時鐘源頻率設(shè)置 經(jīng)過以下語句來設(shè)置定時器時鐘源: rTCFG0=0x1010101;//預(yù)分頻值為1 rTCFG1=0x01;//分割百分比=1/4 經(jīng)過設(shè)置后,定時器時鐘源頻率=(MCLK/1)/4第97頁(3)設(shè)置輸出波形頻率 經(jīng)過以下語句來設(shè)置輸出波形頻率: rTCNTB0=1000;經(jīng)過設(shè)置,輸出PWM波形頻率為MCLK/4000;因為系統(tǒng)采取MCLK=64M,所以,PWM波形頻率為16K。(4)設(shè)置占空比經(jīng)過以下語句來設(shè)置輸出波形占空比: rTCMPB0=300;針對試驗要求:300/1000=30%第98頁

(5)設(shè)置定時器控制存放器、開啟定時器 rTCON=0xaaaa0a;

//自動重載模式,關(guān)閉反轉(zhuǎn)功效,手動更 新,關(guān)閉死區(qū) rTCON=0x999909;

//開啟PWM操作 定時器開啟后,能夠采取示波器觀察TOUT0輸出波形,是否滿足要求。第99頁2.定時器中止主程序

參考程序以下: volatileintvariable0; voidTest_TimerInt(void) { rINTMSK=~(BIT_GLOBAL|BIT_TIMER0) pISR_TIMER0=(int)Timer0Done;

//修改中止處理函數(shù)指針 rTCFG0=0x00f;

//deadzone=0,pre0=0xf//設(shè)定時鐘源頻率 rTCFG1=0x04;//allinterrupt,mux0=1/32 rTCNTB0=0xffff;//(1/(64MHz/15/32))*0xffff=0.49s第100頁 rTCON=0x02;

//手動更新timer0設(shè)置 rTCON=0x01; //T0=oneshot,開啟定時器 while(variable0==0); //等候中止發(fā)生 rTCON=0x0;

//停頓定時器 rINTMSK=BIT_GLOBAL; //關(guān)閉中止 }第101頁 3.定時中止服務(wù)程序 void__irqTimer0Done(void) { rI_ISPC=BIT_TIMER0; //清中止pending位 variable0++; //更新變量 }第102頁5.7.2實時日歷時鐘RTC1.電路

如圖5-25為32.768KHZ晶振電路連接示例:第103頁第104頁

2.編程 (1)實時時鐘初始化 初始化示例程序以下: #defineTESTYEAR0x99 #defineTESTMONTH0x12 #defineTESTDAY0x31 #defineTESTDATE0x06 //星期五 #defineTESTHOUR0x23 #defineTESTMIN0x59 #defineTESTSEC0x30第105頁 voidRtc_Init(void) { rRTCCON=0x01; //讀寫使能,1/32768,

Normal(merge),Noreset rBCDYEAR=TESTYEAR; rBCDMON=TESTMONTH; rBCDDAY

溫馨提示

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

最新文檔

評論

0/150

提交評論