PIC單片機(jī)C語言編程實(shí)例_第1頁
PIC單片機(jī)C語言編程實(shí)例_第2頁
PIC單片機(jī)C語言編程實(shí)例_第3頁
PIC單片機(jī)C語言編程實(shí)例_第4頁
PIC單片機(jī)C語言編程實(shí)例_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、PIC 單片機(jī) C 語言編程實(shí)例 液晶顯示模塊編程15.2.2 MG-12232 模塊的編程下面以圖 15.1 的接口電路為例。 液晶顯示區(qū)域分成 E1 邊和 E2 邊,下面只含 E1 邊的程序 (表 15.1 中 E1=1,E2=0),E2 邊 (表 15.1 中 E1=0,E2=1) 類推。在系統(tǒng)程序的初始化部分,應(yīng)對程序中用到的寄存器和臨時(shí)變量作說明,如:unsigned char TRANS ; unsigned char PAGEADD ; / 存放頁地址寄存器 unsigned char PAGENUM ; / 存放總頁數(shù)寄存器 unsigned char CLMSUM ; / 存

2、放總列數(shù)寄存器 unsigned char CLMADD ; / 存放列地址寄存器 unsigned char WRITE ; /存放顯示數(shù)據(jù)寄存器 unsigned char row ; / 存放顯示起始行寄存器 unsigned char i,k ; / 通用寄存器 /系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序 void INITIAL()ADCON1=0X87 ; / 設(shè)置 PORTA 口和 PORTE 口為數(shù)字 I/O 口TRISA3=0 ;TRISB0=0 ; TRISE=0X00 ; / 設(shè)置液晶的 4 個(gè)控制腳為輸出 /讀液晶顯示器狀態(tài)子程序void LCDSTA1()while(1)T

3、RISD=0XFF ; / 設(shè)置 D 口為輸入RB0=1 ; /E1=1 RA3=0 ; /E2=0RE0=1 ; /R/W=1 RE1=0 ; /A0=0 if(RD7=0) break ; /為忙狀態(tài),則繼續(xù)等待其為空閑 / 對液晶顯示器發(fā)指令子程序 (指令保存在 TRANS 寄存器中 ) void TRANS1()LCDSTA1() ; / 判斷液晶是否為忙 TRISD=0X00 ; / 置 D 口為輸出RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=0 ; /R/W=0RE1=0 ; /A0=0PORTD=TRANS ; /需要寫入的命令字送入數(shù)據(jù)線 RB0=0 ; /E1

4、=0 寫入指令RE0=1 ; /R/W=1/ 對液晶顯示器寫數(shù)據(jù)子程序 (數(shù)據(jù)保存在 WRITE 寄存器中 ) void WRITE1()TRANS=CLMADD ; /設(shè)置列地址TRANS1() ;LCDSTA1() ; / 查詢液晶是否為空閑 TRISD=0X00 ; /D 口為輸出RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=0;/R/W=0RE1=1 ; /A0=1PORTD=WRITE ; / 需要寫入的數(shù)據(jù)放入 D 口RBO=O ;E1=0,寫入數(shù)據(jù)CLMADD+ ; /列地址加 1RE0=1 ;/R/W=1/開 E1 顯示子程序void DISP1()while(1

5、)TRANS=0XAF ;TRANS1() ;/送出控制命令LCDSTA1() ; /判斷液晶是否為空閑TRISD=0XFF ;/設(shè)置 D 口為輸入RB0=1 ;/E1=1RA3=0 ; /E2=0RE0=1 ;/R/W=1RE1=0;/A0=0if(RD5=0) break ;/如果液晶沒被關(guān)閉,則繼續(xù)關(guān)/E1 邊清屏子程序void CLEAR1()PAGEADD=0xB8 ;/設(shè)置頁地址代碼for(PAGENUM=0X04 ; PAGENUM0 ; PAGENUM-)TRANS=PAGEADD ;TRANS1() ;CLMADD=0x00 ; /設(shè)置起始列 for(CLMSUM=0X50

6、; CLMSUM0 ; CLMSUM-)LCDSTA1() ; /判斷液晶是否為空閑WRITE=0X00 ;WRITE1() ; /寫入 00H 以清屏PAGEADD+ ; / 頁號增 1/ 關(guān) E1 顯示子程序void DISOFF1()while(1)TRANS=0XAE ;TRANS1() ; /發(fā)出控制命令LCDSTA1() ; / 判斷液晶是否為空閑TRISD=0XFF ; /D 口設(shè)置為輸入RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=1 ; /R/W=1RE1=0 ; /A0=0if(RD5=1) break ; /如果液晶沒被關(guān)閉,則繼續(xù)關(guān)有了以上的通用子程序,

