


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、電子線路專題實(shí)驗(yàn)口一、實(shí)驗(yàn)要求 :1. 認(rèn)真閱讀學(xué)習(xí)系統(tǒng)線路及相關(guān)資料2. 將鍵盤陣列定義為0. 1.2 E. F編程實(shí)現(xiàn)將鍵盤輸入內(nèi)容顯示在 LCD顯示 器上。3. 編程實(shí)現(xiàn)將日歷、時(shí)鐘顯示在 LED顯示屏上(注意仔細(xì)閱讀PCF8563資料), 日歷、時(shí)鐘輪回顯示。4. 利用D/A轉(zhuǎn)換通道(下行通道)實(shí)現(xiàn)鋸齒波發(fā)生器;輸出(15V)固定電壓 轉(zhuǎn)換成(420mA)電流。5. 利用A/D轉(zhuǎn)換通道(上行通道)實(shí)現(xiàn)數(shù)據(jù)采集,將采集信號(hào)顯示在 LED屏上。 程序要求分別具有平均值濾波、中值濾波和滑動(dòng)濾波功能。6. 將按鍵陣列定義成與 16個(gè)語(yǔ)音段對(duì)應(yīng),編寫程序,實(shí)現(xiàn)按鍵播放不同的語(yǔ)音 段。二、實(shí)驗(yàn)設(shè)計(jì)
2、思路:本次實(shí)驗(yàn)用c語(yǔ)言實(shí)現(xiàn),主要包括LCD, LED,AD,DA,日歷芯片,測(cè)溫傳 感芯片。受到嵌入式系統(tǒng)實(shí)驗(yàn)的啟發(fā),將 LCD LED, I2C總線協(xié)議,鍵盤掃描模 塊接口寫成一個(gè)文件庫(kù)(放在 library 文件夾下),盡量做到調(diào)用時(shí)與底層硬件無(wú) 關(guān)。通過(guò)調(diào)用庫(kù)文件中的函數(shù),實(shí)現(xiàn)代碼的重用性。鍵盤, LCD的代碼由于與嵌 入式實(shí)驗(yàn)具有相通之處, 因此可將高層的函數(shù) (與底層硬件無(wú)關(guān)的函數(shù)) 方便地 移植過(guò)來(lái)。三、實(shí)驗(yàn)設(shè)計(jì):1. 矩陣鍵盤掃描模塊4X4的矩陣鍵盤,通過(guò)掃描可得到按下鍵的行列值,將行列值轉(zhuǎn)換為相應(yīng)的 對(duì)應(yīng)數(shù)字0F。函數(shù)GetKeyQ實(shí)現(xiàn)獲得按鍵的鍵值。對(duì)于鍵盤模塊對(duì)于對(duì)按鍵的
3、鍵值識(shí)別主要是通過(guò)兩次掃描而取得。對(duì)于第一次掃描,給四行鍵全部賦予 1, 然后讀回鍵盤值, 對(duì)于第二次掃描, 逐行為鍵盤送 1,每次送 1 后再讀回鍵盤值, 若非零,說(shuō)明此行有鍵按下,最終確定鍵值。通過(guò)調(diào)用GetKey函數(shù)構(gòu)造GetChar()函數(shù),實(shí)現(xiàn)獲取鍵盤字符(''''的功 能。通過(guò)調(diào)用GetChar(函數(shù)構(gòu)造GetDec()函數(shù),實(shí)現(xiàn)獲取鍵盤輸入整數(shù)的功能, 整數(shù)范圍在099999。有按'鍵回退一格,按''清空當(dāng)前未完輸入,按'鍵結(jié) 束輸入的功能。程序代碼:/ 鍵盤初始化,將標(biāo)志位置 1;void Key_Init(voi
4、d)bKeyUp_Flag=1;/標(biāo)志(全局變量)位置 1/鍵盤掃描函數(shù),得到鍵的行列位置 unsigned char GetScanKey(void) unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff;for (i=1; i<0x10; i<<=1) /i 的低 4 位為行數(shù)位,行依次檢測(cè)循環(huán) 4 次 ptr=0x8fff;* ptr =i;temp = * ptr;temp &= 0x0f;if (temp!=0x00)key = i<<4;key|=temp; break;
5、return key;/取鍵盤10 口的值/ 屏蔽高四位/ 是否有有效鍵值/取行數(shù)位的值并將其放入返回值高 4 位/返回行位(高四)和列位(低四)/列數(shù)位的值放入返回值低 4 位/ 取鍵值,長(zhǎng)按無(wú)效 unsigned char GetKey(void) unsigned char key, temp;if (key=0xff)/ 沒(méi)有按鍵,置標(biāo)志位if (!bKeyUp_Flag) /判斷標(biāo)志,是 0 執(zhí)行/*按鍵程序執(zhí)行一次后會(huì)將bKeyUp_Flag標(biāo)志位清零,執(zhí)行此段程序, 長(zhǎng)按鍵無(wú)效返回?zé)o效值,直至按鍵無(wú)效返回?zé)o效按鍵值,置"1" 標(biāo)志位。按鍵輸入恢復(fù)有效。屏蔽這部
6、分則長(zhǎng)按鍵有效*/key=GetScanKey();bKeyUp_Flag=1;else / 保持按鍵 return 0xff; / 因?yàn)?0xff 大于 15,故為無(wú)效鍵值,實(shí)現(xiàn)長(zhǎng)按鍵無(wú)效 key=GetScanKey();if (key=0xff) / 沒(méi)有按鍵return key;else / 有按鍵有效temp=key;/ 取鍵值Delay_ms(20);/ 延時(shí) 20ms消抖key=GetScanKey(); / 鍵盤掃描 if(key!=temp)/ 判斷兩次鍵值是否相同,排除干擾信號(hào)影響確認(rèn)有效信號(hào) key=0xff;return key;else / 取鍵值/* 這部分主要作用
7、是軟件抗干擾 */ temp=Key_Value_Tablekey>>4; / 見(jiàn)說(shuō)明/*行值有效位(鍵盤的4個(gè)行SEL返回的值含有的有效位"1")有且只有 一位鍵值才有效否則返回?zé)o效鍵值 */if (temp=0xff)key=0xff; return key; temp=Key_Value_Tablekey&0x0f;/*列值有效位(鍵盤的4個(gè)列RL返回的值含有的有效位"1")有且只有一 位鍵值才有效否則返回?zé)o效鍵值 */if (temp=0xff)key=0xff; return key; key=Key_Value_Table
8、key»4*4+Key_Value_Tableke y&O xOf行對(duì)應(yīng)的 中間值的四倍與列對(duì)應(yīng)的中間值之和即為按鍵編號(hào) 015 /*行列組合后的值大于 15無(wú)效*/if (key>15)key=Oxff; 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 co
9、de and return */ 獲得鍵盤輸入整數(shù)long GetDec(void)long out_dec = 0;99999 */unsigned char i,j;int temp = 0;int key;for(i = 0;i<6 ; )key =GetChar();if(key<='9')&&(key >= '0')/* result(decimal number)數(shù)值范圍 0/* variable for character count*/* 獲取鍵值' 0'' 9' */temp =
10、 key - '0'/* 獲取數(shù)值 0-9*/out_dec = out_dec * 10 + (long)temp;if(out_dec = 0)continue;/* 首位數(shù)據(jù)輸入為 0 時(shí),顯示不變*/i+;/* 顯示當(dāng)前輸入的數(shù)據(jù) */* 當(dāng)前輸入清零 */LCD_putchar(key); continue;if('E'= key)out_dec = 0;back_cursol(i);/* 清顯示區(qū) */for(j=0;j<i;j+)LCD_putchar(' '); back_cursol(i); continue;if(
11、9;F' = key)return out_dec;if('C' = key)out_dec = out_dec / 10; back_cursol(1);LCD_putchar(' '); back_cursol(1); continue;/* 清顯示區(qū) */* ENTER鍵,數(shù)值確認(rèn)*/* 撤銷最近一個(gè)輸入數(shù)字 */2. LED 模塊通過(guò)送字形碼和字位碼可以點(diǎn)亮對(duì)應(yīng)的一個(gè) 8段LED 8個(gè)LED的同時(shí)顯示 通過(guò)循環(huán)掃描顯示實(shí)現(xiàn),即每次在一個(gè)LED上顯示設(shè)定的數(shù)字,延時(shí)顯示一段時(shí) 間(延時(shí)越長(zhǎng),亮度越好) ,然后切換顯示下一個(gè),依次輪換。程序代碼:un
12、signed 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ù)功能描述:給顯示數(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 cha
13、r *show)unsigned char i=1,j;unsigned char xdata *ptr;for (j=0; j<8; j+)/八個(gè)數(shù)碼管全部顯示ptr=0x8fff;/ 段選地址*ptr=i;ptr=0x9fff;/ 位選地址/ 在此給 *ptr 賦值送字形碼 *ptr=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è)計(jì)思路:LCD
14、的顯示通過(guò)給LCD寫命令和數(shù)據(jù)實(shí)現(xiàn)。寫數(shù)據(jù)與寫指令時(shí)各控制引腳的 電平不同, 對(duì)應(yīng)了不同的地址。 先構(gòu)造寫數(shù)據(jù)和寫命令函數(shù) (與硬件相關(guān)操作), 已經(jīng)檢測(cè)LCD是否忙的函數(shù)(當(dāng)處于忙狀態(tài)時(shí)不能寫數(shù)據(jù),否則硬件會(huì)工作不正 常),在此接口的基礎(chǔ)上構(gòu)造庫(kù)(與硬件無(wú)關(guān)操作,通過(guò)調(diào)用寫數(shù)據(jù)和寫命令函 數(shù)實(shí)現(xiàn)),實(shí)現(xiàn)各種不同的功能,包括初始化設(shè)定工作方式,顯示字符,顯示字 符串,顯示數(shù)字(099999),清屏,設(shè)定光標(biāo)的位置等。這里的顯示字符,顯 示整數(shù)和鍵盤檢測(cè)模塊的讀入字符,讀入整數(shù)對(duì)應(yīng)起來(lái),可以合作使用。使用時(shí)先調(diào)用初始化函數(shù)初始化LCD設(shè)定工作方式,然后可以調(diào)用不同的函數(shù)實(shí)現(xiàn)不同的顯示。程序代碼:
15、/*= define variable =*/ unsigned char cursol_x;/* cursor position (horizontal) */unsigned char cursol_y;/* cursor positon (vertical)*/ unsigned char xdata *ptr;指向XDATA勺指針(訪問(wèn)片外地址) unsigned char code ASC2_Value_Table16=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46;/=向
16、 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;/=檢查忙標(biāo)志位 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(vo
17、id)CheckBF();WriteW(0x38);CheckBF();WriteW(0x01);/Clear display 清顯示CheckBF();WriteW(0x06);/Entry mode set:I/D=1,S=0 I:Increase,D:Decline,S:Shift CheckBF();WriteW(0x0F);/Dislpay on/off control D=1,C=1,B=1D:Display,C:Cursor,B:Blink CheckBF();WriteW(0x80);/Dislpay on/off control D=0,C=0,B=0D:Display,C:
18、Cursor,B:Blink /=設(shè)定光標(biāo)所在位置 =void LC D _setcursol(unsigned char x, unsigned char y)cursol_x = x; cursol_y = y; CheckBF();WriteW(0x80 */* cursor position (horizontal) */* cursor positon (vertical)*/* wait LCD process*/| y*0x40 + x); /* address of the second line 0x40-0x4f/=后移光標(biāo) = voidmove_cursol(void)/
19、* move cursor to right, if get to end ofif(+cursol_x > 0x0f) the line */cursol_x = 0; /* move to begin of the line */ if(+cursol_y >= 2) /* return, if over the second line */cursol_y = 0; /* return to begin of the line */LCD_setcursol(cursol_x, cursol_y);/* set cursor */ /=前移光標(biāo) = voidback_curs
20、ol(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) if(c = 'n')|(c = 'r') /* line feed code */ cursol_x = 0;cursol_y A= 1;LCD_setcursol(cu
21、rsol_x, cursol_y); /* set cursor*/CheckBF();WriteD(c);/* wait LCD process*/*/* write Data-RegisterCheckBF(); /* wait LCD process */ move_cursol(); /* move cursor position */ /=寫字符串 = voidLCD_puts(const unsigned char *s) for(; '0' != *s; s+)/* loop before null code*/LCD_putchar(*s);/* display
22、 character on LCD*/ /=寫整數(shù) =voidLCD_putdec(long dec) /*可打印的數(shù)據(jù)小于 99999 */1long num ;/* number to be displayed*/int i;/* loop counter*/unsigned char str_buf5;/* buffer for data display*/num = dec;*/for(i = 0 ;num != 0; i+) str_bufi = num % 10; buffer*/num = num / 10;if(i = 0)LCD_putchar('0');el
23、se*/for(-i; i >= 0; i-)*/* save number to be displayed/* confirm digit */ /* get every digit number and save in/* if number is 0*/* display '0' in LCD*/* if number is not 0/* loop times of digitsLCD_putchar(str_bufi + '0');/* after transfered into ASCII code */* display in LCD */
24、十六進(jìn)制碼轉(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和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。I2C 總線在傳送數(shù)據(jù)過(guò)程中共有三種類型信號(hào), 它們分別是: 開(kāi)始信號(hào)、結(jié)束信號(hào)和 應(yīng)答信號(hào)。開(kāi)始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,開(kāi)始傳送數(shù)據(jù)。結(jié)束信號(hào):SCL為低電平時(shí),SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。應(yīng)答信號(hào):接收數(shù)據(jù)的IC
25、在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的 低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號(hào)后,等待受控單元 發(fā)出一個(gè)應(yīng)答信號(hào),CPU接收到應(yīng)答信號(hào)后,根據(jù)實(shí)際情況作出是否繼續(xù)傳遞信 號(hào)的判斷。若未收到應(yīng)答信號(hào),由判斷為受控單元出現(xiàn)故障。協(xié)議代碼:sbit SCL=P1A0;sbit SDA=P1A1;/*/*功能:?jiǎn)?dòng)I2C總線/*void i2c_start()SDA=1;SCL=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SCL=0;/*/*功能:停止I2C總線 /*void i2c_stop()SDA=0;SCL=0;_nop_();
26、_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;return ack_flag;void i2c_send_ack(void)SDA=0;_nop_();_nop_();SCL=1;_nop_();_nop_();SCL=0;_nop_();_nop_();SDA=1;/*/* 功能:無(wú)應(yīng)答 I2C 總線/
27、*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_();SCL=1;_nop_();_nop_();SCL=0; data_byte<<=1; /* /* 功能:從 I2C 總線接受數(shù)據(jù) /* unsi
28、gned 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 data_addr,unsigned char data_byte)i2c_start(); i2c_send_byte(s
29、la); if(i2c_rec_ack()=0)return 0;i2c_send_byte(data_addr); if(i2c_rec_ack()=0)return 0;i2c_send_byte(data_byte); if(i2c_rec_ack()=0)return 0;i2c_stop();return 1;*/發(fā)送I2C STAR信號(hào)/ 發(fā)送器件從地址 / 檢測(cè)應(yīng)答信號(hào)/ 發(fā)送數(shù)據(jù)地址/ 檢測(cè)應(yīng)答信號(hào)/ 發(fā)送I2C STOP言號(hào)/*功能:往I2C總線上器件指定地址開(kāi)始寫指定長(zhǎng)度的數(shù)據(jù)bit i2c_write_nbyte(unsigned char sla,unsigned ch
30、ar data_addr,unsigned char *ptr,unsigned char len)i2c_start();/ 發(fā)送 I2C STAR信號(hào)i2c_send_byte(sla);/ 發(fā)送器件從地址if(i2c_rec_ack()=0)/ 檢測(cè)應(yīng)答信號(hào)return 0;i2c_send_byte(data_addr);if(i2c_rec_ack()=0)return 0;for(;len>0;len-) 據(jù)i2c_send_byte(*ptr+); if(i2c_rec_ack()=0) return 0;i2c_stop();return 1;/ 發(fā)送數(shù)據(jù)地址/ 檢測(cè)應(yīng)答
31、信號(hào)/連續(xù)發(fā)送LEN長(zhǎng)度的字節(jié)數(shù)/ 發(fā)送I2C STOP言號(hào)/*功能:從I2C總線上器件指定地址接收一個(gè)字節(jié)的數(shù)據(jù)unsigned char i2c_read_byte(unsigned char sla,unsigned char data_addr) unsigned int temp; i2c_start(); i2c_send_byte(sla); if(i2c_rec_ack()=0) return 0; i2c_send_byte(data_addr); if(i2c_rec_ack()=0) return 0; i2c_start(); i2c_send_byte(sla|0x0
32、1); if(i2c_rec_ack()=0) return 0; temp=i2c_rec_byte(); i2c_send_noack();號(hào)i2c_stop();/ 發(fā)送I2C STAR信號(hào)/ 發(fā)送從器件寫命令/ 檢測(cè)應(yīng)答信號(hào)/ 發(fā)送數(shù)據(jù)地址/ 檢測(cè)應(yīng)答信號(hào)/ 重新發(fā)送I2C STAR信號(hào)/ 發(fā)送器件從器讀命令/ 檢測(cè)應(yīng)答信號(hào)/接收最后一個(gè)字節(jié)后發(fā)送NOACK信/ 發(fā)送I2C STOP言號(hào)return temp;/* 功能:從 I2C 總線上器件指定地址接收一個(gè)字節(jié)的數(shù)據(jù)bit i2c_read_nbyte(unsigned char sla,unsigned char data_add
33、r,unsigned char*ptr,unsigned char len)i2c_start();i2c_send_byte(sla);if(i2c_rec_ack()=0)return 0;i2c_send_byte(data_addr); if(i2c_rec_ack()=0)return 0;i2c_start();i2c_send_byte(sla|0x01); if(i2c_rec_ack()=0)return 0;for(;len>1;len-)據(jù)*ptr+=i2c_rec_byte(); i2c_send_ack();*ptr=i2c_rec_byte(); i2c_se
34、nd_noack();i2c_stop();return 1;/ 發(fā)送I2C STAR信號(hào)/ 發(fā)送從器件寫命令/ 檢測(cè)應(yīng)答信號(hào)/ 發(fā)送數(shù)據(jù)地址/ 檢測(cè)應(yīng)答信號(hào)/ 重新發(fā)送I2C STAR信號(hào)/ 發(fā)送器件從器讀命令/ 檢測(cè)應(yīng)答信號(hào)/ 連續(xù)接收 LEN-1 長(zhǎng)度的字節(jié)數(shù)/發(fā)送ACK信號(hào)/ 接收最后一個(gè)字節(jié)/ 發(fā)送NOACK信號(hào)/ 發(fā)送I2C STOP言號(hào)5. AD模塊(SPI總線)利用TLC1549實(shí)現(xiàn),TLC1549可以將輸入的模擬量轉(zhuǎn)換成數(shù)字量,并且是 10 位數(shù)字量,然后也是利用SPI總線一位一位的發(fā)送,因此需要傳兩字節(jié)的數(shù)據(jù), 高地址中的低兩位有效, 低地址中的八位都有效, 傳送過(guò)程結(jié)合時(shí)
35、序圖進(jìn)行編程。模塊使用的函數(shù)是模塊驅(qū)動(dòng)程序參考中的函數(shù)sbit SCLK=P1A2;sbit DIO=PM3; sbit ADCS=P1A4;sbit DACS=PM5;void Before_O nce_AD(void);/預(yù)采集uint adc_1549(void) ;/讀取 AD輸出的 10bit 數(shù)據(jù)6. DA模塊(SPI總線)利用TLC5615實(shí)現(xiàn)的,TLC5615也是利用SPI總線一位一位的傳送,并且要 求傳送的數(shù)據(jù)是12位,因此需要傳兩字節(jié)的數(shù)據(jù),分別放在HIGHD和LOWD中, 12位數(shù)據(jù)是HIGHD中的八位和LOWD中的高四位,但是12為數(shù)據(jù)中的低兩位又 是無(wú)效的,所以只有
36、10位有效數(shù)字。模塊使用的函數(shù)是模塊驅(qū)動(dòng)程序參考中的 函數(shù)/函數(shù)功能描述:驅(qū)動(dòng)TLC5615開(kāi)始DA轉(zhuǎn)換/dat 為被轉(zhuǎn)換的數(shù)字量void tlc5615(uint dat) ;7. 日歷芯片PCF8563 是低功耗的 CMOS 實(shí)時(shí)時(shí)鐘日歷芯片,它提供一個(gè)可編程時(shí)鐘 輸出,一個(gè)中斷輸出和掉電檢測(cè)器,所有的地址和數(shù)據(jù)通過(guò) I2 C 總線接口串行 傳遞。每次讀寫數(shù)據(jù)后,內(nèi)嵌的字地址寄存器會(huì)自動(dòng)產(chǎn)生增量。按I2C總線協(xié)議規(guī)約PCF8563有唯一的器件地址0A2H。因此,可以由CPU把初始化的日歷時(shí)鐘 通過(guò)總線接口串行傳遞寫入 PCF8563由PCF8563以此為起點(diǎn)自動(dòng)計(jì)時(shí),再通過(guò) I2C總線串行
37、接口從PCF8563賣出內(nèi)部的日歷/時(shí)鐘。這部分主要是在 I2C 總線協(xié)議的基礎(chǔ)上進(jìn)行通信,向芯片指定地址寫入控制 字,寫入時(shí)間數(shù)據(jù)或讀出時(shí)間數(shù)據(jù)。由于芯片中的實(shí)際數(shù)據(jù)都是以BCD碼形式存儲(chǔ),因此通信時(shí)需要進(jìn)行十六進(jìn)制數(shù)和BCD碼的互相轉(zhuǎn)換。具體設(shè)計(jì)函數(shù)包括向芯片寫入時(shí)間,從芯片讀出時(shí)間,碼制轉(zhuǎn)換。程序代碼:/8bit 十六進(jìn)制轉(zhuǎn) bcd 碼unsigned char NUM2BCD(unsigned char x) return (x)/10)<<4)|(x%10);/8bit bcd 碼轉(zhuǎn)十六進(jìn)制unsigned char BCD2NUM(unsigned char x)ret
38、urn (x)>>4)*10+(x)&0x0f);/*函數(shù)說(shuō)明:寫入時(shí)間:秒,分,時(shí),日,星期,月,年,BCD碼*/void wt_time(unsigned char *t)i2c_write_byte(0xA2,0x00,0x00); 開(kāi)始計(jì)時(shí) i2c_write_nbyte(0xA2,0x02,t,7); 寫入時(shí)間/*讀時(shí)間*/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(
39、0xA2,addr);if(i=0|i=1) / 去掉無(wú)效位 / 秒,分 temp&=0x7f;if(i=2|i=3)/ 時(shí),日temp&=0x3f;if(i=4)/ 星期temp&=0x07;if(i=5)/ 月temp&=0x1f; timei=temp;/Delay_ms(50);Delay_us(100);addr=addr+1; / 頁(yè)讀須軟件累加地址8語(yǔ)音芯片這部 分直 接使 用了 模塊 驅(qū)動(dòng) 程序 參考中的 函數(shù), ISD_WR_APC2(uchar voiceValue)函數(shù)可以調(diào)節(jié)音量,0xa8對(duì)應(yīng)最大音量,Oxaf對(duì)應(yīng)最小音量。play_op
40、e n(un sig ned int AddST,u nsig nedi nt AddEN)函數(shù)可以根據(jù)播放的首尾地址 播放不同的音樂(lè)。9. 庫(kù)文件定義和使用一個(gè)模塊的文件包括頭文件(*.h)和源文件(*.c)。在頭文件中進(jìn)行函數(shù)的聲明, 在對(duì)應(yīng)源文件中將頭文件首先包含進(jìn)來(lái), 然后對(duì)函數(shù)進(jìn)行具體定義實(shí)現(xiàn)。 使用時(shí) 用到了某個(gè)模塊,先將頭文件include進(jìn)來(lái),然后在工程中添加對(duì)應(yīng)的 C文件。千萬(wàn)不要忽略了頭文件中的#ifndef,這是一個(gè)很關(guān)鍵的東西。比如你有兩個(gè)C文件,這兩個(gè)C文件都include 了同一個(gè)頭文件。而編譯時(shí),這兩個(gè) C文件要 一同編譯成一個(gè)可運(yùn)行文件,于是問(wèn)題來(lái)了,大量的聲明
41、沖突。還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會(huì)不會(huì)被 多個(gè)文件引用,你都要加上這個(gè)。一般格式是這樣的:#ifndef 標(biāo)識(shí)#define 標(biāo)識(shí) #endif四、實(shí)驗(yàn)過(guò)程:1.鍵盤和LCD的測(cè)試 功能描述:初始狀態(tài):LCD上第一行顯示"O:get char",第二行顯示"1:get decimal"。按0 進(jìn)入獲取字符并顯示的狀態(tài),按字符'退出返回初始狀態(tài),按1進(jìn)入獲取整數(shù)并 顯示狀態(tài)(整數(shù)范圍:099999),當(dāng)鍵入99999時(shí)退出返回初始狀態(tài)。 主要代碼:#lcdtest.c#void main(void)un
42、signed char key,flag;long 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
43、39;)key=GetChar();LCD_putchar(key);if(key='F')break;當(dāng)按 F 時(shí)跳出if(flag='1')LCD_setcursol(0,0);dec=GetDec();LCD_clear();LCD_putdec(dec);if(dec=99999)break;當(dāng)輸入整數(shù)為99999時(shí)跳出2LCD和LED顯示日歷功能描述:初始狀態(tài)LCD顯示歡迎界面,提示按F鍵進(jìn)入,按F后進(jìn)入提示菜單,按0選擇 程序中默認(rèn)的日期設(shè)定, 按1選擇手動(dòng)設(shè)定日期, 依次按照提示鍵入日期。 日期 設(shè)定后在LCD上顯示全部日期信息,LED上顯示時(shí)分秒
44、。主要代碼:#calendar.c#un sig ned char Show8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;/led 顯示數(shù)值表un sig ned char time7=0x01; 秒,分,時(shí),日,星期,月,年(BCD 碼)/*函數(shù)說(shuō)明:軟件設(shè)定時(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
45、=NUM2BCD(unsigned char)(GetDec();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_setcur
46、sol(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("Set minute(059):")
47、;LCD_setcursol(0,1); time1=NUM2BCD(unsigned char)(GetDec();LCD_clear();LCD_setcursol(0,0);LCD_puts("Set second(059):");LCD_setcursol(0,1); time0=NUM2BCD(unsigned char)(GetDec();/*函數(shù)說(shuō)明:軟件設(shè)定缺省時(shí)間:秒,分,時(shí),日,星期,月,年,BCD碼*/將2011 年6 月13 日星期一下午 3 點(diǎn)(15 點(diǎn))59 分30 秒的時(shí)間寫入 PCF8563 void set_default_time(uns
48、igned char *t) t0=0x30; t1=0x59; t2=0x15;t3=0x13;t4=0x01;t5=0x06;t6=0x11;/ 日歷顯示 void CalendarDisp(unsigned char * time)/-LCD 顯示LCD_setcursol(0,0);/yearLCD_putchar('2');LCD_putchar('0');LCD_putchar(Key_ASC2(time6>>4)&0x0f);LCD_putchar(Key_ASC2(time6&0x0f);LCD_putchar(
49、9;-');/monthLCD_putchar(Key_ASC2(time5>>4)&0x0f);LCD_putchar(Key_ASC2(time5&0x0f);LCD_putchar('-');/dayLCD_putchar(Key_ASC2(time3>>4)&0x0f);LCD_putchar(Key_ASC2(time3&0x0f);LCD_putchar(' ');/weekdayswitch(time4)case 0:LCD_puts("Sun");break;ca
50、se 1:LCD_puts("Mon");break;case 2:LCD_puts("Tue");break;case 3:LCD_puts("Wed");break;case 4:LCD_puts("Thu");break;case 5:LCD_puts("Fri");break;case 6:LCD_puts("Sat");break;LCD_setcursol(0,1);/hourLCD_putchar(Key_ASC2(time2>>4)&0x0
51、f);LCD_putchar(Key_ASC2(time2&0x0f);LCD_putchar(':');/minuteLCD_putchar(Key_ASC2(time1>>4)&0x0f);LCD_putchar(Key_ASC2(time1&0x0f);LCD_putchar(':');/secondLCD_putchar(Key_ASC2(time0>>4)&0x0f);LCD_putchar(Key_ASC2(time0&0x0f);/LCD 顯示 _end/-LED 顯示 show7=show6=0;show5=time2>>4;show4=time2&0x0f;show3=time1>>4;show2=time1&0x0f;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園保健知識(shí)培訓(xùn)課件
- 金昌電梯裝修施工方案
- 干部法律知識(shí)培訓(xùn)課件
- 水塔工程施工方案
- 兒童租賃門店合同范例
- 個(gè)人勞務(wù)派遣工合同范例
- 個(gè)人田地出租合同范例
- 人工代加工合同范例
- 品牌引導(dǎo)消費(fèi)者行為的技巧計(jì)劃
- 秘書工作任務(wù)安排計(jì)劃表
- 醫(yī)療器械醫(yī)療器械研發(fā)合同
- 2025年岳陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案
- (二模)2024-2025學(xué)年佛山市順德區(qū)高三教學(xué)質(zhì)量檢測(cè) (二)歷史試卷(含答案)
- 2024初級(jí)會(huì)計(jì)職稱考試題庫(kù)(附參考答案)
- 國(guó)家安全教育大學(xué)生讀本高教社2024年8月版教材講義-第一章完全準(zhǔn)確領(lǐng)會(huì)總體國(guó)家安全觀
- 2025年四川省對(duì)口招生(旅游類)《前廳服務(wù)與管理》考試復(fù)習(xí)題庫(kù)(含答案)
- 2024年01月河北2024年唐山銀行社會(huì)招考筆試歷年參考題庫(kù)附帶答案詳解
- 【高++中語(yǔ)文++】《記念劉和珍君》課件+統(tǒng)編版高中語(yǔ)文選擇性必修中冊(cè)
- 2025年湖南信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2025年江西環(huán)境工程職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2024年世界職業(yè)院校技能大賽高職組“研學(xué)旅行組”賽項(xiàng)參考試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論