




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、PAGE PAGE 21J I A N G S U U N I V E R S I T Y單片機(jī)原理(yunl)及應(yīng)用課程設(shè)計學(xué)院(xuyun)名稱: 計算機(jī) 專業(yè)(zhuny)班級: 通信0902 學(xué)生姓名: 柳健 學(xué)生學(xué)號: 3090601061 指導(dǎo)教師姓名: 熊 書 明 2012年 1 月點陣(din zhn)式液晶顯示屏的顯示程序設(shè)計一、設(shè)計(shj)目的1熟練掌握C51系統(tǒng)仿真開發(fā)(kif)系統(tǒng)的應(yīng)用。2加強(qiáng)單片機(jī)的綜合運用能力、提高單片機(jī)的軟件編程和調(diào)試能力,為以后的學(xué)習(xí)和開發(fā)工作打下良好基礎(chǔ)。3掌握的液晶的工作原理以及應(yīng)用設(shè)計。4掌握小系統(tǒng)開發(fā)設(shè)計的流程以及設(shè)計思路。二、設(shè)計方
2、案 實驗要求:1)從下到上滾動顯示:“江蘇大學(xué)計算機(jī)學(xué)院”然后交替顯示:“單片機(jī)課程設(shè)計”“液晶點陣顯示屏程序設(shè)計”“作者姓名、班級、學(xué)號” 2)能進(jìn)行正常的模擬量采樣值顯示(溫度、壓力、電位) 。 3) 改變字庫的內(nèi)容,顯示其它漢字。 4) 改變頁地址或列地址,使顯示的內(nèi)容改變位置。 5)其它功能(如左、右移,上下卷、顯示圖片等)。設(shè)計思路:由于實驗指導(dǎo)書中做過液晶顯示和模數(shù)轉(zhuǎn)換得實驗,根據(jù)兩個實驗的功能實現(xiàn)和流程原理進(jìn)行設(shè)計將程序分成三個模塊:主函數(shù)模塊main.c模數(shù)轉(zhuǎn)換模塊ADC.c液晶顯示模塊KS0108.c其中讓主函數(shù)模塊做一些初始化和函數(shù)調(diào)用工作,模數(shù)轉(zhuǎn)換模塊主要是將溫度,壓力,
3、點位的值轉(zhuǎn)化為數(shù)字量供液晶顯示用,液晶顯示模塊得到模數(shù)轉(zhuǎn)換模塊傳遞過來的數(shù)字量顯示到液晶面板上。程序流程圖:1系統(tǒng)主流程圖如下開始主函數(shù)模塊顯示模塊模數(shù)轉(zhuǎn)換模塊2主函數(shù)(hnsh)流程圖開始使能比較器1開中斷初始化系統(tǒng)時鐘鐘初始化定時器0初始化IO端口初始化SPI0使能片內(nèi)參考電壓使能DAC3 顯示(xinsh)模塊流程圖開始初始化LCD滾屏顯示江蘇大學(xué)計算機(jī)學(xué)院讀取數(shù)字量并顯示調(diào)用模數(shù)轉(zhuǎn)換得到值顯示課程設(shè)計題目、班級、姓名健值是否1.2.34 模數(shù)轉(zhuǎn)換模塊(m kui)流程圖開始讀取No和模擬量返回溫度返回點位結(jié)束返回壓力No=2?No=3?No=1? 主要(zhyo)的源程序及注釋主函數(shù)(
4、hnsh):#include c8051f020.h #include void Delay1us(unsigned char us)/延時uswhile (us) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); -us;void SYSCLK_Init (void)/系統(tǒng)(xtng)時鐘初始化 int i; / delay counter OSCXCN = 0 x67; / start external oscillator with / 18.432MHz crystal for (i=0; i 256; i+) ; / Wait for osc.
5、 to start up while (!(OSCXCN & 0 x80) ; / Wait for crystal osc. to settle OSCICN = 0 x88; / select external oscillator as SYSCLK / source and enable missing clock / detector/OSCICN = 0 x07; /interal 16MHZ#define PRT0CF P0MDOUT#define PRT1CF P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void) /串口初始化 X
6、BR0 = 0 x07; / Enable SMBus, SPI0, and UART0 XBR1 = 0 x00; XBR2 = 0 x44; / Enable crossbar and weak pull-ups EMI0CF = 0 x27; EMI0TC = 0 x21; P74OUT = 0 xFF; P0MDOUT = 0 x15; P1MDOUT |= 0 x3C; /P1.2-P1.5推挽(tu wn)輸出 P1 &= 0 xc3;/P1.2-P1.5=0void SPI0_Init (void) /spi0初始化 SPI0CFG = 0 x07; / data sampled
7、 on 1st SCK rising edge / 8-bit data words SPI0CFG|=0 xC0;/CKPOL =1; SPI0CN = 0 x03; / Master mode; SPI enabled; flags / cleared SPI0CKR = SYSCLK/2/8000000-1; / SPI clock 8; / set Timer0 to overflow in 1ms TL0 = -SYSCLK/1000; TR0 = 1; / START Timer0 IE|= 0 x2; void Timer0_ISR (void) interrupt 1 /1ms
8、 TH0 = (-SYSCLK/1000) 8; TL0 = -SYSCLK/1000;if (Count1ms) Count1ms-;void Delay1ms(unsigned char T) /延時1msCount1ms=T;while (Count1ms);void Delay1s(unsigned char T) /延時1swhile (T)Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);T-;void TestLCD(void);/測試(csh)初始畫面char GetKeyValue(vo
9、id);/獲取(huq)鍵值void init_adc(void);unsigned int GetADCValue(char No);void Display (char *DispBuf,char ShowDot,char x,char y);void menulcd ();void zuoyouyi();void caiji ();void main (void) char i;unsigned int u;char Num;WDTCN = 0 xde;WDTCN = 0 xad; /關(guān)看門狗SYSCLK_Init (); /初始化時鐘(shzhng)Timer0_Init();/初始化
10、定時器PORT_Init (); /初始化IO口SPI0_Init (); /初始化SPI0 init_adc();CPT1CN|=0 x80;/使能比較(bjio)器1REF0CN = 0 x07; /使能片內(nèi)參考(cnko)電壓DAC0CN |= 0 x80;/使能DAC0DAC0H=0;DAC0L=0; EA=1;/開中斷 Num=0; menulcd ();u= GetADCValue(Num);/獲取按鍵值for (;)i=GetKeyValue();if (i3)Num=i;Delay1ms(100);if (Num=0)menulcd ();/按0顯示主菜單else if(Num
11、=4) TestLCD();/按4顯示開始畫面else if(Num=5)zuoyouyi();/按5漢字,圖畫左右移動else if(Num=6)caiji ();/按6采集溫度,電壓,壓力u = GetADCValue(Num);KS0108模塊(m kui):#include c8051F020.h#include #include dianzhen.c/所有(suyu)用到的漢字,圖畫點陣#define LCD_DATA P2#define LCD_RS P30#define LCD_RW P31#define LCD_E P32#define LCD_CS1 P33#define L
12、CD_CS2 P34#define LCD_RST P35sbitHD7279_DAT=P17;sbitHD7279_CLK=P16;#define NOSELECT7279 P5 |= 0 x80/SPICS4(P57)=1#define SELECT7279 P5 &= (0 x80) /SPICS4(P57)=0;#define Set7279DAT HD7279_DAT=1#define Clr7279DAT HD7279_DAT=0#define Set7279CLK HD7279_CLK=1#define Clr7279CLK HD7279_CLK=0/7279模塊(m kui)v
13、oid Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned char T);void Send7279Byte(unsigned char ch)/發(fā)送char i;SELECT7279; /置CS低電平 Delay1us(50);/延時50for (i=0;i8;i+)if (ch&0 x80)/輸出7位到HD7279A的DATA端 Set7279DAT;elseClr7279DAT;Set7279CLK;/置CLK高電平 ch=ch1;/待發(fā)數(shù)據(jù)(shj)左移 Delay1us(8);
14、/延時8Clr7279CLK;/置CLK低電平 Delay1us(8);/延時50Clr7279DAT;/發(fā)送(f sn)完畢,DATA端置低,返回 unsigned char Receive7279Byte(void)/接收(jishu)unsigned char i,ch;ch=0;Set7279DAT;/DATA端置為高電平,輸入狀態(tài)Delay1us(50);/延時50for (i=0;i8;i+)Set7279CLK;/置CLK高電平Delay1us(8);/延時8ch=ch1;/接收數(shù)據(jù)左移1位if (HD7279_DAT)ch+=1;/接收1位數(shù)據(jù)Clr7279CLK;/置CLK低
15、電平Delay1us(8);/延時8Clr7279DAT;/接收完畢,DATA端重新置成低電平(輸出狀態(tài))return ch;unsigned char code BdSeg=0 x7e,0 x30,0 x6d,0 x79, / 0 1 2 3 0 x33,0 x5b,0 x5f,0 x70, / 4 5 6 7 0 x7f,0 x7b,0 x77,0 x1f, / 8 9 a b 0 x4e,0 x3d,0 x4f,0 x47, / c d e f 0 x00,0 x01; char GetKeyValue(void)/獲取鍵值char KeyValue;if (CPT1CN&0 x40)
16、return -1;/無鍵按下 Send7279Byte(0 x15);/發(fā)讀鍵盤指令 KeyValue=Receive7279Byte();NOSELECT7279; /置CS高電平 return KeyValue; /KS0108模塊(m kui)#define SELECTCS 0void LCD_WaitReady1(void) /判斷LCD控制(kngzh)芯片KS0108是否忙LCD_DATA=0 xff;_nop_();LCD_CS2=SELECTCS;LCD_RW=1;LCD_RS=0;LCD_E=1;while (LCD_DATA&0 x80);LCD_CS2=!SELECT
17、CS;void LCD_WaitReady2(void) /判斷(pndun)LCD控制芯片KS0108是否忙LCD_DATA=0 xff;_nop_();LCD_CS1=SELECTCS;LCD_RW=1;LCD_RS=0;LCD_E=1;while (LCD_DATA&0 x80);LCD_CS1=!SELECTCS;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_C
18、S2=!SELECTCS;void LCD_WriteCommand2(char ch)/向LCD控制芯片KS0108發(fā)送控制命令LCD_WaitReady2();LCD_CS1=SELECTCS;LCD_RW=0;LCD_RS=0;LCD_DATA=ch;LCD_E=1;LCD_E=0;LCD_CS1=!SELECTCS;void LCD_WriteData1(char ch)/向LCD控制(kngzh)芯片KS0108發(fā)送數(shù)據(jù)命令LCD_WaitReady1();LCD_CS2=SELECTCS;LCD_RW=0;LCD_RS=1;LCD_DATA=ch;LCD_E=1;LCD_E=0;L
19、CD_CS2=!SELECTCS;void LCD_WriteData2(char ch)/向LCD控制芯片(xn pin)KS0108發(fā)送數(shù)據(jù)命令LCD_WaitReady2();LCD_CS1=SELECTCS;LCD_RW=0;LCD_RS=1;LCD_DATA=ch;LCD_E=1;LCD_E=0;LCD_CS1=!SELECTCS;void LCD_WriteZM(char x,char y,char *Dot) /顯示(xinsh)16*16點陣漢字 char i;for (i=0;i16;i+)if (x+i%8)64)LCD_WriteCommand1(0 xB8+y+i/8)
20、;LCD_WriteCommand1(0 x40+x+i%8);LCD_WriteData1(Doti);elseLCD_WriteCommand2(0 xB8+y+i/8);LCD_WriteCommand2(0 x40+x-64+i%8);LCD_WriteData2(Doti);void LCD_WriteHZ(char x,char y,char *Dot) /顯示16*16點陣漢字char i;for (i=0;i32;i+)if (x+i%16)64)LCD_WriteCommand1(0 xB8+y+i/16);LCD_WriteCommand1(0 x40+x+i%16);LC
21、D_WriteData1(Doti);elseLCD_WriteCommand2(0 xB8+y+i/16);LCD_WriteCommand2(0 x40+x-64+i%16);LCD_WriteData2(Doti);void LCD_WriteHZcircle(char x,char y,char *Dot) /顯示循環(huán)(xnhun)漢字char i;for (i=0;i32;i+)if (x+i%16)63&(x+i%16)=127)LCD_WriteCommand2(0 xB8+y+i/16);LCD_WriteCommand2(0 x40+x-64+i%16);LCD_WriteD
22、ata2(Doti);elseLCD_WriteCommand1(0 xB8+y+i/16);LCD_WriteCommand1(0 x40+(x+i%16)%128);LCD_WriteData1(Doti); void InitLCD(void) /初始化LCDchar i,j;LCD_RST=0;Delay1ms(1);LCD_RST=1; LCD_WriteCommand1(0 xc0);LCD_WriteCommand2(0 xc0);LCD_WriteCommand1(0 x3f); /開顯示(xinsh)LCD_WriteCommand2(0 x3f);for (j=0;j8;j
23、+)/清屏LCD_WriteCommand1(0 xB8+j);/清左半屏LCD_WriteCommand1(0 x40);for (i=0;i64;i+)LCD_WriteData1(0 x00); LCD_WriteCommand2(0 xB8+j);/清右半屏LCD_WriteCommand2(0 x40);for (i=0;i64;i+)LCD_WriteData2(0 x00);void DispBmp(char *buf,int n)/顯示(xinsh)一幅位圖int i,j;for (j=0;j8;j+)/顯示(xinsh)位圖LCD_WriteCommand1(0 xB8+j+
24、n);LCD_WriteCommand1(0 x40);for (i=0;i64;i+)LCD_WriteData1(buf(j*2)*64+i);LCD_WriteCommand2(0 xB8+j+n);LCD_WriteCommand2(0 x40);for (i=0;i64;i+)LCD_WriteData2(buf(j*2+1)*64+i);void DispBmp1(char *buf,int n,int m)/顯示(xinsh)一幅位圖/128*16,n為頁值,m為列值int i,j;for (j=0;j2;j+)/顯示位圖if(m=63) LCD_WriteCommand1(0
25、xB8+j+n);LCD_WriteCommand1(0 x40);for(i=128-m;i=127;i+) LCD_WriteData1(bufi+128*j);for(i=0;i=63-m;i+) LCD_WriteData1(bufi+128*j);LCD_WriteCommand2(0 xB8+j+n);LCD_WriteCommand2(0 x40);for(i=64-m;i=127-m;i+)LCD_WriteData2(buf128*j+i);else LCD_WriteCommand2(0 xB8+j+n);LCD_WriteCommand2(0 x40);for(i=192
26、-m;i=127;i+)LCD_WriteData2(buf128*j+i);for(i=0;i=127-m;i+) LCD_WriteData2(buf128*j+i);LCD_WriteCommand1(0 xB8+j+n);LCD_WriteCommand1(0 x40);for(i=128-m;i=191-m;i+)LCD_WriteData1(bufi+128*j);void Display (char *DispBuf,char ShowDot,char x,char y) /液晶屏顯示(xinsh)溫度、電壓,壓力值char i,ch,j=-16;ShowDot-;for (i=
27、2;i6;i+)j+=16;ch=DispBufi;switch(ch)case 0: LCD_WriteZM(x+j,y,led0); break; case 1: LCD_WriteZM(x+j,y,led1); break;case 2: LCD_WriteZM(x+j,y,led2); break;case 3: LCD_WriteZM(x+j,y,led3); break;case 4: LCD_WriteZM(x+j,y,led4); break;case 5: LCD_WriteZM(x+j,y,led5); break;case 6: LCD_WriteZM(x+j,y,led
28、6); break;case 7: LCD_WriteZM(x+j,y,led7); break;case 8: LCD_WriteZM(x+j,y,led8); break;case 9: LCD_WriteZM(x+j,y,led9); break;default: LCD_WriteZM(x+j,y,led); break;if(i=ShowDot)LCD_WriteZM(x+j+8,y,Dot);unsigned int GetADCValue(char No);char GetKeyValue(void);void menulcd () /顯示(xinsh)菜單InitLCD();D
29、ispBmp(menu,0);void TestLCD(void) /開頭文字(wnz)的顯示char i;InitLCD();DispBmp(ss,1);/江蘇大學(xué)(dxu)計算機(jī)學(xué)院 Delay1s(0.5);for (i=0;i64;i+)Delay1ms(100);LCD_WriteCommand1(0 xc0+i%64);/設(shè)置起始行,實現(xiàn)向上滾動LCD_WriteCommand2(0 xc0+i%64);Delay1s(2); InitLCD();DispBmp(ss1,1);/單片機(jī)課程設(shè)計Delay1s(2); InitLCD();DispBmp(ss2,1);/液晶點陣顯示屏
30、程序設(shè)計Delay1s(2);InitLCD();DispBmp(ss3,1);/作者:柳健 班級:計算機(jī)0902 學(xué)號:3090601061Delay1s(2);void zuoyouyi()/漢字,圖畫左右移動char i,j,k;k=1; for (j=0;j8;j+)/漢字從左向右滾動for(i=0;i=0;j-)/漢字(Hnz)從右向左滾動for(i=0;i=0)&(i=3)/如果按鍵大于3,則不讀入鍵值No=i;Delay1ms(250);buf0= No;buf1= ;buf2=(w%10000)/1000;buf3=(w%1000)/100;buf4=(w%100)/10;bu
31、f5=(w%10);if (No=1)InitLCD();DispBmp(tem,1);/按1采集到溫度Display(buf,4,50,4);else if (No=2)InitLCD();DispBmp(volte,1);/按2采集到電壓Display(buf,3,50,4); else if (No=3)InitLCD();DispBmp(pres,1);/按3采集(cij)到壓力Display(buf,4,50,4);else break;/按0回到主菜單(ci dn) w = GetADCValue(No);ADC模塊(m kui):#include c8051F020.h#incl
32、ude /*壓力應(yīng)變片ADC試驗運行此程序,壓力值將在數(shù)碼管上顯示.用手觸摸應(yīng)變片觀察壓力變化.*/#define MUX_TEMP0 x08#define MUX_VOLT0 x01#define MUX_PRESS0 x02unsigned int idata Temp, Press, Volt;unsigned char idata mux_select;sfr16 ADC0 = 0 xbe; / ADC0 datavoid init_adc(void)ADC0CN = 0 x81; / ADC0 enabled; normal tracking / mode; ADC0 convers
33、ions are initiated / on write to AD0BUSY; ADC0 data is / left-justifiedREF0CN = 0 x07; / enable temp sensor, on-chip VREF, / and VREF output buffermux_select = MUX_TEMP; / CPU on-chip temp sensorAMX0SL = MUX_TEMP; ADC0CF = (SYSCLK/2500000) 3; / ADC conversion clock = 2.5MHz/ADC0CF |= 0 x01; / PGA ga
34、in = 2EIE2 &= 0 x02; / disable ADC0 EOC interruptEIE1 &= 0 x04; / disable ADC0 window compare interrupt/ On-chip temperature/ AN1. 電位器/ AN2. 應(yīng)變片void read_analog_inputs(void)long temp_long; AD0INT = 0; / clear conversion complete indicator AD0BUSY = 1; / initiate conversion while (AD0INT = 0); / wait
35、 for conversion completeswitch (mux_select)case MUX_TEMP: temp_long = ADC0 - 42380/2; temp_long = (temp_long * 200L) / 156;Temp=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 = MUX_PRESS;/ Select on-ch
36、ip 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)/采集(cij)數(shù)據(jù)read_analog_inputs();read_analog_inputs();read_analog_inputs();switch (No)case 1:ret
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高新創(chuàng)業(yè)區(qū)物業(yè)管理協(xié)議
- 五年級下冊數(shù)學(xué)教案 -1.4 公因數(shù) ︳西師大版
- 2024-2025學(xué)年三年級下冊數(shù)學(xué) 一 除法《練習(xí)二》(教案)
- 六年級下冊數(shù)學(xué)教案 圖形的認(rèn)識 北師大版
- 2025年貴陽康養(yǎng)職業(yè)大學(xué)單招職業(yè)技能測試題庫帶答案
- 化學(xué)-四川省金太陽2025屆高三2月開學(xué)考試試題和答案
- 2025年惠州城市職業(yè)學(xué)院單招職業(yè)技能測試題庫審定版
- 2025年廣西衛(wèi)生職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫一套
- 2025年湖北輕工職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫新版
- 2025年湖北科技職業(yè)學(xué)院單招職業(yè)傾向性測試題庫完整
- 新《卷煙營銷》理論知識考試題庫(附答案)
- 三年級下冊語文核心素養(yǎng)教案電子版
- 中考英語688高頻詞大綱詞頻表
- 知識產(chǎn)權(quán)保護(hù)與跨境執(zhí)法合作
- 肉類食品配送服務(wù)投標(biāo)方案(技術(shù)方案)
- 含新能源發(fā)電接入的電力系統(tǒng)低頻振蕩阻尼控制研究綜述
- 財務(wù)管理學(xué)(第10版)課件 第3章 財務(wù)分析
- NB-T32019-2013太陽能游泳池加熱系統(tǒng)技術(shù)規(guī)范
- 道閘施工方案
- 寺廟佛事活動方案設(shè)計
- 湘教版高中地理必修2全冊導(dǎo)學(xué)案
評論
0/150
提交評論