7、就可以構(gòu)造出各種顯示程序, 如字符。 漢字。曲線等。 執(zhí)行這些程序前, 必須對液晶進(jìn)行初始化。初始化的順序?yàn)椋宏P(guān)顯示T正常顯示驅(qū)動(dòng)設(shè)置 T占空比設(shè)置 T復(fù)位f ADC選擇t清屏t開顯示,程序如下:/E1 邊初始化void lcd1()DISOFF1() ; /關(guān)顯示 E1TRANS=0XA4 ; / 靜態(tài)顯示驅(qū)動(dòng)TRANS1() ; /發(fā)出控制命令TRANS=0XA9 ; /占空比為 1/32TRANS1() ; /發(fā)出控制命令TRANS=0XE2 ; /復(fù)位TRANS1() ; /發(fā)出控制命令TRANS=0XA0 ; /ADC 選擇正常輸出TRANS1() ; /發(fā)出控制命令CLEAR1()

8、 ; /清屏LCDSTA1() ; /判斷液晶是否為空閑DISP1() ; /開顯示15.4 程序清單下面給出一個(gè)已經(jīng)在模板上調(diào)試通過的程序。 注意在調(diào)試該程序時(shí), 需把模板上的 J9 跳針短接。 #include /該程序用于液晶顯示功能的演示/運(yùn)行程序后,液晶上顯示 電流有效值 和電壓有效值 字樣 /系統(tǒng)總的初始化子程序 unsigned char TRANS ;unsigned char PAGEADD ; / 存放頁地址寄存器 unsigned char PAGENUM ; /存放總頁數(shù)寄存器 unsigned char CLMSUM ; / 存放總列數(shù)寄存器 unsigned cha

9、r CLMADD ; / 存放列地址寄存器 unsigned char WRITE ; /存放顯示數(shù)據(jù)寄存器 unsigned char row ; / 存放顯示起始行寄存器 unsigned char i,k ; / 通用寄存器 const char table192=0X00,0XF8,0X48,0X48,0X48,0X48,0XFF,0X48, 0X48,0X48,0X48,0XFC,0X08,0X00,0X00,0X00, 0X00,0X07,0X02,0X02,0X02,0X02,0X 3F,0X42, 0X42,0X42,0X42,0X47,0X40,0X70,0X00,0X00,

10、/ 電 0X00,0X00,0XFE,0X02,0X82,0X82,0X82,0X82, 0XFE,0X82,0X82,0X82,0XC3,0X82,0X00,0X00, 0X40,0X30,0X 0F,0X40,0X40,0X40,0X40,0X40,0X 7F,0X40,0X42,0X44,0X 4C,0X60,0X40,0X00,/ 壓 0X04,0X04,0X04,0X84,0XE4,0X 3C,0X27,0X24, 0X24,0X24,0X24,0XF4,0X24,0X06,0X04,0X00, 0X4,0X2,0X1,0X0,0XFF,0X9,0X9,0X9,0X9,0X49,0X

11、89,0X 7F,0X0,0X0,0X0,0X0, / 有 0X88,0X48,0XB8,0X9,0XA,0X98,0X 2C,0X48, 0X20,0XD0,0X 1F,0X10,0X10,0XF8,0X10,0X0, 0X40,0X20,0X18,0X5,0X2,0XD,0X30,0X80, 0X80,0X41,0X36,0X8,0X37,0XC0,0X40,0X0, / 效 0X80,0X40,0X20,0XF8,0X7,0X4,0XE4,0XA4, 0XA4,0XBF,0XA4,0XA4,0XF6,0X24,0X0,0X0, 0X0,0X0,0X0,0XFF,0X40,0X40,0X

12、7F,0X 4A, 0X 4A,0X 4A,0X 4A,0X 4A,0X 7F,0X40,0X40,0X0,/值 0X10,0X22,0X64,0XC,0X80,0X44,0X44,0X64, 0X55,0X4E,0X44,0X54,0X66,0XC4,0X0,0X0, 0X4,0X4,0XFE,0X1,0X0,0X80,0X40,0X 3F,0X0,0XFF,0X0,0X 3F,0X40,0X40,0X70,0X0 / 流 ;/系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序void INITIAL()ADCON1=0X87 ; / 設(shè)置 PORTA 口和 PORTE 口為數(shù)字 I/O 口 TRISA3=

13、0 ;TRISB0=0 ;TRISE=0X00 ; / 設(shè)置液晶的 4 個(gè)控制腳為輸出/讀液晶顯示器狀態(tài)子程序void LCDSTA1()while(1)TRISD=0XFF ; / 設(shè)置 D 口為輸入RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=1 ; /R/W=1RE1=0 ; /A0=0if(RD7=0) break ; /為忙狀態(tài),則繼續(xù)等待其為空閑/ 對液晶顯示器發(fā)指令子程序(指令保存在 TRANS 寄存器中 )void TRANS1()LCDSTA1() ; / 判斷液晶是否為忙 TRISD=0X00 ; /D 口為輸出RB0=1 ; /E1=1RA3=0 ; /E2

