電子電路設(shè)計實驗報告_第1頁
電子電路設(shè)計實驗報告_第2頁
電子電路設(shè)計實驗報告_第3頁
電子電路設(shè)計實驗報告_第4頁
電子電路設(shè)計實驗報告_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、電子線路專題實驗一、實驗要求:1. 認真閱讀學(xué)習(xí)系統(tǒng)線路及相關(guān)資料2. 將鍵盤陣列定義為0. 1. 2- E. F,編程實現(xiàn)將鍵盤輸入內(nèi)容顯示在LCD顯示器上。3. 編程實現(xiàn)將日歷、時鐘顯示在LED顯示屏上(注意仔細閱讀PCF8563資料),日歷、時鐘輪回顯示。4. 利用D/A轉(zhuǎn)換通道(下行通道)實現(xiàn)鋸齒波發(fā)生器;輸出(15V)固定電壓轉(zhuǎn)換成(420mA)電流。5. 利用A/D轉(zhuǎn)換通道(上行通道)實現(xiàn)數(shù)據(jù)采集,將采集信號顯示在LED屏上。程序要求分別具有平均值濾波、中值濾波和滑動濾波功能。6. 將按鍵陣列定義成與16個語音段對應(yīng),編寫程序,實現(xiàn)按鍵播放不同的語音段。二、實驗設(shè)計思路:本次實驗用

2、c語言實現(xiàn),主要包括LCD,LED,AD,DA,日歷芯片,測溫傳感芯片。受到嵌入式系統(tǒng)實驗的啟發(fā),將LCD,LED,I2C總線協(xié)議,鍵盤掃描模塊接口寫成一個文件庫(放在library文件夾下),盡量做到調(diào)用時與底層硬件無關(guān)。通過調(diào)用庫文件中的函數(shù),實現(xiàn)代碼的重用性。鍵盤,LCD的代碼由于與嵌入式實驗具有相通之處,因此可將高層的函數(shù)(與底層硬件無關(guān)的函數(shù))方便地移植過來。三、實驗設(shè)計:1.矩陣鍵盤掃描模塊4×4的矩陣鍵盤,通過掃描可得到按下鍵的行列值,將行列值轉(zhuǎn)換為相應(yīng)的對應(yīng)數(shù)字0F。函數(shù)GetKey()實現(xiàn)獲得按鍵的鍵值。對于鍵盤模塊對于對按鍵的鍵值識別主要是通過兩次掃描而取得。對于

3、第一次掃描,給四行鍵全部賦予1,然后讀回鍵盤值,對于第二次掃描,逐行為鍵盤送1,每次送1后再讀回鍵盤值,若非零,說明此行有鍵按下,最終確定鍵值。通過調(diào)用GetKey函數(shù)構(gòu)造GetChar()函數(shù),實現(xiàn)獲取鍵盤字符(0F)的功能。通過調(diào)用GetChar()函數(shù)構(gòu)造GetDec()函數(shù),實現(xiàn)獲取鍵盤輸入整數(shù)的功能,整數(shù)范圍在099999。有按C鍵回退一格,按E清空當前未完輸入,按F鍵結(jié)束輸入的功能。程序代碼:/鍵盤初始化,將標志位置1;void Key_Init(void) bKeyUp_Flag=1;/標志(全局變量)位置1/鍵盤掃描函數(shù),得到鍵的行列位置;unsigned char GetSc

4、anKey(void)unsigned char key, i, temp;unsigned char xdata * ptr;key=0xff;for (i=1; i<0x10; i<<=1)/i的低4位為行數(shù)位,行依次檢測循環(huán)4次ptr=0x8fff; * ptr =i;temp = * ptr; /取鍵盤IO口的值temp &= 0x0f; /屏蔽高四位if (temp!=0x00) /是否有有效鍵值 key = i<<4; /取行數(shù)位的值并將其放入返回值高4位key|=temp; /列數(shù)位的值放入返回值低4位break;return key; /返

5、回行位(高四)和列位(低四)/取鍵值,長按無效unsigned char GetKey(void)unsigned char key, temp;if (!bKeyUp_Flag)/判斷標志,是0執(zhí)行/*按鍵程序執(zhí)行一次后會將bKeyUp_Flag標志位清零,執(zhí)行此段程序,長按鍵無效返回?zé)o效值,直至按鍵無效返回?zé)o效按鍵值,置"1"標志位。按鍵輸入恢復(fù)有效。屏蔽這部分則長按鍵有效*/key=GetScanKey();if (key=0xff)/沒有按鍵,置標志位bKeyUp_Flag=1;else/保持按鍵return 0xff;/因為0xff大于15,故為無效鍵值,實現(xiàn)長按

