版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PIC單片機(jī)C語(yǔ)言編程實(shí)例液晶顯示模塊編程15."2.2 MG-12232 模塊的編程下面以圖15."1 的接口電路為例。液晶顯示區(qū)域分成 E1 邊和 E2 邊,下面只含 E1 邊 的程序 (表15."1 中 E1 = 1,E2=0),E邊(表15."1 中 E仁0,E2=1 類(lèi)推。在系統(tǒng)程序的初始化部分,應(yīng)對(duì)程序中用到的寄存器和臨時(shí)變量作說(shuō)明, 如:unsigned char TRANS;unsigned char PAGEAD;D / 存放頁(yè)地址寄存器unsigned char PAGENUM;/ 存放總頁(yè)數(shù)寄存器unsigned char CLMS
2、UM; / 存放總列數(shù)寄存器unsigned char CLMADD; / 存放列地址寄存器unsigned char WRITE;/ 存放顯示數(shù)據(jù)寄存器unsigned char row;/ 存放顯示起始行寄存器unsigned char i,k;/ 通用寄存器/ 系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序void INITIAL()ADCON1=OX87 設(shè)置 PORTA口禾口 PORTED為數(shù)字 I/O 口 TRISA3=0;TRISB0=0;TRISE=0X0;0 /設(shè)置液晶的 4個(gè)控制腳為輸出 /讀液晶顯示器狀態(tài)子程序void LCDSTA1()while(1)TRISD=0XF; /設(shè)置D
3、 口為輸入RB0=1; /E1=1RA3=0; /E2=0RE0=1; /R/W=1RE1=0; /A0=0if(RD7=0) break /為忙狀態(tài),則繼續(xù)等待其為空閑/對(duì)液晶顯示器發(fā)指令子程序(指令保存在TRANS寄存器中)void TRANS1()LCDSTA1()/判斷液晶是否為忙TRISD=0X00 / 置 D 口為輸出RB0=1;/E1=1RA3=0;/E2=0RE0=0;/R/W=0RE1=0;/A0=0PORTD=TRANS/需要寫(xiě)入的命令字送入數(shù)據(jù)線RB0=0;/E1=0 寫(xiě)入指令RE0=1; R/W=1對(duì)液晶顯示器寫(xiě)數(shù)據(jù)子程序(數(shù)據(jù)保存在 WRITE寄存器void WRIT
4、E1()TRANS二CLMADD/ 設(shè)置列地址TRANS1()LCDSTA1() /查詢(xún)液晶是否為空閑TRISD=0X00 /D 口為輸出RB0=1;/E1=1RA3=0;/E2=0RE0=0;/R/W=0RE1=1;/A0=1PORTD二WRITE/需要寫(xiě)入的數(shù)據(jù)放入 D 口RB0=Q E1=0,寫(xiě)入數(shù)據(jù)CLMADD+ /列地址力口 1RE0=1 /R/W=1/ 開(kāi) E1 顯示子程序void DISP1()while(1)TRANS=0XAFTRANS1() /送出控制命令LCDSTA1() /判斷液晶是否為空閑TRISD=OXFF /設(shè)置D 口為輸入RB0=1 /E1=1RA3=0 /E2
5、=0RE0=1;/R/W=1RE1=0;/A0=0if(RD5=0) break;/ 如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān) /E1 邊清屏子程序void CLEAR1()PAGEADD=0x;B8/ 設(shè)置頁(yè)地址代碼for(PAGENUM=0X04;PAGENUM>0;PAGENUM-)TRANS=PAGEAD;DTRANS1(;)CLMADD=0x00;/ 設(shè)置起始列for(CLMSUM=0X50; CLMSUM>0; CLMSUM-)LCDSTA1(;) / 判斷液晶是否為空閑WRITE=0X00;WRITE1() / 寫(xiě)入 OOH 以清屏PAGEADD+/ 頁(yè)號(hào)增 1/ 關(guān) E1 顯示子
6、程序void DISOFF1()while(1)TRANS=OXA;ETRANS1(;) /發(fā)出控制命令LCDSTA1(;) /判斷液晶是否為空閑TRISD=OXF;F/D 口設(shè)置為輸入RBO=1;/E1=1RA3=O;/E2=ORE0=1;/R/W=1RE1=0;/A0=0if(RD5=1) break;/ 如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān) 有了以上的通用子程序,就可以構(gòu)造出各種顯示程序,如字符。漢字。曲線等。執(zhí)行這些程序前,必須對(duì)液晶進(jìn)行初始化。初始化的順序?yàn)椋宏P(guān)顯示t正常顯示驅(qū)動(dòng)設(shè)置 t占空比設(shè)置t復(fù)位tADC選擇t清屏t開(kāi)顯示,程序如下:/E1 邊初始化void lcd1()DISOFF1(
7、;) / 關(guān)顯示 E1TRANS=0XA;4 / 靜態(tài)顯示驅(qū)動(dòng)TRANS1(;) / 發(fā)出控制命令TRANS=0XA;9 / 占空比為 1/32TRANS1(;) / 發(fā)出控制命令TRANS=0XE;2 / 復(fù)位TRANS1(;) / 發(fā)出控制命令TRANS=0XA;0 /ADC 選擇正常輸出TRANS1(;) / 發(fā)出控制命令CLEAR1(;) / 清屏LCDSTA1(;) / 判斷液晶是否為空閑DISP1(;) / 開(kāi)顯示15."4 程序清單下面給出一個(gè)已經(jīng)在模板上調(diào)試通過(guò)的程序。注意在調(diào)試該程序時(shí),需把 模板上的J9跳針短接。#include <pic.h>/ 該程
8、序用于液晶顯示功能的演示/ 運(yùn)行程序后,液晶上顯示 "電流有效值 "和 "電壓有效值 "字樣/ 系統(tǒng)總的初始化子程序unsigned char TRANS;unsigned char PAGEAD;D / 存放頁(yè)地址寄存器unsigned char PAGENUM; / 存放總頁(yè)數(shù)寄存器unsigned char CLMSUM; / 存放總列數(shù)寄存器unsigned char CLMADD; / 存放列地址寄存器 unsigned char WRITE;/ 存放顯示數(shù)據(jù)寄存器 unsigned char row;/ 存放顯示起始行寄存器 unsigned
9、 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,電"0X00,0X00,0XFE,0X02,0X82,0X82,0X82,0X82,0XFE,0X82,0X82,0X82,0XC3,0X82,0X00,0X00, 0X40,0X30,0
10、X 0F,0X40,0X40,0X40,0X40,0X40,OX 7F,0X40,0X42,0X44,0X 4C,0X60,0X40,0X00壓" 0X04,0X04,0X04,0X84,0XE4,0X 3C,0X27,0X24, OX24,OX24,OX24,OXF4,OX24,OXO6,OXO4,OXOO, OX4,OX2,OX1,OXO,OXFF,OX9,OX9,OX9,OX9,OX49,OX89,OX 7F,OXO,OXO,OXO,OXO, 有/""OX88,OX48,OXB8,OX9,OXA,OX98,OX 2C,OX48,OX2O,OXDO,OX 1F
11、,OX1O,OX1O,OXF8,OX1O,OXO,OX4O,OX2O,OX18,OX5,OX2,OXD,OX3O,OX8O,OX8O,OX41,OX36,OX8,OX37,OXCO,OX4O,OXO, 效/""OX8O,OX4O,OX2O,OXF8,OX7,OX4,OXE4,OXA4,OXA4,OXBF,OXA4,OXA4,OXF6,OX24,OXO,OXO,OXO,OXO,OXO,OXFF,OX4O,OX4O,OX 7F,OX 4A,OX 4A,0X 4A,0X 4A,0X 4A,0X 7F,0X40,0X40,0X0值"OX1O,OX22,OX64,OXC,O
12、X8O,OX44,OX44,OX64,OX55,OX4E,OX44,OX54,OX66,OXC4,OXO,OXO,OX4,OX4,OXFE,OX1,OXO,OX8O,OX4O,OX 3F,OXO,OXFF,OXO,OX 3F,0X40,0X40,0X70,0X0流;/ 系統(tǒng)各口的輸入輸出狀態(tài)初始化子程序void INITIAL()ADCON1=0X87 設(shè)置 PORTA口禾口 PORTED為數(shù)字 I/O 口TRISA3=O;TRISB0=0;TRISE=0X0;0 /設(shè)置液晶的 4個(gè)控制腳為輸出 /讀液晶顯示器狀態(tài)子程序 void LCDSTA1()while(1)TRISD=OXF; /設(shè)置
13、D 口為輸入RB0=1; /E1=1RA3=0; /E2=0RE0=1; /R/W=1RE1=0; /A0=0if(RD7=0) break 為忙狀態(tài),則繼續(xù)等待其為空閑/對(duì)液晶顯示器發(fā)指令子程序(指令保存在TRANS寄存器中)void TRANS1()LCDSTA1()判斷液晶是否為忙TRISD=0X00 /D 口為輸出RB0=1;/E1=1RA3=0;/E2=0RE0=0;/R/W=0RE1=0;/A0=0PORTD二TRANS/需要寫(xiě)入的命令字送入數(shù)據(jù)線RB0=0;/E1=0 寫(xiě)入指令RE0=1; R/W=1對(duì)液晶顯示器寫(xiě)數(shù)據(jù)子程序(數(shù)據(jù)保存在 WRITE寄存器void WRITE1()
14、TRANS=CLMAD;D/ 設(shè)置列地址TRANS1(;)LCDSTA1(;) / 查詢(xún)液晶是否為空閑TRISD=0X0;0 /D 口為輸出RB0=1;/E1=1RA3=0;/E2=0RE0=0;/R/W=0RE1=1;/A0=1PORTD二WRIT;/需要寫(xiě)入的數(shù)據(jù)放入 D 口RB0=Q E1=0,寫(xiě)入數(shù)據(jù)CLMADD+; /列地址加 1R E 0 = 1; /R/W= 1 / 開(kāi) E1 顯示子程序void DISP1()while(1)TRANS=0XAFTRANS1() /送出控制命令LCDSTA1() /判斷液晶是否為空閑TRISD=OXFF /設(shè)置D 口為輸入RB0=1;/E1=1R
15、A3=0;/E2=0RE0=1;/R/W=1RE1=0;/A0=0if(RD5=0) break;/ 如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān) /E1 邊清屏子程序void CLEAR1()PAGEADD=0x;B8/ 設(shè)置頁(yè)地址代碼for(PAGENUM=0X04;PAGENUM>0;PAGENUM-)TRANS=PAGEAD;DTRANS1(;)CLMADD=0x00;/ 設(shè)置起始列for(CLMSUM=0X50; CLMSUM>0; CLMSUM-)LCDSTA1(;) / 判斷液晶是否為空閑WRITE=0X00;WRITE1() / 寫(xiě)入 OOH 以清屏PAGEADD+/ 頁(yè)號(hào)增 1/
16、關(guān) E1 顯示子程序void DISOFF1()while(1)TRANS=OXA;ETRANS1(;) /發(fā)出控制命令LCDSTA1(;) /判斷液晶是否為空閑TRISD=OXF;F/D 口設(shè)置為輸入RBO=1;/E1=1RA3=O;/E2=ORE0=1;/R/W=1RE1=0;/A0=0if(RD5=1) break;/ 如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān) /E1 邊初始化void lcd1()DISOFF1(;) / 關(guān)顯示 E1TRANS=0XA;4 / 靜態(tài)顯示驅(qū)動(dòng)TRANS1(;) / 發(fā)出控制命令TRANS=0XA;9 / 占空比為 1/32TRANS1(;) / 發(fā)出控制命令TRANS
17、=0XE;2 / 復(fù)位TRANS1(;) / 發(fā)出控制命令TRANS=0XA;0 /ADC 選擇正常輸出TRANS1(;) / 發(fā)出控制命令CLEAR1(;) / 清屏LCDSTA1(;) / 判斷液晶是否為空閑DISP1(;) / 開(kāi)顯示 /E2 邊的處理部分/ 讀液晶顯示器狀態(tài)子程序void LCDSTA2()while(1)TRISD=OXF; /設(shè)置D 口為輸入RB0=0; /E1=0RA3=1;/E2=1RE0=1;/R/W=1RE1=0;/A0=0if(RD7=0) break;/ 為忙狀態(tài),則繼續(xù)等待其為空閑 /對(duì)液晶顯示器發(fā)指令子程序指令保存在 TRANS寄存器中void TR
18、ANS2()LCDSTA2()判斷液晶是否為忙TRISD=0X00 /D 口為輸出RB0=0;/E1=0RA3=1; /E2=1RE0=0;/R/W=0RE1=0;/A0=0PORTD二TRANS/需要寫(xiě)入的命令字送入數(shù)據(jù)線RA3=0;/E2=0 寫(xiě)入指令RE0=1; R/W=1對(duì)液晶顯示器寫(xiě)數(shù)據(jù)子程序(數(shù)據(jù)保存在 WRITE寄存器void WRITE2()關(guān)E2顯示子程序void DISOFF2()while(1)TRANS=0XAETRANS2() /發(fā)出控制命令LCDSTA2() /判斷液晶是否為空閑TRISD=0XF;F /D 口設(shè)置為輸入RB0=0;/E1=0RA3=1;/E2=1R
19、E0=1;/R/W=1RE1=0;/A0=0if(RD5=1) break;/ 如果液晶沒(méi)被關(guān)閉,則繼續(xù)關(guān) /E2 邊初始化void lcd2()DISOFF2(;) / 關(guān)顯示 E1TRANS=0XA;4 / 靜態(tài)顯示驅(qū)動(dòng)TRANS2(;) / 發(fā)出控制命令TRANS=0XA;9 / 占空比為 1/32TRANS2(;) / 發(fā)出控制命令TRANS=0XE;2 / 復(fù)位TRANS2(;) / 發(fā)出控制命令TRANS=0XA;0 /ADC 選擇正常輸出TRANS2(;) / 發(fā)出控制命令CLEAR2(;) / 清屏LCDSTA2(;) / 判斷液晶是否為空閑DISP2() /開(kāi)顯示/LCD的E
20、1邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字void dis1()TRANS=row;TRANS1(;)TRANS=PAGEAD;DTRANS1(;)i=i*32 ;/i 變成數(shù)組指示指針for(k=0;k<16;k+)WRITE=tablei+k;/ 查得需要顯示的字節(jié)WRITE1() / 在 WRITE1 子程序里面,列地址加 1CLMADD二CLMADD-1;/ 恢復(fù)列地址PAGEADD=PAGEADD;+1/ 頁(yè)地址加 1TRANS=PAGEAD;DTRANS1(;)for(; k<32; k+)WRITE=tablei+k; / 查得需要顯示的字節(jié)WRITE1
21、() /在WRITE1子程序里面,列地址已經(jīng)加 1/LCD的E2邊顯示函數(shù),調(diào)用一次該函數(shù),則在相應(yīng)的位置顯示相應(yīng)的字void dis2()TRANS=row;TRANS2(;)TRANS=PAGEAD;DTRANS2(;)i=i*32; /i 變成數(shù)組指示指針for(k=0; k<16; k+)WRITE=tablei+k;/ 查得需要顯示的字節(jié)WRITE2() /在WRITE1子程序里面,列地址已經(jīng)加 1CLMADD二CLMADD- 16;/ 恢復(fù)列地址PAGEADD二PAGEADD+1/ 頁(yè)地址加 1TRANS=PAGEAD;DTRANS2(;)for(;k<32;k+)WR
22、ITE=tablei+k;/ 查得需要顯示的字節(jié)WRITE2() /在WRITE1子程序里面,列地址已經(jīng)加 1/ 主程序main()INITIAL();/ 系統(tǒng)初始化lcd1 ();/E 1 邊初始化lcd2();/E2 邊初始化row=0XC0;/ 顯示起始列為第 0 行/ 以下顯示不同的字符PAGEADD=OXB;顯示起始頁(yè)為第0頁(yè)CLMADD=0X00; / 起始列為第 0列i=0; / 顯示數(shù)組中對(duì)應(yīng)的第一個(gè)字dis1(); / 調(diào)用顯示函數(shù)PAGEADD=0XB; /顯示起始頁(yè)為第0頁(yè)CLMADD=16; / 起始列為第 16列i=1; / 顯示數(shù)組中對(duì)應(yīng)的第二個(gè)字 dis1();/
23、 調(diào)用顯示函數(shù)PAGEADD=0XB;8 /顯示起始頁(yè)為第 0頁(yè) CLMADD=32;/ 起始列為第 32 列 i=2; / 顯示數(shù)組中對(duì)應(yīng)的第三個(gè)字 dis1();/ 調(diào)用顯示函數(shù)PAGEADD=0XB;8 /顯示起始頁(yè)為第 0頁(yè) CLMADD=48;/ 起始列為第 48 列 i=3; / 顯示數(shù)組中對(duì)應(yīng)的第四個(gè)字 dis1();/ 調(diào)用顯示函數(shù)PAGEADD=0XB;8 /顯示起始頁(yè)為第 0頁(yè) CLMADD=0;/ 起始列為第 0 列 i=4; / 顯示數(shù)組中對(duì)應(yīng)的第五個(gè)字 dis2();/ 調(diào)用 E2 邊顯示函數(shù) PAGEADD=0XB;A /顯示起始頁(yè)為第 2 頁(yè) CLMADD=0X0
24、0;/ 起始列為第 0 列 i=0; / 顯示數(shù)組中對(duì)應(yīng)的第一個(gè)字 dis1();/ 調(diào)用顯示函數(shù)PAGEADD=0XB;A /顯示起始頁(yè)為第 2 頁(yè)CLMADD=16;/ 起始列為第 16 列 i=5; / 顯示數(shù)組中對(duì)應(yīng)的第六個(gè)字dis1();/ 調(diào)用顯示函數(shù)PAGEADD=0XB;A /顯示起始頁(yè)為第 2 頁(yè)CLMADD=32;/ 起始列為第 32 列i=2; / 顯示數(shù)組中對(duì)應(yīng)的第三個(gè)字dis1();/ 調(diào)用顯示函數(shù)PAGEADD=0XB;A /顯示起始頁(yè)為第 2 頁(yè)CLMADD=48;/ 起始列為第 48 列i=3; / 顯示數(shù)組中對(duì)應(yīng)的第四個(gè)字dis1();/ 調(diào)用顯示函數(shù)PAGE
25、ADD=0XB;A /顯示起始頁(yè)為第 2 頁(yè)CLMADD=0;/ 起始列為第 0 列i=4; / 顯示數(shù)組中對(duì)應(yīng)的第五個(gè)字dis2();/ 調(diào)用 E2 邊顯示函數(shù)while(1); PIC單片機(jī)C語(yǔ)言編程實(shí)例一一秒表程序清單該源程序已在實(shí)驗(yàn)板上調(diào)試通過(guò),讀者可直接引用,并可利用軟件編程的 靈活性,加以拓展,實(shí)現(xiàn)更為復(fù)雜的功能。#include <pic.h>#include <math.h>/ 此程序?qū)崿F(xiàn)計(jì)時(shí)秒表功能,時(shí)鐘顯示范圍00."00 99."99 秒,分辨度:0."01秒unsigned char s0,s1,s2,s;3/ 定義
26、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,0X;10/ 帶小數(shù)點(diǎn)的顯示段碼表/TMR0 初始化子程序void tmint()T0CS=0;/TMR0 工作于定時(shí)器方式PSA=1; /T
27、MR0 不用分頻TOIF=0 /清除TMRO的中斷標(biāo)志T0IE=1; /TMR0 中斷允許 /spi 顯示初始化子程序void SPIINIT()PIR1=;0SSPCON=0x3;0SSPSTAT=0xC;0/設(shè)置SPI的控制方式,允許SSP方式,并且時(shí)鐘下降沿發(fā)送。與"74HC595, 當(dāng)其/SCLK從低到高跳變時(shí),串行輸入寄存器"的特點(diǎn)相對(duì)應(yīng)TRISC=0xD7 /SDO引腳為輸出,SCK引腳為輸出TRISA5=0;/RA5 引腳置為輸出,輸出顯示鎖存信號(hào) /系統(tǒng)其它部分初始化 子程序void initial()TRISB1=0;TRISB2=0;TRISB4=1;T
28、RISB5=1 /設(shè)置與鍵盤(pán)有關(guān)的各口的輸入輸出方式RB1=0;RB2=Q /建立鍵盤(pán)掃描的初始條件/SPI傳輸數(shù)據(jù)子程序void SPILED(data)SSPBUF二data/ 啟動(dòng)發(fā)送do;while(SSPIF=0)SSPIF=0 /顯示子程序,顯示 4位數(shù)void dispaly()RA5=Q / 準(zhǔn)備鎖存for(k=4;k>0;k-)data=sk-1;if(k=3) data二tableOdata ; / 第二位需要顯示小數(shù)點(diǎn)else data=tabledata;SPILED(data) /發(fā)送顯示段碼 for(k=0;k<4;k+)data=0xFF;SPILED
29、(data) /連續(xù)發(fā)送4個(gè)DARK使顯示好看一些RA5=1; /最后給鎖存 信號(hào),代表顯示任務(wù)完成 /軟件延時(shí)子程序void DELAY()for(i = 3553 -i; ) continue; / 鍵掃描子程序void KEYSCAN()while(1)while(1)dispaly();/ 調(diào)用一次顯示子程序if (RB5=0)|(RB4=0) break;DELAY() /若有鍵按下,則軟件延時(shí)if (RB5=0)|(RB4=0) break /若還有鍵按下,則終止循環(huán)掃描,返回/ 等鍵松開(kāi)子程序void keyrelax()while(1)dispaly(); /調(diào)用一次顯示子程序
30、if (RB5=1)(RB4=1) break /為防止按鍵過(guò)于靈敏,每次等鍵松開(kāi)才返回 /系統(tǒng)賦值初始化子程序void inizhi()s0=0x00;s0=s0;s1=0x00;s1=s1;s2=0x00;s2=s2;s3=0x00;s3=s3; sO二s1=s2=s3=0并放入顯示緩沖數(shù)組中sreg=0x00; /tmr0 中斷次數(shù)寄存器清 0/ 中斷服務(wù)程序void interrupt clkint(void)TMR0=0X13; / 對(duì) TMRO 寫(xiě)入一個(gè)調(diào)整值。因?yàn)閷?xiě) 入TMR0后接著的/ 兩個(gè)周期不能增量,中斷需要 3個(gè)周期的響應(yīng)時(shí)間,/以及C語(yǔ)言自動(dòng)進(jìn)行現(xiàn)場(chǎng)保護(hù)要消耗周期T0I
31、F=0; / 清除中斷標(biāo)志CLRWDT(;)sreg=sreg+1; / 中斷計(jì)數(shù)器加 1if(sreg=40)/中斷次數(shù)為 40 后,才對(duì) S0,S1,S2,S操作sreg=O;s0=s0+1;if(s0=10)s0=0;s1=s1+1;if(s1=10)s1=0;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=0XF;F tmint() ;/TMR0 初始化 SPIINIT(;) /spi 顯示初始化 initial() ;/ 系統(tǒng)其它部分初始化 di();/
32、總中斷禁止 while(1)inizhi();/ 系統(tǒng)賦值初始化KEYSCAN;() / 鍵掃描,直到開(kāi)始鍵按下 keyrelax();/ 等鍵松開(kāi) ei(); / 總中斷允許KEYSCAN;() / 鍵掃描直到停止鍵按下,在鍵掃描時(shí)有顯示 keyrelax();/ 等鍵松開(kāi) di();/ 總中斷禁止KEYSCAN;() / 鍵掃描到清 0鍵按下,在鍵掃描時(shí)有顯示 keyrelax();/ 等鍵松開(kāi) PIC單片機(jī)C語(yǔ)言編程實(shí)例一一通用同步/異步通信的應(yīng)用8.5 單片機(jī)雙機(jī)異步通信1單片機(jī)PIC1編程(發(fā)送部分)#include <pic.h>/* 該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,
33、該程序是發(fā)送部分 */unsigned char tran8;/* 定義一個(gè)數(shù)組存儲(chǔ)發(fā)送數(shù)據(jù) */unsigned char k,data;/* 定義通用寄存器 */constx 7f,0xbf,0x89,0xff;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT()PIR1=;0SSPCON=0x3;0SSPSTAT=0xC;0/*設(shè)置SPI的控制方式,允許SSP方式,并且時(shí)鐘下降沿發(fā)送,與"74HC595當(dāng)其*SCLK從低到高跳變時(shí),串行輸入寄存器"的特點(diǎn)相對(duì)應(yīng)*/TRISC=0xD7 /*SDO弓I腳為輸出,SCK引腳為輸出*
34、/TRISA5=0;/*RA5 引腳設(shè)置為輸出,以輸出顯示鎖存信號(hào) */* 給數(shù)組賦初值 子程序*/void fuzhi()for(k=0; k<8;k+)trank=k+3;/*SCI 部件初始化子程序 */void sciint()SPBRG=0X1;9 /*將傳輸?shù)牟ㄌ芈试O(shè)為約 9 600位/秒*/TXSTA=0X0;4 /* 選擇異步高速方式傳輸 8 位數(shù)據(jù)*/RCSTA=0X8;0 /* 允許同步串行口工作 */TRISC6=;1TRISC7=;1 /* 將 RC6."RC7設(shè)置為輸入方式,對(duì)外部呈高阻狀態(tài)*/*SPI傳輸數(shù)據(jù)子程序*/void SPILED(data
35、)SSPBUF二data/* 啟動(dòng)發(fā)送 */dochartable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0while(SSPIF=;0)SSPIF=;0 /*顯示子程序,顯示 8位數(shù)*/void display()RA5=0; /*準(zhǔn)備鎖存 */for(k=0; k<8; k+)data=trank;data二tabledata ; /*查得顯示的段碼*/SPILED(data) /*發(fā)送顯示段碼*/RA5=1 ; /*最后給一個(gè)鎖存信號(hào),代表顯示 任務(wù)完成
36、*/* 主程序*/main()SPIINIT(;)fuzhi(); /*給數(shù)組賦初值 */sciint(); /*SCI 部件初始化 */di(); /* 中斷禁止 */TXEN=1; /* 發(fā)送允許 */CREN=1; /* 接收數(shù)據(jù)允許 */for(k=0 ; k<8; k+)TXREG=trank; /*發(fā)出一個(gè)字符 */while(1)if(TXIF=1) break; /* 等待寫(xiě)入完成 */while(1)if(RCIF=1) break /*若收到響應(yīng)字節(jié),則終止等待 */RCREG=RCREG/*讀 響應(yīng)字節(jié),清RCIF*/display(); /*顯示發(fā)送的數(shù)據(jù)*/wh
37、ile(1); 2單片機(jī)PIC2編程(接收部分)#include <pic.h>/* 該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)異步通信功能,該程序是接收部分,并把接收的 數(shù)據(jù)顯示在8*個(gè)LED上*/unsigned char rece8;/* 定義一個(gè)數(shù)組存儲(chǔ)接收數(shù)據(jù) */unsigned char k,data;/* 定義通用寄存器 */constx 7f,0xbf,0x89,0xff;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT(); 詳細(xì)語(yǔ)句見(jiàn)發(fā)送程序 /*SCI 部件初始化子程序 */void sciint()SPBRG=0X1;/* 波特率設(shè)置與
38、 PIC1 相同,為約 9 600 位/秒*/TXSTA=0X0;4 /* 異步高速傳輸 */RCSTA=0X8;0 /*串行口工作使能 */TRISC6=;1TRISC7=;1 /*將 RC6."RC7設(shè)置為輸入方式,對(duì)外部呈高阻狀態(tài)*/*SPI傳送數(shù)據(jù)子程序*/void SPILED(data); 詳細(xì)語(yǔ)句與見(jiàn)發(fā)送程序 /*顯示子程序,顯示 4位數(shù)*/void display()RA5=0; /*準(zhǔn)備鎖存 */for(k=0; k<8; k+)data=recek;data=tabledata ; /* 查得顯示的段碼 */SPILED(data;) /*發(fā)送顯示段碼 */
39、RA5=1 ; /*最后給一個(gè)鎖存信號(hào),代表顯示 任務(wù)完成 */* 主程序*/main()SPIINIT(;) /*spi 顯示初始化 */sciint(); /*SCI 部件初始化 */di(); /* 中斷禁止 */CREN=1; /* 接收允許 */TXEN=1 /*發(fā)送允許*/for(k=0;k<8;k+)while(1)chartable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0if(RCIF=1) break /* 等待接收數(shù)據(jù) */recek=RCR
40、EG;/* 讀取接收數(shù)據(jù),同時(shí)清掉 RCIF*/TXREG=recek /*發(fā)送接收到的數(shù)據(jù) */while(1)if(TXIF=1) break; /* 等待寫(xiě)入完成 */display() ; /* 顯示接收的數(shù)據(jù) */while(1);8.6 單片機(jī)雙機(jī)同步通信1單片機(jī)PIC1編程(主控發(fā)送)#include <pic.h>/* 該程序?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; /*
41、 定義通用寄存器 */constx 7f,0xbf,0x89,0xff;/* 不帶小數(shù)點(diǎn)的的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT(); 詳細(xì)程序語(yǔ)句請(qǐng)參考本章8."5 節(jié) /* 給發(fā)送數(shù)組賦初值子程序 */void fuzhi()for(k=0; k<8;k+)trank=k ; /*發(fā)送07八個(gè)數(shù)據(jù)*/*SCI部件初始化子程序*/void sciint()SPBRG=20;0 /* 將傳輸?shù)牟ㄌ芈试O(shè)為約 9600 位/秒*/TXSTA=0X9;0 /* 選擇主控方式 */RCSTA=0X8;0 /* 允許同步串行口工作 */TRISC6=;
42、1TRISC7=;1 /*將 RC6."RC7設(shè)置為輸入方式,對(duì)外部呈高阻狀態(tài)*/chartable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0x c6,0xa1,0x86,0x8e,0/*SPI 傳送數(shù)據(jù)子程序 */void SPILED(data); 詳細(xì)程序語(yǔ)句請(qǐng)參考本章8."5 節(jié) /* 顯示子程序,顯示 8 位數(shù) */void display()RA5=0;/* 準(zhǔn)備鎖存 */for(k=0;k<8;k+)data=trank ;data=tabledata ;/* 查得顯示
43、的段碼 */SPILED(data;) /* 發(fā)送顯示段碼 */RA5=1; /* 最后給一個(gè)鎖存信號(hào),代表顯示 任務(wù)完成 */* 顯示子程序,顯示 8 位數(shù) */void display1()RA5=0; /*準(zhǔn)備鎖存 */for(k=0;k<8;k+)data=0xf9;/* 顯示 "1"表示系統(tǒng)正常工作 */SPILED(data;) /* 發(fā)送顯示段碼 */RA5=1; /* 最后給一個(gè)鎖存信號(hào),代表顯示 任務(wù)完成 */* 主程序 */main()SPIINIT(;) /*spi 顯示初始化 */fuzhi();/* 給發(fā)送數(shù)組賦發(fā)送初值 */sciint()
44、; /*SCI 部件初始化 */di(); /* 中斷禁止 */TXEN=1; /* 發(fā)送允許 */display1(); /* 顯示相應(yīng)的字符,表示系統(tǒng)正常 */while(1)for(k=0 ; k<8; k+)TXREG=trank; /*發(fā)出一個(gè)字符 */while(1)if(TXIF=1) break; /* 等待上一個(gè)數(shù)據(jù)寫(xiě)入完成 */display() ; /* 顯示發(fā)送的數(shù)據(jù) */ /*循環(huán)發(fā)送*/2單片機(jī)PIC2編程(從動(dòng)接收)#include <pic.h>/* 該程序?qū)崿F(xiàn)單片機(jī)雙機(jī)同步通信功能,是從動(dòng)接收部分,并把接收的數(shù) 據(jù)顯*示在8個(gè)LED上*/un
45、signed char rece8;/* 定義一個(gè)數(shù)組存儲(chǔ)接收數(shù)據(jù) */unsigned char k,data; /* 定義通用寄存器 */unsigned int i;constx 7f,0xbf,0x89,0xff;/* 不帶小數(shù)點(diǎn)的顯示段碼表 */*spi 顯示初始化子程序 */void SPIINIT(); 詳細(xì)程序語(yǔ)句請(qǐng)參考本章8."5 節(jié) /*SCI 部件初始化子程序 */void sciint()TXSTA=0X1;0 /* 選擇同步從動(dòng)方式 */RCSTA=0X9;0 /* 串行口工作使能 */TRISC6=;1TRISC7=;1 /*將 RC6."RC7
46、設(shè)置為輸入方式對(duì)外部呈高阻狀態(tài)*/*SPI傳送數(shù)據(jù)子程序*/void SPILED(data); /* 詳細(xì)程序語(yǔ)句請(qǐng)參考本章8."5 節(jié)*/* 顯示子程序,顯示 4 位數(shù)*/void display()RA5=0;/* 準(zhǔn)備鎖存 */for(k=0;k<8;k+)data=recek;data=tabledata ;/* 查得顯示的段碼 */SPILED(data) /*發(fā)送顯示段碼*/RA5=1 ; /*最后給一個(gè)鎖存信號(hào),代表顯示 任務(wù)完成 */* 主程序*/main()chartable20=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8
47、,0x80,0x90,0x88 ,0x83,0xc6,0xa1,0x86,0x8e,0SPIINIT(;) /*spi 顯示初始化 */sciint() ; /*SCI 部件初始化 */di(); /* 中斷禁止 */CREN=1; /* 接收允許 */for(k=0; k<8; 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=
48、1) /*如果有溢出錯(cuò)誤,則處理 */CREN=0;CREN=1; if(recek=0x00) break;/* “ 0為”同步字符,只有接收到 “ 0時(shí)”才 進(jìn)行下面的接收 */for(k=1 ; k<8; k+)while(1)if(RCIF=1) break; /* 等待接收數(shù)據(jù) */recek=RCREG;/* 讀取接收數(shù)據(jù) */if(OERR=1) /*如果有溢出錯(cuò)誤,則處理 */CREN=0;CREN=1;recek=recek0x 0F;/* 屏蔽掉高位,防止干擾 */CREN=0;display();/* 顯示接收的數(shù)據(jù) */for(i=65535;-i;)continue;for(i=65535;-i;)continue; /* 給予一定時(shí)間的延時(shí),再進(jìn)行下一輪接收 */8.7單片機(jī)與PC機(jī)通信1 PC機(jī)編程PC采用Toubr C進(jìn)行編寫(xiě)。程序如下:#include<stdio.h>#define port 0x 3f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《護(hù)理康復(fù)評(píng)定上》課件
- 2021屆天津市楊村一中、寶坻一中等四校高一下學(xué)期期末聯(lián)考化學(xué)試題
- 《綜合醫(yī)院評(píng)審概述》課件
- 小學(xué)四年級(jí)數(shù)學(xué)小數(shù)加減法計(jì)算題練習(xí)卷
- 《汽車(chē)車(chē)型解析》課件
- 電焊管道焊接技術(shù)
- 美食烹飪行業(yè)調(diào)味技巧培訓(xùn)實(shí)踐
- 物流行業(yè)倉(cāng)儲(chǔ)管理心得總結(jié)
- 電影院服務(wù)員的服務(wù)技巧
- 印刷行業(yè)采購(gòu)工作心得
- 中建醫(yī)療工程交付指南
- 譯林版小學(xué)英語(yǔ)二年級(jí)上全冊(cè)教案
- DL∕T 821-2017 金屬熔化焊對(duì)接接頭射線檢測(cè)技術(shù)和質(zhì)量分級(jí)
- DL∕ T 1195-2012 火電廠高壓變頻器運(yùn)行與維護(hù)規(guī)范
- 小學(xué)五年級(jí)英語(yǔ)語(yǔ)法練習(xí)
- NB-T32004-2018光伏并網(wǎng)逆變器技術(shù)規(guī)范
- 領(lǐng)導(dǎo)與班子廉潔談話記錄(4篇)
- 衡陽(yáng)市耒陽(yáng)市2022-2023學(xué)年七年級(jí)上學(xué)期期末語(yǔ)文試題【帶答案】
- 文庫(kù)發(fā)布:strata手冊(cè)
- 2024-2030年中國(guó)大棚蔬菜種植行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資前景展望報(bào)告
- 旋挖鉆孔灌注樁施工技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論