14、=0RE0=0 ; /R/W=0RE1=0 ; /A0=0PORTD=TRANS ; /需要寫入的命令字送入數(shù)據(jù)線RB0=0 ; /E1=0 寫入指令RE0=1 ; /R/W=1/ 對液晶顯示器寫數(shù)據(jù)子程序(數(shù)據(jù)保存在 WRITE 寄存器中 )void WRITE1()TRANS=CLMADD ; /設(shè)置列地址TRANS1() ;LCDSTA1() ; / 查詢液晶是否為空閑TRISD=0X00 ; /D 口為輸出RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=0 ; /R/W=0RE1=1 ; /A0=1PORTD=WRITE ; / 需要寫入的數(shù)據(jù)放入 D 口RBO=O ;E1

15、=0,寫入數(shù)據(jù)CLMADD+ ; /列地址加 1RE0=1 ;/R/W=1/開 E1 顯示子程序void DISP1()while(1)TRANS=0XAF ;TRANS1() ; /送出控制命令LCDSTA1() ; / 判斷液晶是否為空閑TRISD=0XFF ; / 設(shè)置 D 口為輸入RB0=1 ; /E1=1RA3=0 ; /E2=0RE0=1 ; /R/W=1RE1=0 ; /A0=0 if(RD5=0) break ; /如果液晶沒被關(guān)閉,則繼續(xù)關(guān) /E1 邊清屏子程序void CLEAR1()PAGEADD=0xB8 ; / 設(shè)置頁地址代碼 for(PAGENUM=0X04 ;PA

16、GENUM0 ; PAGENUM-) TRANS=PAGEADD ;TRANS1() ;CLMADD=0x00 ; / 設(shè)置起始列 for(CLMSUM=0X50 ; CLMSUM0 ; CLMSUM-) LCDSTA1() ; / 判斷液晶是否為空閑WRITE=0X00 ;WRITE1() ; /寫入 00H 以清屏 PAGEADD+ ; / 頁號增 1/ 關(guān) E1 顯示子程序 void DISOFF1()while(1)TRANS=0XAE ;TRANS1() ; /發(fā)出控制命令LCDSTA1() ; / 判斷液晶是否為空閑TRISD=0XFF ; /D 口設(shè)置為輸入RB0=1 ; /E1

17、=1RA3=0 ; /E2=0RE0=1 ; /R/W=1RE1=0 ; /A0=0if(RD5=1) break ; /如果液晶沒被關(guān)閉,則繼續(xù)關(guān) /E1 邊初始化void lcd1()DISOFF1() ; / 關(guān)顯示 E1 TRANS=0XA4 ; / 靜態(tài)顯示驅(qū)動(dòng)TRANS1() ; /發(fā)出控制命令 TRANS=0XA9 ; / 占空比為 1/32TRANS1() ; /發(fā)出控制命令TRANS=0XE2 ; /復(fù)位TRANS1() ; /發(fā)出控制命令TRANS=0XA0 ; /ADC 選擇正常輸出TRANS1() ; /發(fā)出控制命令CLEAR1() ; /清屏LCDSTA1() ; /

18、 判斷液晶是否為空閑DISP1() ; / 開顯示/E2 邊的處理部分 /讀液晶顯示器狀態(tài)子程序 void LCDSTA2() while(1)TRISD=0XFF ; / 設(shè)置 D 口為輸入RB0=0 ; /E1=0RA3=1 ; /E2=1RE0=1 ; /R/W=1RE1=0 ; /A0=0if(RD7=0) break ; /為忙狀態(tài),則繼續(xù)等待其為空閑/ 對液晶顯示器發(fā)指令子程序指令保存在 TRANS 寄存器中 void TRANS2()LCDSTA2() ; / 判斷液晶是否為忙 TRISD=0X00 ; /D 口為輸出 RB0=0 ; /E1=0 RA3=1 ; /E2=1RE0

19、=0 ; /R/W=0RE1=0 ; /A0=0PORTD=TRANS ; /需要寫入的命令字送入數(shù)據(jù)線RA3=0 ; /E2=0 寫入指令RE0=1 ; /R/W=1/ 對液晶顯示器寫數(shù)據(jù)子程序 (數(shù)據(jù)保存在 WRITE 寄存器中 ) void WRITE2()TRANS=CLMADD ; /設(shè)置列地址TRANS2() ;LCDSTA2() ; / 查詢液晶是否為空閑TRISD=0X00 ; /D 口為輸出RB0=0 ; /E1=0RA3=1 ; /E2=1RE0=0 ; /R/W=0RE1=1 ; /A0=1PORTD=WRITE ; / 需要寫入的數(shù)據(jù)放入 D 口RA3=0 ; /E2=