6、鍵無效key=GetScanKey();if (key=0xff)/沒有按鍵return key;else/有按鍵有效temp=key;/取鍵值Delay_ms(20);/延時20ms 消抖key=GetScanKey();/鍵盤掃描if(key!=temp)/判斷兩次鍵值是否相同,排除干擾信號影響確認有效信號key=0xff;return key;else/取鍵值 /*這部分主要作用是軟件抗干擾*/temp=Key_Value_Tablekey>>4;/見說明 /*行值有效位(鍵盤的4個行SEL返回的值含有的有效位"1")有且只有一位鍵值才有效否則返回?zé)o效鍵值

7、*/if (temp=0xff) key=0xff;return key; temp=Key_Value_Tablekey&0x0f; /*列值有效位(鍵盤的4個列RL返回的值含有的有效位"1")有且只有一位鍵值才有效否則返回?zé)o效鍵值*/if (temp=0xff) key=0xff;return key; key=Key_Value_Tablekey>>4*4+Key_Value_Tablekey&0x0f;/行對應(yīng)的中間值的四倍與列對應(yīng)的中間值之和即為按鍵編號015 /*行列組合后的值大于15無效*/if (key>15) key=0x

8、ff;return key; bKeyUp_Flag=0;return key; /獲得鍵盤輸入字符int GetChar(void)unsigned char key=0xff;while(key=0xff)key=GetKey();/* wait input fix*/return (int)key_arrengekey);/* change to ASCII code and return*/獲得鍵盤輸入整數(shù)long GetDec(void)long out_dec = 0;/* result(decimal number) 數(shù)值范圍099999*/unsigned char i,j;/

9、* variable for character count*/int temp = 0;int key;for(i = 0;i<6 ; )key =GetChar();/* 獲取鍵值09 */if(key<='9')&&(key >= '0')temp = key - '0'/* 獲取數(shù)值0-9 */out_dec = out_dec * 10 + (long)temp;if(out_dec = 0)continue;/* 首位數(shù)據(jù)輸入為0時,顯示不變 */i+;LCD_putchar(key);/* 顯示當前

10、輸入的數(shù)據(jù) */continue;if('E'= key) /* 當前輸入清零 */out_dec = 0;back_cursol(i); /* 清顯示區(qū) */for(j=0;j<i;j+)LCD_putchar(' ');back_cursol(i);/* 清顯示區(qū) */continue;if('F' = key) /* ENTER鍵,數(shù)值確認 */return out_dec;if('C' = key)/* 撤銷最近一個輸入數(shù)字*/out_dec = out_dec / 10;back_cursol(1);LCD_put

11、char(' ');back_cursol(1);continue;2. LED模塊通過送字形碼和字位碼可以點亮對應(yīng)的一個8段LED。8個LED的同時顯示通過循環(huán)掃描顯示實現(xiàn),即每次在一個LED上顯示設(shè)定的數(shù)字,延時顯示一段時間(延時越長,亮度越好),然后切換顯示下一個,依次輪換。程序代碼:unsigned char Led_table16=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void Delay_us1(int t)while(t->=0);/函數(shù)

12、功能描述:給顯示數(shù)組賦初始值;void Led_Init(unsigned char *show)unsigned char i;for (i=0;i<8;i+) /在此處給顯示數(shù)組賦值 *show= 0x00;show+;/函數(shù)功能描述:在LED上顯示;void display(unsigned char *show)unsigned char i=1,j;unsigned char xdata *ptr;for (j=0; j<8; j+)/八個數(shù)碼管全部顯示 ptr=0x8fff;/段選地址 *ptr=i;ptr=0x9fff;/位選地址/在此給*ptr賦值送字形碼*ptr=

