




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、j i a n g s u u n i v e r s i t ysoc單片機(jī)原理與應(yīng)用課程設(shè)計(jì)報(bào)告 學(xué)院名稱(chēng): 計(jì)算機(jī)科學(xué)與通信工程學(xué)院 專(zhuān)業(yè)班級(jí): 計(jì) 算 機(jī) 0802 一、設(shè)計(jì)題目:液晶點(diǎn)陣顯示屏程序設(shè)計(jì)二、設(shè)計(jì)要求:1)從下到上滾動(dòng)顯示:“江蘇大學(xué)計(jì)算機(jī)學(xué)院”然后交替顯示:“單片機(jī)課程設(shè)計(jì)”“液晶點(diǎn)陣顯示屏程序設(shè)計(jì)”“作者姓名、班級(jí)、學(xué)號(hào)” 2)能進(jìn)行正常的模擬量采樣值顯示(溫度、壓力、電位) 。 3) 改變字庫(kù)的內(nèi)容,顯示其它漢字。 4) 改變頁(yè)地址或列地址,使顯示的內(nèi)容改變位置。 5)其它功能不限,可自由發(fā)揮(左、右移,上下卷、顯示圖片等)。三、液晶顯示器指令描述 1、顯示開(kāi)/關(guān)設(shè)
2、置code: r/w d/i db7 db6 db5 db4 db3 db2 db1 db0llllhhhhhh/l功能:設(shè)置屏幕顯示開(kāi)/關(guān)。db0=h,開(kāi)顯示;db0=l,關(guān)顯示。不影響顯示ram(dd ram)中的內(nèi)容。2、設(shè)置顯示起始行code: r/w d/i db7 db6 db5 db4 db3 db2 db1 db0llhh 行地址(063)功能:執(zhí)行該命令后,所設(shè)置的行將顯示在屏幕的第一行。顯示起始行是由z地址計(jì)數(shù)器控制的,該命令自動(dòng)將a0-a5位地址送入z地址計(jì)數(shù)器,起始地址可以是0-63范圍內(nèi)任意一行。z地址計(jì)數(shù)器具有循環(huán)計(jì)數(shù)功能,用于顯示行掃描同步,當(dāng)掃描完一行后自動(dòng)加一
3、。3、設(shè)置頁(yè)地址code: r/w d/i db7 db6 db5 db4 db3 db2 db1 db0llhlhhh頁(yè)地址(07)功能:執(zhí)行本指令后,下面的讀寫(xiě)操作將在指定頁(yè)內(nèi),直到重新設(shè)置。頁(yè)地址就是dd ram 的行地址,頁(yè)地址存儲(chǔ)在x地址計(jì)數(shù)器中,a2-a0可表示8頁(yè),讀寫(xiě)數(shù)據(jù)對(duì)頁(yè)地址沒(méi)有影響,除本指令可改變頁(yè)地址外,復(fù)位信號(hào)(rst)可把頁(yè)地址計(jì)數(shù)器內(nèi)容清零。 dd ram地址映像表 y 地址012616263db0 page0db7 x=0db0 page1db7 x=1db0 page6db7 x=7db0 page7db7 x=84、設(shè)置列地址code: r/w d/i db
4、7 db6 db5 db4 db3 db2 db1 db0lllh 列地址(063)功能: dd ram 的列地址存儲(chǔ)在y地址計(jì)數(shù)器中,讀寫(xiě)數(shù)據(jù)對(duì)列地址有影響,在對(duì)dd ram進(jìn)行讀寫(xiě)操作后,y地址自動(dòng)加一。5、狀態(tài)檢測(cè)code: r/w d/i db7 db6 db5 db4 db3 db2 db1 db0hlbflon/offrstllll功能:讀忙信號(hào)標(biāo)志位(bf)、復(fù)位標(biāo)志位(rst)以及顯示狀態(tài)位(on/off)。bf=h:內(nèi)部正在執(zhí)行操作;bf=l:空閑狀態(tài)。rst=h:正處于復(fù)位初始化狀態(tài);rst=l:正常狀態(tài)。on/off=h:表示顯示關(guān)閉;on/off=l:表示顯示開(kāi)。6、寫(xiě)
5、顯示數(shù)據(jù)code: r/w d/i db7 db6 db5 db4 db3 db2 db1 db0lhd7d6d5d4d3d2d1d0功能:寫(xiě)數(shù)據(jù)到dd ram,dd ram是存儲(chǔ)圖形顯示數(shù)據(jù)的,寫(xiě)指令執(zhí)行后y地址計(jì)數(shù)器自動(dòng)加1。d7-d0位數(shù)據(jù)為1表示顯示,數(shù)據(jù)為0表示不顯示。寫(xiě)數(shù)據(jù)到dd ram前,要先執(zhí)行“設(shè)置頁(yè)地址”及“設(shè)置列地址”命令。7、讀顯示數(shù)據(jù)code: rs r/w db7 db6 db5 db4 db3 db2 db1 db0hhd7d6d5d4d3d2d1d0功能:從dd ram讀數(shù)據(jù),讀指令執(zhí)行后y地址計(jì)數(shù)器自動(dòng)加1。從dd ram讀數(shù)據(jù)前要先執(zhí)行“設(shè)置頁(yè)地址” 及“設(shè)
6、置列地址”命令。四、設(shè)計(jì)過(guò)程液晶顯示器分為左右兩半面,所以判斷l(xiāng)cd控制芯片ks0108是否忙要分別判斷左右兩面。程序代碼:判斷液晶顯示屏是否忙:void lcd_waitready1(void) /判斷l(xiāng)cd控制芯片ks0108是否忙lcd_data=0xff;_nop_();lcd_cs2=selectcs;lcd_rw=1;lcd_rs=0;lcd_e=1;while (lcd_data&0x80);lcd_cs2=!selectcs;void lcd_waitready2(void) /判斷l(xiāng)cd控制芯片ks0108是否忙lcd_data=0xff;_nop_();lcd_cs1=se
7、lectcs;lcd_rw=1;lcd_rs=0;lcd_e=1;while (lcd_data&0x80);lcd_cs1=!selectcs;向液晶顯示屏發(fā)送控制命令:void lcd_writecommand1(char ch) /向lcd控制芯片ks0108發(fā)送控制命令lcd_waitready1();lcd_cs2=selectcs;lcd_rw=0;lcd_rs=0;lcd_data=ch;lcd_e=1;lcd_e=0;lcd_cs2=!selectcs;void lcd_writecommand2(char ch)/向lcd控制芯片ks0108發(fā)送控制命令lcd_waitrea
8、dy2();lcd_cs1=selectcs;lcd_rw=0;lcd_rs=0;lcd_data=ch;lcd_e=1;lcd_e=0;lcd_cs1=!selectcs;向單片機(jī)發(fā)送數(shù)據(jù)指令void lcd_writedata1(char ch)/向lcd控制芯片ks0108發(fā)送數(shù)據(jù)命令lcd_waitready1();lcd_cs2=selectcs;lcd_rw=0;lcd_rs=1;lcd_data=ch;lcd_e=1;lcd_e=0;lcd_cs2=!selectcs;void lcd_writedata2(char ch)/向lcd控制芯片ks0108發(fā)送數(shù)據(jù)命令lcd_wai
9、tready2();lcd_cs1=selectcs;lcd_rw=0;lcd_rs=1;lcd_data=ch;lcd_e=1;lcd_e=0;lcd_cs1=!selectcs;向液晶顯示屏顯示漢字,為16*16:void lcd_writehz(char x,char y,char *dot) /顯示16*16點(diǎn)陣漢字char i;for (i=0;i32;i+)if (x+i%16)64)lcd_writecommand1(0xb8+y+i/16);lcd_writecommand1(0x40+x+i%16);lcd_writedata1(doti);elselcd_writecomm
10、and2(0xb8+y+i/16);lcd_writecommand2(0x40+x-64+i%16);lcd_writedata2(doti);由于數(shù)字只有漢字的寬度的一半,所以只顯示8*16點(diǎn)陣的數(shù)字void lcd_writenum(char x,char y,char *dot) /顯示8*16點(diǎn)陣數(shù)字char i;for (i=0;i16;i+)if (x+i%8)64)lcd_writecommand1(0xb8+y+i/8);lcd_writecommand1(0x40+x+i%8);lcd_writedata1(doti);elselcd_writecommand2(0xb8+
11、y+i/8);lcd_writecommand2(0x40+x-64+i%8);lcd_writedata2(doti);初始化lcd屏,開(kāi)顯示,分別清左半屏和右半屏void initlcd(void)/初始化lcdchar i,j;lcd_rst=0;delay1ms(1);lcd_rst=1;lcd_writecommand1(0xc0);/設(shè)置初始行l(wèi)cd_writecommand2(0xc0);lcd_writecommand1(0x3f); /開(kāi)顯示lcd_writecommand2(0x3f);for (j=0;j8;j+)/清屏lcd_writecommand1(0xb8+j);
12、/清左半屏lcd_writecommand1(0x40);for (i=0;i64;i+)lcd_writedata1(0x00);lcd_writecommand2(0xb8+j);/清右半屏lcd_writecommand2(0x40);for (i=0;i64;i+)lcd_writedata2(0x00);顯示一幅位圖,128*64的大小void dispbmp(char *buf)/顯示一幅位圖 int i,j;for (j=0;j8;j+)/顯示位圖lcd_writecommand1(0xb8+j);lcd_writecommand1(0x40);for (i=0;i64;i+)l
13、cd_writedata1(buf(j*2)*64+i);lcd_writecommand2(0xb8+j);lcd_writecommand2(0x40);for (i=0;i64;i+)lcd_writedata2(buf(j*2+1)*64+i);顯示一幅位圖,128*32的大小,用于計(jì)算器功能上屏幕一半的說(shuō)明性圖片void dispbmp1(char *buf)/顯示一幅位圖 int i,j;for (j=0;j4;j+)/顯示位圖lcd_writecommand1(0xb8+j);lcd_writecommand1(0x40);for (i=0;i64;i+)lcd_writedat
14、a1(buf(j*2)*64+i);lcd_writecommand2(0xb8+j);lcd_writecommand2(0x40);for (i=0;i64;i+)lcd_writedata2(buf(j*2+1)*64+i);設(shè)置起始列的位圖,參數(shù)k為起始列的位置,用于左右移動(dòng)圖像void ridispbmp(int k,char *buf)/設(shè)置起始列顯示一幅位圖 int i,j;for (j=0;j8;j+) lcd_writecommand1(0xb8+j);lcd_writecommand1(0x40);for (i=0;i64;i+)lcd_writedata1(buf(j*2
15、)*64+(i+k)%128);lcd_writecommand2(0xb8+j);lcd_writecommand2(0x40);for (i=0;i64;i+)lcd_writedata2(buf(j*2)*64+(i+k+64)%128);delay1ms(10);主程序執(zhí)行菜單:菜單項(xiàng)0為顯示基本信息,依次顯示顯示完畢后停留在菜單項(xiàng)上,等待輸入菜單。代碼: while(temp=0)/顯示信息 char i;initlcd();dispbmp(screen);for (i=0;i=0&j=0&j=0&j=0&j=5)&j!=0&j!=-1)temp=j;initlcd();break;
16、delay1s(1);dispbmp(screen8); delay1ms(250);j=test7279();while(j5)|j=-1)j=test7279();/delay1s(1);temp=j;initlcd();break;菜單項(xiàng)1為顯示一幅動(dòng)態(tài)圖像,原理就是找到一系列連續(xù)的靜態(tài)圖像,然后每個(gè)很短的時(shí)間內(nèi)連續(xù)顯示這幾幅圖像,不停的循環(huán),從外觀上就看起來(lái)有了一幅動(dòng)態(tài)的圖像。代碼:while(temp=1)/顯示圖片dispbmp(screen4); delay1ms(3500);dispbmp(screen5); delay1ms(3500);j=test7279();if(j=0
17、&j=0&j=0&j=0&j=0&j=10&j=0&j3) lcd_writenum(k,5,num14); k+=8; break; i+; if(m=10) a1=c+f; a2=a1/100; lcd_writenum(k,5,numa2); k+=8; a3=a1%100/10; lcd_writenum(k,5,numa3); k+=8; a4=a1%100%10; lcd_writenum(k,5,numa4); k+=8; else if(m=11) a1=c-f; if(a1=0&j=0&j=0&j=5)&j!=4&j!=-1)temp=j;initlcd();break;菜單
18、項(xiàng)5是實(shí)現(xiàn)了圖片的平移的功能,能實(shí)現(xiàn)圖片的上下左右以及左上,左下,右上,右下的平移功能,其說(shuō)明圖片為:代碼為:while(temp=5)/上下左右移動(dòng) unsigned int k=0,i=0;dispbmp(screen10);while(1) j=test7279();if(j=6)i=(i+1)%64;lcd_writecommand1(0xc0+i%64);lcd_writecommand2(0xc0+i%64);continue; else if(j=14)i=(i-1)%64;lcd_writecommand1(0xc0+i%64);lcd_writecommand2(0xc0+i
19、%64);continue; else if(j=9)k=(k+1)%128;ridispbmp(k,screen10);continue;else if(j=11)k=(k-1)%128;ridispbmp(k,screen10);continue;else if(j=12)i=(i+1)%64;lcd_writecommand1(0xc0+i%64);lcd_writecommand2(0xc0+i%64);k=(k+1)%128;ridispbmp(k,screen10);continue;else if(j=13)k=(k+1)%128;ridispbmp(k,screen10);i=
20、(i-1)%64;lcd_writecommand1(0xc0+i%64);lcd_writecommand2(0xc0+i%64);continue; else if(j=7)i=(i+1)%64;lcd_writecommand1(0xc0+i%64);lcd_writecommand2(0xc0+i%64);k=(k-1)%128;ridispbmp(k,screen10);continue; else if(j=15)k=(k-1)%128;ridispbmp(k,screen10);i=(i-1)%64;lcd_writecommand1(0xc0+i%64);lcd_writeco
21、mmand2(0xc0+i%64);continue;else if(j=8|j=10) j=test7279();else if(j!=-1) break; temp=j;initlcd();break;程序中用來(lái)判斷按鍵值的函數(shù)為test7279(),當(dāng)其返回為-1時(shí)表示沒(méi)有按鍵。程序:char getkeyvalue(void)char keyvalue;if (cpt1cn&0x40) return -1;/無(wú)鍵按下 send7279byte(0x15);/發(fā)讀鍵盤(pán)指令 keyvalue=receive7279byte();noselect7279; /置cs高電平 return ke
22、yvalue; char test7279(void)char keyvalue;delay1ms(25);/等待25ms復(fù)位時(shí)間 send7279byte(0xa4);/發(fā)復(fù)位指令 noselect7279; /置cs高電平 keyvalue=getkeyvalue(); return keyvalue;程序中用來(lái)的采集模擬量的程序:void read_analog_inputs(void)long temp_long; ad0int = 0; / clear conversion complete indicator ad0busy = 1; / initiate conversion w
23、hile (ad0int = 0); / wait for conversion completeswitch (mux_select)case mux_temp: temp_long = adc0 - 42380/2; temp_long = (temp_long * 200l) / 156;tem=temp_long;amx0sl = mux_volt;/ select ain1 for next readmux_select = mux_volt;break; case mux_volt:temp_long = adc0;volt = 24*temp_long/655;amx0sl =
24、mux_press;/ select on-chip temp sensormux_select = mux_press;break; case mux_press:temp_long = adc0;temp_long = 24*temp_long/655;press = temp_long; amx0sl = mux_temp; mux_select = mux_temp;break;default:amx0sl = mux_temp;mux_select = mux_temp;break; unsigned int getadcvalue(char no)read_analog_inputs();read_analog_inputs();read_analog_inputs();switch (no)c
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年木材加工及制品合作協(xié)議書(shū)
- 網(wǎng)絡(luò)資源共享與服務(wù)協(xié)議
- 農(nóng)村集體經(jīng)濟(jì)組織與農(nóng)戶合作種植協(xié)議
- 養(yǎng)豬場(chǎng)買(mǎi)賣(mài)合同協(xié)議書(shū)
- 體育場(chǎng)館建設(shè)與管理合同
- 公文處理案例與解析試題及答案
- 收銀員半年工作總結(jié)
- 漁區(qū)水產(chǎn)合作經(jīng)營(yíng)與利潤(rùn)分成協(xié)議
- 農(nóng)田管理與農(nóng)業(yè)科技合作協(xié)議
- 跨區(qū)域數(shù)據(jù)傳輸保密協(xié)議
- 川教版二年級(jí)《生命.生態(tài).安全》下冊(cè)第10課《面對(duì)學(xué)習(xí)困難》課件
- 端午節(jié)趣味謎語(yǔ)及答案
- 機(jī)械制造工藝學(xué) 王先逵課后答案
- 天府國(guó)際生物城C7-1實(shí)驗(yàn)室項(xiàng)目環(huán)境影響報(bào)告
- 招商計(jì)劃書(shū)內(nèi)容
- 地鐵車(chē)站畢業(yè)設(shè)計(jì)
- 小學(xué)數(shù)學(xué)前置性探究學(xué)習(xí)的實(shí)踐研究
- 軌道交通信號(hào)基礎(chǔ)知到章節(jié)答案智慧樹(shù)2023年同濟(jì)大學(xué)
- 如何預(yù)防與處理勞動(dòng)爭(zhēng)議培訓(xùn)課件
- JJG 1148-2022電動(dòng)汽車(chē)交流充電樁(試行)
評(píng)論
0/150
提交評(píng)論