20、0, 寫入數(shù)據(jù)CLMADD+ ; /列地址加 1RE0=1 ; /R/W=1/ 開 E2 顯示子程序void DISP2()while(1)TRANS=0XAF ;TRANS2() ; /送出控制命令LCDSTA2() ; / 判斷液晶是否為空閑TRISD=0XFF ; / 設(shè)置 D 口為輸入RB0=0 ; /E1=0RA3=1 ; /E2=1RE0=1 ; /R/W=1RE1=0 ; /A0=0if(RD5=0) break ; /如果液晶沒被關(guān)閉,則繼續(xù)關(guān)/E2 邊清屏子程序void CLEAR2()PAGEADD=0xB8 ; / 設(shè)置頁地址代碼 for(PAGENUM=0X04 ;PA

21、GENUM0 ; PAGENUM-) TRANS=PAGEADD ;TRANS2() ;CLMADD=0x00 ; / 設(shè)置起始列 for(CLMSUM=0X50 ; CLMSUM0 ; CLMSUM-) LCDSTA2() ; / 判斷液晶是否為空閑WRITE=0X00 ;WRITE2() ; /寫入 00H 以清屏PAGEADD+ ; / 頁號增 1/ 關(guān) E2 顯示子程序void DISOFF2()while(1)TRANS=0XAE ;TRANS2() ; /發(fā)出控制命令LCDSTA2() ; / 判斷液晶是否為空閑TRISD=0XFF ; /D 口設(shè)置為輸入RB0=0 ; /E1=0

22、RA3=1 ; /E2=1RE0=1 ; /R/W=1RE1=0 ; /A0=0 if(RD5=1) break ; /如果液晶沒被關(guān)閉,則繼續(xù)關(guān)/E2 邊初始化void lcd2()DISOFF2() ; / 關(guān)顯示 E1 TRANS=0XA4 ; / 靜態(tài)顯示驅(qū)動(dòng)TRANS2() ; /發(fā)出控制命令TRANS=0XA9 ; / 占空比為 1/32TRANS2() ; /發(fā)出控制命令TRANS=0XE2 ; /復(fù)位TRANS2() ; /發(fā)出控制命令TRANS=0XA0 ; /ADC 選擇正常輸出TRANS2() ; /發(fā)出控制命令CLEAR2() ; /清屏LCDSTA2() ; / 判斷

23、液晶是否為空閑DISP2() ; / 開顯示/LCD 的 E1 邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字 void dis1()TRANS=row ;TRANS1() ;TRANS=PAGEADD ;TRANS1() ; i=i*32 ; /i 變成數(shù)組指示指針 for(k=0 ;k16 ; k+)WRITE=tablei+k ; / 查得需要顯示的字節(jié)WRITE1() ; /在 WRITE1 子程序里面,列地址加 1CLMADD=CLMADD-16 ; /恢復(fù)列地址PAGEADD=PAGEADD+1 ;/ 頁地址加 1TRANS=PAGEADD ;TRANS1() ;for(

24、; k32 ; k+)WRITE=tablei+k ; / 查得需要顯示的字節(jié)WRITE1() ; /在 WRITE1 子程序里面,列地址已經(jīng)加 1/LCD 的 E2 邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字 void dis2()TRANS=row ;TRANS2() ;TRANS=PAGEADD ;TRANS2() ;i=i*32 ; /i 變成數(shù)組指示指針 for(k=0 ;k16 ; k+) WRITE=tablei+k ; / 查得需要顯示的字節(jié)WRITE2() ; /在 WRITE1 子程序里面,列地址已經(jīng)加 1 CLMADD=CLMADD-16 ; /恢復(fù)列地址PA

25、GEADD=PAGEADD+1 ;/ 頁地址加 1TRANS=PAGEADD ;TRANS2() ;for( ; k32 ; k+)WRITE=tablei+k ; / 查得需要顯示的字節(jié)WRITE2() ; /在 WRITE1 子程序里面,列地址已經(jīng)加 1/主程序main()INITIAL() ; /系統(tǒng)初始化 lcd1() ; /E1 邊初始化 lcd2() ; /E2 邊初始化 row=0XC0 ; /顯示起始列為第 0 行/以下顯示不同的字符PAGEADD=0XB8 ; / 顯示起始頁為第 0 頁CLMADD=0X00 ; /起始列為第 0 列i=0 ; /顯示數(shù)組中對應(yīng)的第一個(gè)字 d