13、Led_tableshowj;Delay_us1(30); *ptr=0x00;i<<=1;/下一位/數(shù)字轉(zhuǎn)led字形碼unsigned char asc2led(unsigned char a)return *(Led_table+a);3. LCD顯示模塊設(shè)計思路:LCD的顯示通過給LCD寫命令和數(shù)據(jù)實現(xiàn)。寫數(shù)據(jù)與寫指令時各控制引腳的電平不同,對應(yīng)了不同的地址。先構(gòu)造寫數(shù)據(jù)和寫命令函數(shù)(與硬件相關(guān)操作),已經(jīng)檢測LCD是否忙的函數(shù)(當處于忙狀態(tài)時不能寫數(shù)據(jù),否則硬件會工作不正常),在此接口的基礎(chǔ)上構(gòu)造庫(與硬件無關(guān)操作,通過調(diào)用寫數(shù)據(jù)和寫命令函數(shù)實現(xiàn)),實現(xiàn)各種不同的功能,包括

14、初始化設(shè)定工作方式,顯示字符,顯示字符串,顯示數(shù)字(099999),清屏,設(shè)定光標的位置等。這里的顯示字符,顯示整數(shù)和鍵盤檢測模塊的讀入字符,讀入整數(shù)對應(yīng)起來,可以合作使用。使用時先調(diào)用初始化函數(shù)初始化LCD,設(shè)定工作方式,然后可以調(diào)用不同的函數(shù)實現(xiàn)不同的顯示。程序代碼:/*=define variable =*/unsigned char cursol_x;/* cursor position (horizontal) */unsigned char cursol_y;/* cursor positon (vertical) */unsigned char xdata *ptr;/指向XDA

15、TA的指針(訪問片外地址)unsigned char code ASC2_Value_Table16=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46;/=向1602指令寄存器寫指令=void WriteW(unsigned char a) ptr=0xAFF0; /RS=0,R/W=0*ptr=a;/=向1602指令寄存器寫指數(shù)據(jù)=void WriteD(unsigned char key_asc2)CheckBF();ptr=0xAF02; *ptr=key_asc2;/=檢查忙標

16、志位BF=void CheckBF(void)unsigned int i;while(1) ptr=0xAFF1;/RS=0,R/W=1 i=*ptr;i&= 0x80;if(i=0)break;/=LCD初始化=void LCD_Init(void)CheckBF();WriteW(0x38);CheckBF();WriteW(0x01);/Clear display 清顯示CheckBF();WriteW(0x06);/Entry mode set:I/D=1,S=0 I:Increase,D:Decline,S:ShiftCheckBF();WriteW(0x0F);/Disl

17、pay on/off control D=1,C=1,B=1D:Display,C:Cursor,B:BlinkCheckBF();WriteW(0x80);/Dislpay on/off control D=0,C=0,B=0D:Display,C:Cursor,B:Blink/=設(shè)定光標所在位置=voidLCD_setcursol(unsigned char x, unsigned char y)cursol_x = x;/* cursor position (horizontal) */cursol_y = y;/* cursor positon (vertical) */CheckBF

18、();/* wait LCD process */WriteW(0x80| y*0x40 + x);/*address of the second line 0x40-0x4f */=后移光標=voidmove_cursol(void)if(+cursol_x > 0x0f)/* move cursor to right, if get to end of the line */cursol_x = 0;/* move to begin of the line */if(+cursol_y >= 2)/* return, if over the second line */curs

19、ol_y = 0;/* return to begin of the line */LCD_setcursol(cursol_x, cursol_y);/* set cursor */=前移光標=voidback_cursol(int i)cursol_x -= i;LCD_setcursol(cursol_x, cursol_y);/* set cursor */=清屏=void LCD_clear(void)CheckBF();/* wait LCD process */WriteW(0x01);/* clear display */=寫字符=voidLCD_putchar(int c)i

20、f(c = 'n')|(c = 'r')/* line feed code*/cursol_x = 0;cursol_y = 1;LCD_setcursol(cursol_x, cursol_y);/* set cursor*/CheckBF();/* wait LCD process*/WriteD(c);/* write Data-Register*/CheckBF();/* wait LCD process*/move_cursol();/* move cursor position*/=寫字符串=voidLCD_puts(const unsigned c

21、har *s)for(; '0' != *s; s+)/* loop before null code */LCD_putchar(*s);/* display character on LCD */=寫整數(shù)=voidLCD_putdec(long dec) /* 可打印的數(shù)據(jù)小于99999 */long num ;/* number to be displayed*/int i;/* loop counter*/unsigned char str_buf5;/* buffer for data display*/num = dec;/* save number to be d

22、isplayed */for(i = 0 ;num != 0; i+)/* confirm digit*/str_bufi = num % 10;/* get every digit number and save in buffer*/num= num / 10;if(i = 0)/* if number is 0*/LCD_putchar('0');/* display '0' in LCD*/else/* if number is not 0*/for(-i; i >= 0; i-)/* loop times of digits*/LCD_putch

23、ar(str_bufi + '0');/* after transfered into ASCII code*/* display in LCD*/ /十六進制碼轉(zhuǎn)換為ascii碼unsigned char Key_ASC2(unsigned char key)unsigned char key_asc2;key_asc2=ASC2_Value_Tablekey;return key_asc2;4.I2C總線協(xié)議I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號,它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。 

24、; 開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。  結(jié)束信號:SCL為低電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。  應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。協(xié)議代碼:sbit SCL=P10;sbit SDA=P11;/*/*功能:啟動I2C總線/*void i2c_start() SDA=1;SCL=1;_n

25、op_();_nop_();SDA=0;_nop_();_nop_();SCL=0;/*/*功能:停止I2C總線/*void i2c_stop()SDA=0;SCL=0;_nop_();_nop_();SCL=1; _nop_();_nop_();SDA=1;/*/*功能:應(yīng)答I2C總線/*bit i2c_rec_ack()bit ack_flag;SDA=1;_nop_();_nop_();SCL=1;_nop_();_nop_();if(SDA=0)ack_flag=1;elseack_flag=0;SCL=0;returnack_flag; void i2c_send_ack(void)

26、SDA=0;_nop_();_nop_();SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();SDA=1;/*/*功能:無應(yīng)答I2C總線/*void i2c_send_noack()SDA=1;_nop_();_nop_();SCL=1; _nop_();_nop_();SCL=0;/*/*功能:往I2C總線發(fā)送數(shù)據(jù)/*void i2c_send_byte(unsigned char data_byte)unsigned char i;for(i=0;i<8;i+)SDA=(bit)(data_byte&0x80);_nop_();_nop_

27、();SCL=1;_nop_();_nop_();SCL=0;data_byte<<=1;/*/*功能:從I2C總線接受數(shù)據(jù)/*unsigned char i2c_rec_byte()unsigned char i, temp;temp=0;for(i=0;i<8;i+)temp<<=1;SCL=1;_nop_();_nop_();if(SDA=1)temp|=0x01;SCL=0; return(temp);/*/*功能:往I2C總線上器件指定地址寫字節(jié)的數(shù)據(jù)/*bit i2c_write_byte(unsigned char sla,unsigned char

28、 data_addr,unsigned char data_byte)i2c_start();/發(fā)送I2C START信號i2c_send_byte(sla);/發(fā)送器件從地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_send_byte(data_addr);/發(fā)送數(shù)據(jù)地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_send_byte(data_byte);if(i2c_rec_ack()=0)return 0;i2c_stop();/發(fā)送I2C STOP信號return 1; /*/*功能:往I2C總線上器件指定地址開始寫