26、is1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XB8 ; / 顯示起始頁為第 0 頁 CLMADD=16 ; /起始列為第 16 列 i=1 ; /顯示數(shù)組中對應(yīng)的第二個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XB8 ; / 顯示起始頁為第 0 頁CLMADD=32 ; /起始列為第 32 列i=2 ; /顯示數(shù)組中對應(yīng)的第三個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XB8 ; / 顯示起始頁為第 0 頁CLMADD=48 ; /起始列為第 48 列i=3 ; /顯示數(shù)組中對應(yīng)的第四個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XB8 ; / 顯示起始

27、頁為第 0 頁CLMADD=0 ; /起始列為第 0 列i=4 ; / 顯示數(shù)組中對應(yīng)的第五個(gè)字dis2() ; /調(diào)用 E2 邊顯示函數(shù)PAGEADD=0XBA ; /顯示起始頁為第 2 頁CLMADD=0X00 ; /起始列為第 0 列i=0 ; /顯示數(shù)組中對應(yīng)的第一個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XBA ; /顯示起始頁為第 2 頁CLMADD=16 ; /起始列為第 16 列i=5 ; /顯示數(shù)組中對應(yīng)的第六個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XBA ; /顯示起始頁為第 2 頁CLMADD=32 ; /起始列為第 32 列i=2 ; /顯

28、示數(shù)組中對應(yīng)的第三個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XBA ; /顯示起始頁為第 2 頁CLMADD=48 ; /起始列為第 48 列i=3 ; /顯示數(shù)組中對應(yīng)的第四個(gè)字dis1() ; / 調(diào)用顯示函數(shù)PAGEADD=0XBA ; /顯示起始頁為第 2 頁CLMADD=0 ; /起始列為第 0 列i=4 ; / 顯示數(shù)組中對應(yīng)的第五個(gè)字dis2() ; /調(diào)用 E2 邊顯示函數(shù)while(1)PIC 單片機(jī) C 語言編程實(shí)例 秒表程序清單該源程序已在實(shí)驗(yàn)板上調(diào)試通過,讀者可直接引用,并可利用軟件編程的靈活性,加以拓展, 實(shí) 現(xiàn)更為復(fù)雜的功能。#include #inc

29、lude /此程序?qū)崿F(xiàn)計(jì)時(shí)秒表功能,時(shí)鐘顯示范圍00.0099.99秒,分辨度:0.01秒unsigned char s0,s1,s2,s3;/定義 0.01 秒。 0.1秒。 1秒。 10秒計(jì)時(shí)器unsigned char s4 ;unsigned char k,data,sreg ; unsigned int i ;const table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90;/不帶小數(shù)點(diǎn)的顯示段碼表const table010=0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X1

30、0;/帶小數(shù)點(diǎn)的顯示段碼表/TMR0 初始化子程序void tmint()T0CS=0 ; /TMR0 工作于定時(shí)器方式PSA=1 ; /TMR0 不用分頻T0IF=0 ; / 清除 TMR0 的中斷標(biāo)志T0IE=1 ; /TMR0 中斷允許/spi 顯示初始化子程序void SPIINIT()PIR1=0 ;SSPCON=0x30 ;SSPSTAT=0xC0 ;/設(shè)置 SPI 的控制方式,允許 SSP 方式,并且時(shí)鐘下降沿發(fā)送。與 74HC595, 當(dāng)其 /SCLK 從低到高跳變時(shí),串行輸入寄存器 的特點(diǎn)相對應(yīng)TRISC=0xD7 ; /SDO 引腳為輸出, SCK 引腳為輸出TRISA5=

31、0 ; /RA5 引腳置為輸出,輸出顯示鎖存信號 /系統(tǒng)其它部分初始化子程序 void initial()TRISB1=0 ;TRISB2=0 ;TRISB4=1 ;TRISB5=1 ; / 設(shè)置與鍵盤有關(guān)的各口的輸入輸出方式RB1=0 ;RB2=0 ; /建立鍵盤掃描的初始條件/SPI 傳輸數(shù)據(jù)子程序void SPILED(data)SSPBUF=data ; /啟動(dòng)發(fā)送do5while(SSPIF=0) ;SSPIF=0;/ 顯示子程序,顯示 4 位數(shù)void dispaly()RA5=0 ; / 準(zhǔn)備鎖存 for(k=4 ;k0; k-) data=sk-1 ; if(k=3) data

32、=table0data ; /第二位需要顯示小數(shù)點(diǎn) else data=tabledata ;SPILED(data) ; / 發(fā)送顯示段碼for(k=0 ;k4; k+)data=0xFF ;SPILED(data) ; / 連續(xù)發(fā)送 4 個(gè) DARK, 使顯示好看一些RA5=1 ; / 最后給鎖存信號,代表顯示任務(wù)完成/軟件延時(shí)子程序void DELAY()for(i = 3553 ; -i;) continue ;/鍵掃描子程序void KEYSCAN()while(1)while(1) dispaly() ; / 調(diào)用一次顯示子程序 if (RB5=0)|(RB4=0) break ;