29、指定長度的數(shù)據(jù)/*bit i2c_write_nbyte(unsigned char sla,unsigned char data_addr,unsigned char *ptr,unsigned char len)i2c_start();/發(fā)送I2C START信號i2c_send_byte(sla);/發(fā)送器件從地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_send_byte(data_addr);/發(fā)送數(shù)據(jù)地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;for(;len>0;len-)/連續(xù)發(fā)送LEN長度的字節(jié)數(shù)據(jù)i2c

30、_send_byte(*ptr+);if(i2c_rec_ack()=0)return 0;i2c_stop();/發(fā)送I2C STOP信號return 1; /*/*功能:從I2C總線上器件指定地址接收一個字節(jié)的數(shù)據(jù)/*unsigned char i2c_read_byte(unsigned char sla,unsigned char data_addr)unsigned int temp;i2c_start();/發(fā)送I2C START信號i2c_send_byte(sla);/發(fā)送從器件寫命令if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_send_byt

31、e(data_addr);/發(fā)送數(shù)據(jù)地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_start();/重新發(fā)送I2C START信號i2c_send_byte(sla|0x01);/發(fā)送器件從器讀命令if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;temp=i2c_rec_byte();i2c_send_noack();/接收最后一個字節(jié)后發(fā)送NOACK信號i2c_stop();/發(fā)送I2C STOP信號return temp;/*/*功能:從I2C總線上器件指定地址接收一個字節(jié)的數(shù)據(jù)/*bit i2c_read_nbyte(unsign

32、ed char sla,unsigned char data_addr,unsigned char *ptr,unsigned char len)i2c_start();/發(fā)送I2C START信號i2c_send_byte(sla);/發(fā)送從器件寫命令if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_send_byte(data_addr);/發(fā)送數(shù)據(jù)地址if(i2c_rec_ack()=0)/檢測應(yīng)答信號return 0;i2c_start();/重新發(fā)送I2C START信號i2c_send_byte(sla|0x01);/發(fā)送器件從器讀命令if(i2c_re

33、c_ack()=0)/檢測應(yīng)答信號return 0;for(;len>1;len-)/連續(xù)接收LEN-1長度的字節(jié)數(shù)據(jù)*ptr+=i2c_rec_byte();i2c_send_ack();/發(fā)送ACK信號*ptr=i2c_rec_byte();/接收最后一個字節(jié)i2c_send_noack();/發(fā)送NOACK信號i2c_stop();/發(fā)送I2C STOP信號return 1;5. AD模塊(SPI總線)利用TLC1549實現(xiàn),TLC1549可以將輸入的模擬量轉(zhuǎn)換成數(shù)字量,并且是10位數(shù)字量,然后也是利用SPI總線一位一位的發(fā)送,因此需要傳兩字節(jié)的數(shù)據(jù),高地址中的低兩位有效,低地址中

34、的八位都有效,傳送過程結(jié)合時序圖進行編程。模塊使用的函數(shù)是模塊驅(qū)動程序參考中的函數(shù)sbit SCLK=P12;sbit DIO=P13;sbit ADCS=P14;sbit DACS=P15;void Before_Once_AD(void);/預(yù)采集uint adc_1549(void) ;/讀取AD輸出的10bit數(shù)據(jù)6. DA模塊(SPI總線)利用TLC5615實現(xiàn)的,TLC5615也是利用SPI總線一位一位的傳送,并且要求傳送的數(shù)據(jù)是12位,因此需要傳兩字節(jié)的數(shù)據(jù),分別放在HIGHD和LOWD中,12位數(shù)據(jù)是HIGHD中的八位和LOWD中的高四位,但是12為數(shù)據(jù)中的低兩位又是無效的,所

35、以只有10位有效數(shù)字。模塊使用的函數(shù)是模塊驅(qū)動程序參考中的函數(shù) /函數(shù)功能描述:驅(qū)動TLC5615開始DA轉(zhuǎn)換/dat為被轉(zhuǎn)換的數(shù)字量void tlc5615(uint dat) ;7.日歷芯片PCF8563 是低功耗的CMOS 實時時鐘日歷芯片,它提供一個可編程時鐘輸出,一個中斷輸出和掉電檢測器,所有的地址和數(shù)據(jù)通過I2 C 總線接口串行傳遞。每次讀寫數(shù)據(jù)后,內(nèi)嵌的字地址寄存器會自動產(chǎn)生增量。按I2C 總線協(xié)議規(guī)約PCF8563 有唯一的器件地址0A2H。因此,可以由CPU把初始化的日歷時鐘通過總線接口串行傳遞寫入PCF8563,由PCF8563以此為起點自動計時,再通過I2C總線串行接口從

36、PCF8563讀出內(nèi)部的日歷/時鐘。這部分主要是在I2C總線協(xié)議的基礎(chǔ)上進行通信,向芯片指定地址寫入控制字,寫入時間數(shù)據(jù)或讀出時間數(shù)據(jù)。由于芯片中的實際數(shù)據(jù)都是以BCD碼形式存儲,因此通信時需要進行十六進制數(shù)和BCD碼的互相轉(zhuǎn)換。具體設(shè)計函數(shù)包括向芯片寫入時間,從芯片讀出時間,碼制轉(zhuǎn)換。程序代碼:/8bit 十六進制轉(zhuǎn)bcd碼unsigned char NUM2BCD(unsigned char x)return (x)/10)<<4)|(x%10);/8bit bcd碼轉(zhuǎn)十六進制unsigned char BCD2NUM(unsigned char x) return (x)&g

37、t;>4)*10+(x)&0x0f);/*-函數(shù)說明:寫入時間:秒,分,時,日,星期,月,年,BCD碼-*/void wt_time(unsigned char *t)i2c_write_byte(0xA2,0x00,0x00);/開始計時i2c_write_nbyte(0xA2,0x02,t,7);/寫入時間/*-讀時間-*/void rd_time(unsigned char *time)int i;unsigned char addr=0x02;unsigned char temp;for(i=0;i<7;i+)temp=i2c_read_byte(0xA2,addr

38、); if(i=0|i=1) /去掉無效位 /秒,分temp&=0x7f; if(i=2|i=3) /時,日temp&=0x3f; if(i=4) /星期temp&=0x07; if(i=5) /月temp&=0x1f;timei=temp; /Delay_ms(50); Delay_us(100); addr=addr+1; /頁讀須軟件累加地址8語音芯片這部分直接使用了模塊驅(qū)動程序參考中的函數(shù),ISD_WR_APC2(uchar voiceValue)函數(shù)可以調(diào)節(jié)音量,0xa8對應(yīng)最大音量,0xaf對應(yīng)最小音量。play_open(unsigned int

39、AddST,unsigned int AddEN)函數(shù)可以根據(jù)播放的首尾地址播放不同的音樂。9.庫文件定義和使用一個模塊的文件包括頭文件(*.h)和源文件(*.c)。在頭文件中進行函數(shù)的聲明,在對應(yīng)源文件中將頭文件首先包含進來,然后對函數(shù)進行具體定義實現(xiàn)。使用時用到了某個模塊,先將頭文件include進來,然后在工程中添加對應(yīng)的C文件。千萬不要忽略了頭文件中的#ifndef,這是一個很關(guān)鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,于是問題來了,大量的聲明沖突。還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧

40、。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:#ifndef <標識>#define <標識>.#endif四、實驗過程:1.鍵盤和LCD的測試功能描述:初始狀態(tài):LCD上第一行顯示"0:get char",第二行顯示"1:get decimal"。按0進入獲取字符并顯示的狀態(tài),按字符F退出返回初始狀態(tài),按1進入獲取整數(shù)并顯示狀態(tài)(整數(shù)范圍:099999),當鍵入99999時退出返回初始狀態(tài)。主要代碼:#lcdtest.c#void main(void)unsigned char key,flag;lon

41、g dec;LCD_Init();/lcd初始化Key_Init();LCD_clear();while(1)LCD_setcursol(0,0);LCD_puts("0:get char");LCD_setcursol(0,1);LCD_puts("1:get decimal");flag=GetChar();if(flag='0'|flag='1')break;LCD_clear();LCD_setcursol(0,0);while(1)if(flag='0')key=GetChar();LCD_put

42、char(key);if(key='F')break;/當按F時跳出if(flag='1')LCD_setcursol(0,0);dec=GetDec();LCD_clear();LCD_putdec(dec);if(dec=99999)break;/當輸入整數(shù)為99999時跳出2.LCD和LED顯示日歷功能描述:初始狀態(tài)LCD顯示歡迎界面,提示按F鍵進入,按F后進入提示菜單,按0選擇程序中默認的日期設(shè)定,按1選擇手動設(shè)定日期,依次按照提示鍵入日期。日期設(shè)定后在LCD上顯示全部日期信息,LED上顯示時分秒。主要代碼:#calendar.c#unsigned ch

43、ar show8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;/led顯示數(shù)值表unsigned char time7=0x01;/秒,分,時,日,星期,月,年(BCD碼)/*-函數(shù)說明:軟件設(shè)定時間:秒,分,時,日,星期,月,年,BCD碼-*/void set_time(unsigned char *time)LCD_clear();LCD_setcursol(0,0);LCD_puts("Set year(099):");LCD_setcursol(0,1);time6=NUM2BCD(unsigned char)(GetDec();

44、LCD_clear();LCD_setcursol(0,0);LCD_puts("Set month(112):");LCD_setcursol(0,1);time5=NUM2BCD(unsigned char)(GetDec();LCD_clear();LCD_setcursol(0,0);LCD_puts("Set day:");LCD_setcursol(0,1);time3=NUM2BCD(unsigned char)(GetDec();LCD_clear();LCD_setcursol(0,0);LCD_puts("Set weekday(06):");LCD_setcursol(0,1);time4=NUM2BCD(unsigned char)(GetDec();LCD_clear();LCD_setcursol(0,0);LCD_puts("Set hour(023):");LCD_setcursol(0,1);time2=NUM2BCD(unsigned char)(GetDec();LCD_clear();LCD_setcursol(0,0);LCD_puts(&

溫馨提示

  • 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

提交評論