33、 DELAY() ; / 若有鍵按下,則軟件延時(shí)if (RB5=0)|(RB4=0) break ; / 若還有鍵按下,則終止循環(huán)掃描,返回 /等鍵松開子程序void keyrelax()while(1)dispaly() ; / 調(diào)用一次顯示子程序if (RB5=1)&&(RB4=1) break ; / 為防止按鍵過于靈敏,每次等鍵松開才返回/系統(tǒng)賦值初始化子程序void inizhi()s0=0x00 ;s0=s0 ;s1=0x00 ;s1=s1 ;s2=0x00 ;s2=s2 ;s3=0x00 ;s3=s3 ; /s0=s1=s2=s3=0, 并放入顯示緩沖數(shù)組中sre

34、g=0x00 ; /tmr0 中斷次數(shù)寄存器清 0/中斷服務(wù)程序void interrupt clkint(void)TMR0=0X13 ; /對 TMR0 寫入一個(gè)調(diào)整值。因?yàn)閷懭?TMR0 后接著的/ 兩個(gè)周期不能增量,中斷需要 3 個(gè)周期的響應(yīng)時(shí)間,/ 以及 C 語言自動(dòng)進(jìn)行現(xiàn)場保護(hù)要消耗周期T0IF=0 ; / 清除中斷標(biāo)志CLRWDT() ;sreg=sreg+1; / 中斷計(jì)數(shù)器加 1if(sreg=40) / 中斷次數(shù)為 40 后,才對 S0,S1,S2,S3 操作sreg=0; s0=s0+1; if(s0=10) s0=0; s1=s1+1; if(s1=10) s1=0;

35、s2=s2+1; if(s2=10) s2=0; s3=s3+1; if(s3=10) s3=0 ; s0=s0 ;s1=s1 ;s2=s2 ;s3=s3 ;/主程序main()OPTION=0XFF ;tmint() ; /TMR0 初始化SPIINIT() ; /spi 顯示初始化initial() ; / 系統(tǒng)其它部分初始化di() ; /總中斷禁止while(1)inizhi() ; / 系統(tǒng)賦值初始化KEYSCAN() ; /鍵掃描,直到開始鍵按下 keyrelax() ; / 等鍵松開 ei() ; /總中斷允許KEYSCAN() ; /鍵掃描直到停止鍵按下,在鍵掃描時(shí)有顯示 ke

36、yrelax() ; / 等鍵松開 di() ; /總中斷禁止KEYSCAN() ; /鍵掃描到清 0 鍵按下,在鍵掃描時(shí)有顯示 keyrelax() ; / 等鍵松開PIC 單片機(jī) C 語言編程實(shí)例 通用同步 /異步通信的應(yīng)用8.5 單片機(jī)雙機(jī)異步通信1 單片機(jī) PIC1 編程 ( 發(fā)送部分 )#include /* 該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是發(fā)送部分 */unsigned char tran8 ; /* 定義一個(gè)數(shù)組存儲(chǔ)發(fā)送數(shù)據(jù) */unsigned char k,data ; /* 定義通用寄存器 */charconst table20=0xc0,0xf9,0xa4,0x

37、b0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0 x 7f,0xbf,0x89,0xff ;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT()PIR1=0 ;SSPCON=0x30 ;SSPSTAT=0xC0 ;/*設(shè)置SPI的控制方式,允許 SSP方式,并且時(shí)鐘下降沿發(fā)送,與74HC595,當(dāng)其*SCLK 從低到高跳變時(shí),串行輸入寄存器 的特點(diǎn)相對應(yīng) */ TRISC=0xD7 ; /*SDO 引腳為輸出, SCK 引腳為輸出 */TRISA5=0 ; /*RA5 引腳

38、設(shè)置為輸出,以輸出顯示鎖存信號 */* 給數(shù)組賦初值子程序 */void fuzhi()for(k=0 ;k8; k+)trank=k+3 ;/*SCI 部件初始化子程序 */void sciint()SPBRG=0X19 ; /* 將傳輸?shù)牟ㄌ芈试O(shè)為約 9 600 位/秒 */TXSTA=0X04 ; /* 選擇異步高速方式傳輸 8 位數(shù)據(jù) */RCSTA=0X80 ; /* 允許同步串行口工作 */TRISC6=1 ;TRISC7=1 ; /*將 RC6.RC7 設(shè)置為輸入方式,對外部呈高阻狀態(tài) */ /*SPI 傳輸數(shù)據(jù)子程序 */void SPILED(data)SSPBUF=data

39、 ; /* 啟動(dòng)發(fā)送 */dowhile(SSPIF=0) ;SSPIF=0;/*顯示子程序,顯示 8 位數(shù) */void display()RA5=0 ; /* 準(zhǔn)備鎖存 */for(k=0 ;k8; k+)data=trank ;data=tabledata ; /* 查得顯示的段碼 */SPILED(data) ; /* 發(fā)送顯示段碼 */RA5=1 ; /* 最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */* 主程序 */main()SPIINIT() ;fuzhi() ; /* 給數(shù)組賦初值 */sciint() ; /*SCI 部件初始化 */di() ; /*中斷禁止 */TXEN=1

40、 ; /* 發(fā)送允許 */CREN=1 ; /* 接收數(shù)據(jù)允許 */for(k=0 ;k8; k+)TXREG=trank ; /* 發(fā)出一個(gè)字符 */while(1)if(TXIF=1) break ; /* 等待寫入完成 */while(1)if(RCIF=1) break ;/* 若收到響應(yīng)字節(jié),則終止等待 */RCREG=RCREG ; /* 讀響應(yīng)字節(jié),清 RCIF*/display() ; /* 顯示發(fā)送的數(shù)據(jù) */while(1)52 單片機(jī) PIC2 編程 ( 接收部分 )#include /* 該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是接收部分,并把接收的數(shù)據(jù)顯示在8* 個(gè)

41、LED 上*/unsigned char rece8 ;/* 定義一個(gè)數(shù)組存儲(chǔ)接收數(shù)據(jù) */unsigned char k,data ; /* 定義通用寄存器 */charconsttable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0 x 7f,0xbf,0x89,0xff ;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT();詳細(xì)語句見發(fā)送程序/*SCI 部件初始化子程序 */void sciint()SPBRG=0X19

42、; /* 波特率設(shè)置與 PIC1 相同,為約 9 600 位 /秒*/TXSTA=0X04 ; /* 異步高速傳輸 */RCSTA=0X80 ; /* 串行口工作使能 */TRISC6=1 ;TRISC7=1 ; /*將 RC6.RC7 設(shè)置為輸入方式,對外部呈高阻狀態(tài) */*SPI 傳送數(shù)據(jù)子程序 */void SPILED(data) ;詳細(xì)語句與見發(fā)送程序/*顯示子程序,顯示 4 位數(shù) */void display()RA5=0 ; /* 準(zhǔn)備鎖存 */for(k=0 ;k8; k+)data=recek ;data=tabledata ; /* 查得顯示的段碼 */SPILED(dat

43、a) ; /* 發(fā)送顯示段碼 */RA5=1 ; /* 最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */* 主程序 */main()SPIINIT() ; /*spi 顯示初始化 */sciint() ; /*SCI 部件初始化 */di() ; /*中斷禁止 */CREN=1 ; /* 接收允許 */TXEN=1 ; /* 發(fā)送允許 */for(k=0 ;k8; k+)while(1)if(RCIF=1) break ; /* 等待接收數(shù)據(jù) */recek=RCREG ; /* 讀取接收數(shù)據(jù),同時(shí)清掉 RCIF*/TXREG=recek ; /* 發(fā)送接收到的數(shù)據(jù) */while(1)if(TXI

44、F=1) break ; /* 等待寫入完成 */display() ; /* 顯示接收的數(shù)據(jù) */while(1)8.6 單片機(jī)雙機(jī)同步通信1 單片機(jī) PIC1 編程 ( 主控發(fā)送 )#include /*該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)同步通信功能,是主控發(fā)送部分。程序上電后顯示 * 相應(yīng)的字符,表示系統(tǒng)正常工作。發(fā)送完畢后顯示發(fā)送的數(shù)據(jù)*/unsigned char tran8 ; /* 定義一個(gè)數(shù)組存儲(chǔ)發(fā)送數(shù)據(jù) */ unsigned char k,data ; /* 定義通用寄存器 */charconst table20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0X

45、D8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0 x 7f,0xbf,0x89,0xff ;/* 不帶小數(shù)點(diǎn)的的顯示段碼表*/*spi 顯示初始化子程序 */void SPIINIT();詳細(xì)程序語句請參考本章 8.5 節(jié)/* 給發(fā)送數(shù)組賦初值子程序*/void fuzhi()for(k=0 ;k8; k+)trank=k ; /*發(fā)送07八個(gè)數(shù)據(jù)*/*SCI 部件初始化子程序 */void sciint()SPBRG=200 ; /*將傳輸?shù)牟ㄌ芈试O(shè)為約9600 位/秒*/TXSTA=0X90 ; /*選擇主控方式 */RCSTA=0X80 ; /*允

46、許同步串行口工作*/TRISC6=1 ;TRISC7=1 ; /* 將 RC6.RC7 設(shè)置為輸入方式,對外部呈高阻狀態(tài) */*SPI 傳送數(shù)據(jù)子程序 */void SPILED(data);詳細(xì)程序語句請參考本章 8.5 節(jié)/*顯示子程序,顯示 8位數(shù)*/void display()RA5=0 ; /* 準(zhǔn)備鎖存 */for(k=0 ;k8; k+)data=trank ;data=tabledata ; /* 查得顯示的段碼 */SPILED(data) ; /*發(fā)送顯示段碼 */RA5=1 ; /* 最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */*顯示子程序,顯示 8位數(shù)*/void dis

47、play1()RA5=0 ; /* 準(zhǔn)備鎖存 */for(k=0 ;k8; k+)data=0xf9 ; /* 顯示 1 表示系統(tǒng)正常工作 */SPILED(data) ; /* 發(fā)送顯示段碼 */RA5=1 ; /* 最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */* 主程序 */ main() SPIINIT() ; /*spi 顯示初始化 */ fuzhi() ; /* 給發(fā)送數(shù)組賦發(fā)送初值 */ sciint() ; /*SCI 部件初始化 */ di() ; /*中斷禁止 */TXEN=1 ; /* 發(fā)送允許 */display1() ; /* 顯示相應(yīng)的字符,表示系統(tǒng)正常*/while(

48、1)for(k=0 ;k8; k+)TXREG=trank ; /*發(fā)出一個(gè)字符 */while(1)if(TXIF=1) break ; /* 等待上一個(gè)數(shù)據(jù)寫入完成 */display() ; /* 顯示發(fā)送的數(shù)據(jù) */ /* 循環(huán)發(fā)送 */2 單片機(jī) PIC2 編程 ( 從動(dòng)接收 )#include /*該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)同步通信功能,是從動(dòng)接收部分,并把接收的數(shù)據(jù)顯*示在 8個(gè) LED 上*/unsigned char rece8 ; /* 定義一個(gè)數(shù)組存儲(chǔ)接收數(shù)據(jù) */ unsigned char k,data ; /* 定義通用寄存器 */ unsigned int i ;cha

49、rconsttable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0 x 7f,0xbf,0x89,0xff ;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT();詳細(xì)程序語句請參考本章8.5 節(jié)/*SCI 部件初始化子程序 */void sciint()TXSTA=0X10 ; /* 選擇同步從動(dòng)方式 */RCSTA=0X90 ; /* 串行口工作使能 */TRISC6=1 ;TRISC7=1 ; /*將 RC6.RC7 設(shè)置為

50、輸入方式對外部呈高阻狀態(tài) */*SPI 傳送數(shù)據(jù)子程序 */void SPILED(data);/* 詳細(xì)程序語句請參考本章8.5 節(jié) */*顯示子程序,顯示 4 位數(shù) */void display()RA5=0 ; /* 準(zhǔn)備鎖存 */for(k=0 ;k8; k+) data=recek ; data=tabledata ; /* 查得顯示的段碼 */ SPILED(data) ; /* 發(fā)送顯示段碼 */ RA5=1 ; /* 最后給一個(gè)鎖存信號,代表顯示任務(wù)完成 */* 主程序 */main()SPIINIT() ; /*spi 顯示初始化 */ sciint() ; /*SCI 部件

51、初始化 */ di() ; /*中斷禁止 */CREN=1 ; /* 接收允許 */for(k=0 ; k8 ; k+) recek=0x03 ;display() ; /* 顯示表示系統(tǒng)正常運(yùn)行的數(shù)據(jù) */while(1)while(1)CREN=1 ; /* 允許連續(xù)接收 */while(1) if(RCIF=1) break ; /* 等待接收數(shù)據(jù) */k=0; recek=RCREG ; /* 讀取接收數(shù)據(jù) */ if(OERR=1) /* 如果有溢出錯(cuò)誤,則處理 */CREN=0 ;CREN=1 ;if(recek=0x00) break ; /* “ 0為”同步字符,只有接收到 “ 0時(shí)”才進(jìn)行下面的接收 */for(k=1 ;k8; k+) while(1)if(RCIF=1) break ; /* 等待接收數(shù)據(jù) */ recek=RCREG ;/* 讀取接收數(shù)據(jù) */ if(OERR=1) /* 如果有溢出錯(cuò)誤,則處理 */CREN=0 ;CREN=1 ; recek=recek&0x 0F ;/* 屏蔽掉高位,防止干擾 */CREN=0 ; display() ; /* 顯示接收的數(shù)據(jù) */ for(i=6553

溫馨提示

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

評論

0/150

提交評論