版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計</p><p><b> 一、設(shè)計目的</b></p><p> 1.熟練掌握C51系統(tǒng)仿真開發(fā)系統(tǒng)的應(yīng)用。</p><p> 2.加強(qiáng)單片機(jī)的綜合運(yùn)用能力、提高單片機(jī)的軟件編程和調(diào)試能力,為以后的學(xué)習(xí)和開發(fā)工作打下良好基礎(chǔ)。</p><p> 3.掌握的液晶
2、的工作原理以及應(yīng)用設(shè)計。</p><p> 4.掌握小系統(tǒng)開發(fā)設(shè)計的流程以及設(shè)計思路。</p><p><b> 二、設(shè)計方案</b></p><p><b> 實驗要求:</b></p><p> 1)從下到上滾動顯示:“江蘇大學(xué)計算機(jī)學(xué)院”然后交替顯示:“單片機(jī)課程設(shè)計”“液晶點(diǎn)陣顯示
3、屏程序設(shè)計”“作者姓名、班級、學(xué)號” </p><p> 2)能進(jìn)行正常的模擬量采樣值顯示(溫度、壓力、電位) 。</p><p> 3) 改變字庫的內(nèi)容,顯示其它漢字。</p><p> 4) 改變頁地址或列地址,使顯示的內(nèi)容改變位置。 </p><p> 5)其它功能(如左、右移,上下卷、顯示圖片等)。</p>
4、<p><b> 設(shè)計思路:</b></p><p> 由于實驗指導(dǎo)書中做過液晶顯示和模數(shù)轉(zhuǎn)換得實驗,根據(jù)兩個實驗的功能實現(xiàn)和流程原理進(jìn)行設(shè)計</p><p> 將程序分成三個模塊:</p><p> 主函數(shù)模塊main.c</p><p> 模數(shù)轉(zhuǎn)換模塊ADC.c</p><p
5、> 液晶顯示模塊KS0108.c</p><p> 其中讓主函數(shù)模塊做一些初始化和函數(shù)調(diào)用工作,模數(shù)轉(zhuǎn)換模塊主要是將溫度,壓力,點(diǎn)位的值轉(zhuǎn)化為數(shù)字量供液晶顯示用,液晶顯示模塊得到模數(shù)轉(zhuǎn)換模塊傳遞過來的數(shù)字量顯示到液晶面板上。</p><p><b> 程序流程圖:</b></p><p><b> 1系統(tǒng)主流程圖如下&l
6、t;/b></p><p><b> 2主函數(shù)流程圖</b></p><p><b> 3 顯示模塊流程圖</b></p><p> 4 模數(shù)轉(zhuǎn)換模塊流程圖</p><p><b> 主要的源程序及注釋</b></p><p><b&
7、gt; 主函數(shù):</b></p><p> #include "c8051f020.h" </p><p> #include <intrins.h> </p><p> void Delay1us(unsigned char us)//延時us</p><p><b> {&l
8、t;/b></p><p> while (us)</p><p><b> {</b></p><p> _nop_(); _nop_(); _nop_(); _nop_(); _nop_();</p><p><b> --us;</b></p><p>&
9、lt;b> }</b></p><p><b> }</b></p><p> void SYSCLK_Init (void)//系統(tǒng)時鐘初始化</p><p><b> {</b></p><p> int i;
10、 // delay counter</p><p> OSCXCN = 0x67; // start external oscillator with</p><p> // 18.432MHz crystal</p><p> for (i=0; i < 256; i++) ; // Wai
11、t for osc. to start up</p><p> while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle</p><p> OSCICN = 0x88; // select external oscillator as SYSCLK<
12、;/p><p> // source and enable missing clock</p><p> // detector</p><p> //OSCICN = 0x07; //interal 16MHZ</p><p><b> }</b></p><p> #define
13、PRT0CF P0MDOUT</p><p> #define PRT1CF P1MDOUT</p><p> #define PRT2CF P2MDOUT</p><p> void PORT_Init (void) //串口初始化</p><p><b> {</b></
14、p><p> XBR0 = 0x07; // Enable SMBus, SPI0, and UART0</p><p> XBR1 = 0x00;</p><p> XBR2 = 0x44; // Enable crossbar and weak pull-ups&
15、lt;/p><p> EMI0CF = 0x27;</p><p> EMI0TC = 0x21;</p><p> P74OUT = 0xFF;</p><p> P0MDOUT = 0x15;</p><p> P1MDOUT |= 0x3C; //P1.2-P1.5推挽輸出</p&g
16、t;<p> P1 &= 0xc3;//P1.2-P1.5=0</p><p><b> }</b></p><p> void SPI0_Init (void) //spi0初始化</p><p><b> {</b></p>&
17、lt;p> SPI0CFG = 0x07; // data sampled on 1st SCK rising edge</p><p> // 8-bit data words</p><p> SPI0CFG|=0xC0;//CKPOL =1;</p><p> SPI0CN = 0x03;
18、 // Master mode; SPI enabled; flags</p><p> // cleared</p><p> SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by </p><p> // EEPROM spec.)</
19、p><p><b> }</b></p><p> unsigned char Count1ms;</p><p> void Timer0_Init (void) //計數(shù)器0初始化</p><p><b> {</b></p><p>
20、 CKCON|=0x8;</p><p> TMOD|=0x1; //16Bit</p><p> Count1ms=10;</p><p> TR0 = 0; // STOP Timer0</p><p> TH0 = (-SYSCLK/1000) >> 8;
21、 // set Timer0 to overflow in 1ms</p><p> TL0 = -SYSCLK/1000;</p><p> TR0 = 1; // START Timer0</p><p> IE|= 0x2; </p><p><b> }</b></p><
22、p> void Timer0_ISR (void) interrupt 1 //1ms </p><p><b> {</b></p><p> TH0 = (-SYSCLK/1000) >> 8; </p><p> TL0 = -SYSCLK/1000;</p><p> if (C
23、ount1ms) Count1ms--;</p><p><b> }</b></p><p> void Delay1ms(unsigned char T) //延時1ms</p><p><b> {</b></p><p> Count1ms=T;</p>
24、<p> while (Count1ms);</p><p><b> }</b></p><p> void Delay1s(unsigned char T) //延時1s</p><p><b> {</b></p><p><b> while (T
25、)</b></p><p><b> {</b></p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p> Delay1ms(200);</p><p&
26、gt; Delay1ms(200);</p><p><b> T--;</b></p><p><b> }</b></p><p><b> }</b></p><p> void TestLCD(void);//測試初始畫面</p><p&g
27、t; char GetKeyValue(void);//獲取鍵值</p><p> void init_adc(void);</p><p> unsigned int GetADCValue(char No);</p><p> void Display (char *DispBuf,char ShowDot,char x,char y);</p&g
28、t;<p> void menulcd ();</p><p> void zuoyouyi();</p><p> void caiji ();</p><p> void main (void) </p><p><b> {</b></p><p><b>
29、 char i;</b></p><p> unsigned int u;</p><p><b> char Num;</b></p><p> WDTCN = 0xde;</p><p> WDTCN = 0xad; //關(guān)看門狗</p><p>
30、SYSCLK_Init (); //初始化時鐘</p><p> Timer0_Init();//初始化定時器</p><p> PORT_Init (); //初始化IO口</p><p> SPI0_Init (); //初始化SPI0</p><p> init_ad
31、c();</p><p> CPT1CN|=0x80;//使能比較器1</p><p> REF0CN = 0x07; //使能片內(nèi)參考電壓</p><p> DAC0CN |= 0x80;//使能DAC0</p><p> DAC0H=0;DAC0L=0;</p><p> EA=1;//
32、開中斷</p><p><b> Num=0;</b></p><p> menulcd ();</p><p> u= GetADCValue(Num);//獲取按鍵值</p><p><b> for (;;)</b></p><p><b> {&l
33、t;/b></p><p> i=GetKeyValue();</p><p> if ((i<1)||(i>3))</p><p><b> Num=i;</b></p><p> Delay1ms(100);</p><p> if (Num==0)</p&g
34、t;<p><b> {</b></p><p> menulcd ();//按0顯示主菜單</p><p><b> }</b></p><p> else if(Num==4)</p><p><b> {</b></p><p&
35、gt; TestLCD();//按4顯示開始畫面</p><p><b> }</b></p><p> else if(Num==5)</p><p><b> {</b></p><p> zuoyouyi();//按5漢字,圖畫左右移動</p><p><
36、;b> }</b></p><p> else if(Num==6)</p><p><b> {</b></p><p> caiji ();//按6采集溫度,電壓,壓力</p><p><b> }</b></p><p> u = GetA
37、DCValue(Num);</p><p><b> }</b></p><p><b> }</b></p><p><b> KS0108模塊:</b></p><p> #include "c8051F020.h"</p><
38、;p> #include <intrins.h></p><p> #include "dianzhen.c"//所有用到的漢字,圖畫點(diǎn)陣</p><p> #define LCD_DATA P2</p><p> #define LCD_RS P30</p><p> #define LCD_
39、RW P31</p><p> #define LCD_E P32</p><p> #define LCD_CS1 P33</p><p> #define LCD_CS2 P34</p><p> #define LCD_RST P35</p><p> sbitHD7279_DAT=P1^7;
40、</p><p> sbitHD7279_CLK=P1^6;</p><p> #define NOSELECT7279 P5 |= 0x80//SPICS4(P57)=1</p><p> #define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0;</p><p>
41、#define Set7279DAT HD7279_DAT=1</p><p> #define Clr7279DAT HD7279_DAT=0</p><p> #define Set7279CLK HD7279_CLK=1</p><p> #define Clr7279CLK HD7279_CLK=0</p><p&g
42、t;<b> //7279模塊</b></p><p> void Delay1ms(unsigned char T);</p><p> void Delay1s(unsigned char T);</p><p> void Delay1us(unsigned char T);</p><p> void
43、 Send7279Byte(unsigned char ch)//發(fā)送</p><p><b> {</b></p><p><b> char i;</b></p><p> SELECT7279; //置CS低電平 </p><p> Delay1us(50);//延時5
44、0μ</p><p> for (i=0;i<8;i++)</p><p><b> {</b></p><p> if (ch&0x80)//輸出7位到HD7279A的DATA端 </p><p><b> {</b></p><p> Set7
45、279DAT;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> Clr7279DAT;</p><p><b> }</b><
46、/p><p> Set7279CLK;//置CLK高電平 </p><p> ch=ch<<1;//待發(fā)數(shù)據(jù)左移 </p><p> Delay1us(8);//延時8μ</p><p> Clr7279CLK;//置CLK低電平 </p><p> Delay1us(8);//延時5
47、0μ</p><p><b> }</b></p><p> Clr7279DAT;//發(fā)送完畢,DATA端置低,返回 </p><p><b> }</b></p><p> unsigned char Receive7279Byte(void)//接收</p><
48、;p><b> {</b></p><p> unsigned char i,ch;</p><p><b> ch=0;</b></p><p> Set7279DAT;//DATA端置為高電平,輸入狀態(tài)</p><p> Delay1us(50);//延時50μ&l
49、t;/p><p> for (i=0;i<8;i++)</p><p><b> {</b></p><p> Set7279CLK;//置CLK高電平</p><p> Delay1us(8);//延時8μ</p><p> ch=ch<<1;//接收數(shù)據(jù)左移1
50、位</p><p> if (HD7279_DAT)</p><p> ch+=1;//接收1位數(shù)據(jù)</p><p> Clr7279CLK;//置CLK低電平</p><p> Delay1us(8);//延時8μ</p><p><b> }</b></p>
51、<p> Clr7279DAT;//接收完畢,DATA端重新置成低電平(輸出狀態(tài))</p><p> return ch;</p><p><b> }</b></p><p> unsigned char code BdSeg[]={</p><p> 0x7e,0x30,0x6d,0x79,
52、 // 0 1 2 3 </p><p> 0x33,0x5b,0x5f,0x70, // 4 5 6 7</p><p> 0x7f,0x7b,0x77,0x1f, // 8 9 a b</p><p> 0x4e,0x3d,0x4f,0x47, // c d e f</p><p> 0x00,0x01}; </p>
53、<p> char GetKeyValue(void)//獲取鍵值</p><p><b> {</b></p><p> char KeyValue;</p><p> if (CPT1CN&0x40) return -1;//無鍵按下 </p><p> Send7279Byte(0x
54、15);//發(fā)讀鍵盤指令 </p><p> KeyValue=Receive7279Byte();</p><p> NOSELECT7279; //置CS高電平 </p><p> return KeyValue; </p><p><b> }</b></p><p>
55、 //KS0108模塊</p><p> #define SELECTCS 0</p><p> void LCD_WaitReady1(void) //判斷LCD控制芯片KS0108是否忙</p><p><b> {</b></p><p> LCD_DATA=0xff;</p><p&g
56、t;<b> _nop_();</b></p><p> LCD_CS2=SELECTCS;</p><p><b> LCD_RW=1;</b></p><p><b> LCD_RS=0;</b></p><p><b> LCD_E=1;</b&
57、gt;</p><p> while (LCD_DATA&0x80);</p><p> LCD_CS2=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WaitReady2(void) //判斷LCD控制芯片KS0108是否忙</p><
58、;p><b> {</b></p><p> LCD_DATA=0xff;</p><p><b> _nop_();</b></p><p> LCD_CS1=SELECTCS;</p><p><b> LCD_RW=1;</b></p>&l
59、t;p><b> LCD_RS=0;</b></p><p><b> LCD_E=1;</b></p><p> while (LCD_DATA&0x80);</p><p> LCD_CS1=!SELECTCS;</p><p><b> }</b>
60、</p><p> void LCD_WriteCommand1(char ch) //向LCD控制芯片KS0108發(fā)送控制命令</p><p><b> {</b></p><p> LCD_WaitReady1();</p><p> LCD_CS2=SELECTCS;</p><p>
61、;<b> LCD_RW=0;</b></p><p><b> LCD_RS=0;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_E=0;</b><
62、;/p><p> LCD_CS2=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WriteCommand2(char ch)//向LCD控制芯片KS0108發(fā)送控制命令</p><p><b> {</b></p><p&g
63、t; LCD_WaitReady2();</p><p> LCD_CS1=SELECTCS;</p><p><b> LCD_RW=0;</b></p><p><b> LCD_RS=0;</b></p><p> LCD_DATA=ch;</p><p>&
64、lt;b> LCD_E=1;</b></p><p><b> LCD_E=0;</b></p><p> LCD_CS1=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WriteData1(char ch)//向LCD
65、控制芯片KS0108發(fā)送數(shù)據(jù)命令</p><p><b> {</b></p><p> LCD_WaitReady1();</p><p> LCD_CS2=SELECTCS;</p><p><b> LCD_RW=0;</b></p><p><b>
66、 LCD_RS=1;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_E=0;</b></p><p> LCD_CS2=!SELECTCS;</p><p>&l
67、t;b> }</b></p><p> void LCD_WriteData2(char ch)//向LCD控制芯片KS0108發(fā)送數(shù)據(jù)命令</p><p><b> {</b></p><p> LCD_WaitReady2();</p><p> LCD_CS1=SELECTCS;<
68、;/p><p><b> LCD_RW=0;</b></p><p><b> LCD_RS=1;</b></p><p> LCD_DATA=ch;</p><p><b> LCD_E=1;</b></p><p><b> LCD_
69、E=0;</b></p><p> LCD_CS1=!SELECTCS;</p><p><b> }</b></p><p> void LCD_WriteHZ(char x,char y,char *Dot) //顯示16*16點(diǎn)陣漢字</p><p><b> {</b>&
70、lt;/p><p><b> char i;</b></p><p> for (i=0;i<32;i++)</p><p><b> {</b></p><p> if ((x+i%16)<64)</p><p><b> {</b>
71、</p><p> LCD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+x+i%16);</p><p> LCD_WriteData1(Dot[i]);</p><p><b> }</b></p><p>&l
72、t;b> else</b></p><p><b> {</b></p><p> LCD_WriteCommand2(0xB8+y+i/16);</p><p> LCD_WriteCommand2(0x40+x-64+i%16);</p><p> LCD_WriteData2(Dot[i
73、]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void LCD_WriteHZcircle(char x,char y,char *Dot) //顯示循環(huán)漢字</p>
74、;<p><b> {</b></p><p><b> char i;</b></p><p> for (i=0;i<32;i++)</p><p><b> {</b></p><p> if ((x+i%16)<64)</p&g
75、t;<p><b> {</b></p><p> LCD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+x+i%16);</p><p> LCD_WriteData1(Dot[i]);</p><p><b>
76、 }</b></p><p> else if((x+i%16)>63&&(x+i%16)<=127)</p><p><b> {</b></p><p> LCD_WriteCommand2(0xB8+y+i/16);</p><p> LCD_WriteCommand
77、2(0x40+x-64+i%16);</p><p> LCD_WriteData2(Dot[i]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> L
78、CD_WriteCommand1(0xB8+y+i/16);</p><p> LCD_WriteCommand1(0x40+(x+i%16)%128);</p><p> LCD_WriteData1(Dot[i]);</p><p><b> }</b></p><p><b> }</b&g
79、t;</p><p><b> }</b></p><p> void InitLCD(void) //初始化LCD</p><p><b> {</b></p><p><b> char i,j;</b></p><p>
80、LCD_RST=0;</p><p> Delay1ms(1);</p><p> LCD_RST=1;</p><p> LCD_WriteCommand1(0xc0);</p><p> LCD_WriteCommand2(0xc0);</p><p> LCD_WriteCommand1(0x3f);
81、 //開顯示</p><p> LCD_WriteCommand2(0x3f);</p><p> for (j=0;j<8;j++)//清屏</p><p><b> {</b></p><p> LCD_WriteCommand1(0xB8+j);//清左半屏</p><
82、p> LCD_WriteCommand1(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData1(0x00);</p><p> LCD_WriteCommand2(0xB8+j);//清右半屏</p><p> LCD_WriteCommand2(0x40
83、);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData2(0x00);</p><p><b> }</b></p><p><b> }</b></p><p> void DispBmp(char *bu
84、f,int n)//顯示一幅位圖</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for (j=0;j<8;j++)//顯示位圖</p><p><b> {</b></p><
85、;p> LCD_WriteCommand1(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData1(buf[(j*2)*64+i]);</p><p> LCD_WriteComma
86、nd2(0xB8+j+n);</p><p> LCD_WriteCommand2(0x40);</p><p> for (i=0;i<64;i++)</p><p> LCD_WriteData2(buf[(j*2+1)*64+i]);</p><p><b> }</b></p>&l
87、t;p><b> }</b></p><p> void DispBmp1(char *buf,int n,int m)//顯示一幅位圖//128*16,n為頁值,m為列值</p><p><b> {</b></p><p><b> int i,j;</b></p>
88、<p> for (j=0;j<2;j++)//顯示位圖</p><p><b> {</b></p><p><b> if(m<=63)</b></p><p><b> {</b></p><p> LCD_WriteCommand1
89、(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for(i=128-m;i<=127;i++)</p><p> LCD_WriteData1(buf[i+128*j]);</p><p> for(i=0;i<=63-m;i++)</p>&l
90、t;p> LCD_WriteData1(buf[i+128*j]);</p><p> LCD_WriteCommand2(0xB8+j+n);</p><p> LCD_WriteCommand2(0x40);</p><p> for(i=64-m;i<=127-m;i++)</p><p> LCD_Write
91、Data2(buf[128*j+i]);</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> LCD_WriteCommand2(0xB8+j+n);</p><
92、;p> LCD_WriteCommand2(0x40);</p><p> for(i=192-m;i<=127;i++)</p><p> LCD_WriteData2(buf[128*j+i]);</p><p> for(i=0;i<=127-m;i++)</p><p> LCD_WriteData2(bu
93、f[128*j+i]);</p><p> LCD_WriteCommand1(0xB8+j+n);</p><p> LCD_WriteCommand1(0x40);</p><p> for(i=128-m;i<=191-m;i++)</p><p> LCD_WriteData1(buf[i+128*j]);</p
94、><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void Display (char *DispBuf,char ShowDot,char x,char y) //液晶屏顯示溫度、電壓,壓力值&
95、lt;/p><p><b> {</b></p><p> char i,ch,j=-16;</p><p> ShowDot--;</p><p> for (i=2;i<6;i++)</p><p><b> {</b></p><p>
96、;<b> j+=16;</b></p><p> ch=DispBuf[i];</p><p> switch(ch)</p><p> {case 0: LCD_WriteHZ(x+j,y,led0); break;</p><p> case 1: LCD_WriteHZ(x+j,y,led1)
97、; break;</p><p> case 2: LCD_WriteHZ(x+j,y,led2); break;</p><p> case 3: LCD_WriteHZ(x+j,y,led3); break;</p><p> case 4: LCD_WriteHZ(x+j,y,led4); break;</p><p&g
98、t; case 5: LCD_WriteHZ(x+j,y,led5); break;</p><p> case 6: LCD_WriteHZ(x+j,y,led6); break;</p><p> case 7: LCD_WriteHZ(x+j,y,led7); break;</p><p> case 8: LCD_WriteHZ(x+j
99、,y,led8); break;</p><p> case 9: LCD_WriteHZ(x+j,y,led9); break;</p><p> default: LCD_WriteHZ(x+j,y,led); break;</p><p><b> }</b></p><p> if(i==Sho
100、wDot)</p><p><b> {</b></p><p> LCD_WriteHZ(x+j+8,y,Dot);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</
101、b></p><p> unsigned int GetADCValue(char No);</p><p> char GetKeyValue(void);</p><p> void menulcd () //顯示菜單</p><p><b> {</b></p>&
102、lt;p> InitLCD();</p><p> DispBmp(menu,0);</p><p><b> }</b></p><p> void TestLCD(void) //開頭文字的顯示</p><p><b> {</b></p><p&
103、gt;<b> char i;</b></p><p> InitLCD();</p><p> DispBmp(ss,1);//江蘇大學(xué)計算機(jī)學(xué)院</p><p> Delay1s(0.5);</p><p> for (i=0;i<64;i++)</p><p><b&g
104、t; {</b></p><p> Delay1ms(100);</p><p> LCD_WriteCommand1(0xc0+i%64);//設(shè)置起始行,實現(xiàn)向上滾動</p><p> LCD_WriteCommand2(0xc0+i%64);</p><p><b> }</b></p
105、><p> Delay1s(2);</p><p> InitLCD();</p><p> DispBmp(ss1,1);//單片機(jī)課程設(shè)計</p><p> Delay1s(2);</p><p> InitLCD();</p><p> DispBmp(ss2,1);//液晶點(diǎn)陣顯
106、示屏程序設(shè)計</p><p> Delay1s(2);</p><p> InitLCD();</p><p> DispBmp(ss3,1);//作者:陳帥 班級:計算機(jī)0802 學(xué)號:48</p><p> Delay1s(2);</p><p><b> }</b></p&g
107、t;<p> void zuoyouyi()//漢字,圖畫左右移動</p><p><b> {</b></p><p> char i,j,k;</p><p><b> k=1;</b></p><p> for (j=0;j<8;j++)//漢字從左向右滾動<
108、;/p><p><b> {</b></p><p> for(i=0;i<14;i++)</p><p><b> {</b></p><p> InitLCD();</p><p> LCD_WriteHZcircle(k,j,Han); //顯示16*16
109、點(diǎn)陣漢字'漢'</p><p><b> k++;</b></p><p><b> }</b></p><p> Delay1ms(70);</p><p><b> }</b></p><p> for (j=7;j>
110、=0;j--)//漢字從右向左滾動</p><p><b> {</b></p><p> for(i=0;i<14;i++)</p><p><b> {</b></p><p> InitLCD();</p><p> LCD_WriteHZcircle(
111、k,j,Han); //顯示16*16點(diǎn)陣漢字'漢'</p><p><b> k--;</b></p><p><b> }</b></p><p> Delay1ms(70);</p><p><b> } </b></p><
112、p><b> }</b></p><p> void caiji () //溫度,電壓,壓力采集</p><p><b> {</b></p><p><b> char i;</b></p><p> unsigned int w;</p&g
113、t;<p> char No,buf[6];</p><p> No=1; </p><p> w = GetADCValue(1);</p><p><b> for (;;)</b></p><p><b> {</b></p><p>
114、 i=GetKeyValue();</p><p> if ((i>=0)&&(i<=3))//如果按鍵大于3,則不讀入鍵值</p><p><b> No=i;</b></p><p> Delay1ms(250);</p><p> buf[0]= No;</p>
115、<p> buf[1]= ' ';</p><p> buf[2]=(w%10000)/1000;</p><p> buf[3]=(w%1000)/100;</p><p> buf[4]=(w%100)/10;</p><p> buf[5]=(w%10);</p><p>
116、if (No==1)</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(tem,1);//按1采集到溫度</p><p> Display(buf,4,50,4);</p><p><b> }</b>&
117、lt;/p><p> else if (No==2)</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(volte,1);//按2采集到電壓</p><p> Display(buf,3,50,4);</p><
118、;p><b> } </b></p><p> else if (No==3)</p><p><b> {</b></p><p> InitLCD();</p><p> DispBmp(pres,1);//按3采集到壓力</p><p>
119、Display(buf,4,50,4);</p><p><b> }</b></p><p><b> else</b></p><p> break;//按0回到主菜單 </p><p> w = GetADCValue(No);</p><p><
120、;b> }</b></p><p><b> }</b></p><p><b> ADC模塊:</b></p><p> #include "c8051F020.h"</p><p> #include <intrins.h></p
121、><p><b> /*</b></p><p> 壓力應(yīng)變片ADC試驗</p><p> 運(yùn)行此程序,壓力值將在數(shù)碼管上顯示.用手觸摸應(yīng)變片</p><p><b> 觀察壓力變化.</b></p><p><b> */</b></p&g
122、t;<p> #define MUX_TEMP0x08</p><p> #define MUX_VOLT0x01</p><p> #define MUX_PRESS0x02</p><p> unsigned int idata Temp, Press, Volt;</p><p> unsig
123、ned char idata mux_select;</p><p> sfr16 ADC0 = 0xbe; // ADC0 data</p><p> void init_adc(void)</p><p><b> {</b></p><p> ADC0CN = 0x
124、81; // ADC0 enabled; normal tracking</p><p> // mode; ADC0 conversions are initiated </p><p> // on write to AD0BUSY; ADC0 data is</p><p> // left-justified&
125、lt;/p><p> REF0CN = 0x07; // enable temp sensor, on-chip VREF,</p><p> // and VREF output buffer</p><p> mux_select = MUX_TEMP; // CPU on-chip temp sensor&
126、lt;/p><p> AMX0SL = MUX_TEMP; </p><p> ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz</p><p> //ADC0CF |= 0x01; // PGA gain = 2</
127、p><p> EIE2 &= ~0x02; // disable ADC0 EOC interrupt</p><p> EIE1 &= ~0x04; // disable ADC0 window compare interrupt</p><p><b>
128、 }</b></p><p> // On-chip temperature</p><p> // AN1. 電位器</p><p> // AN2. 應(yīng)變片</p><p> void read_analog_inputs(void)</p><p><b> {</b
129、></p><p> long temp_long;</p><p> AD0INT = 0; // clear conversion complete indicator</p><p> AD0BUSY = 1; // initiate conversion</p
130、><p> while (AD0INT == 0); // wait for conversion complete</p><p> switch (mux_select)</p><p><b> {</b></p><p> case MUX_TEMP:</p><p
131、> temp_long = ADC0 - 42380/2;</p><p> temp_long = (temp_long * 200L) / 156;</p><p> Temp=temp_long;</p><p> AMX0SL = MUX_VOLT;// Select AIN1 for next read</p><p&
132、gt; mux_select = MUX_VOLT;</p><p><b> break;</b></p><p> case MUX_VOLT:</p><p> temp_long = ADC0;</p><p> Volt = 24*temp_long/655;</p><p>
133、 AMX0SL = MUX_PRESS;// Select on-chip temp sensor</p><p> mux_select = MUX_PRESS;</p><p><b> break;</b></p><p> case MUX_PRESS:</p><p> temp_long = A
134、DC0;</p><p> temp_long = 24*temp_long/655;</p><p> Press = temp_long;</p><p> AMX0SL = MUX_TEMP; </p><p> mux_select = MUX_TEMP;</p><p><b> bre
135、ak;</b></p><p><b> default:</b></p><p> AMX0SL = MUX_TEMP;</p><p> mux_select = MUX_TEMP;</p><p><b> break;</b></p><p>&l
136、t;b> }</b></p><p><b> }</b></p><p> unsigned int GetADCValue(char No)//采集數(shù)據(jù)</p><p><b> {</b></p><p> read_analog_inputs();</p&g
137、t;<p> read_analog_inputs();</p><p> read_analog_inputs();</p><p> switch (No)</p><p><b> {</b></p><p><b> case 1:</b></p>&l
138、t;p> return Temp;</p><p><b> case 2:</b></p><p> return Volt;</p><p><b> case 3:</b></p><p> if (Press<10) Press=0;</p><p&
139、gt; return Press;</p><p><b> }</b></p><p><b> }</b></p><p><b> 3、調(diào)試過程</b></p><p> 將如下源文件main.c,c8051F020.h,ADC.c,KS0108.c加入到開發(fā)工
140、具中,調(diào)試程序,并下載到單片機(jī)中運(yùn)行,首先有“江蘇大學(xué)計算機(jī)學(xué)院”一行字向上滾動,然后顯示“液晶點(diǎn)陣顯示屏程序設(shè)計,班級,姓名”當(dāng)這些字顯示完畢后,進(jìn)入溫度、壓力、電位顯示模塊中,按1鍵,液晶屏上將顯示溫度**.**;按2鍵,液晶屏上將顯示電位*.***;按3鍵,液晶屏上將顯示壓力**.**。*代表數(shù)字。注意由于延時等原因,有時候按鍵后并不能轉(zhuǎn)換為另一種要求的顯示。系統(tǒng)基本按照課程設(shè)計的要求實現(xiàn)了所有功能,在程序設(shè)計和調(diào)試過程中,遇到和
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計報告——點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計
- 單片機(jī)原理及應(yīng)用課程設(shè)計--點(diǎn)陣式液晶顯示屏的顯示程序設(shè)計
- 單片機(jī)課程設(shè)計---液晶點(diǎn)陣顯示屏程序設(shè)計
- 課程設(shè)計--點(diǎn)陣式lcd液晶顯示屏設(shè)計
- 單片機(jī)課程設(shè)計---點(diǎn)陣電子顯示屏設(shè)計
- 單片機(jī)課程設(shè)計--點(diǎn)陣led電子顯示屏
- 單片機(jī)課程設(shè)計---點(diǎn)陣led電子顯示屏
- 液晶顯示屏lcd顯示接口設(shè)計課程設(shè)計
- 單片機(jī)課程設(shè)計---led點(diǎn)陣電子顯示屏的設(shè)計
- 單片機(jī)課程設(shè)計之led點(diǎn)陣電子顯示屏設(shè)計
- led顯示屏單片機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計報告--- led點(diǎn)陣動態(tài)顯示屏設(shè)計
- 單片機(jī)課程設(shè)計--漢字液晶顯示器顯示
- 單片機(jī)課程設(shè)計lcd顯示屏設(shè)計
- 基于單片機(jī)的led點(diǎn)陣顯示屏設(shè)計
- led點(diǎn)陣顯示屏課程設(shè)計
- 液晶課程設(shè)計--單片機(jī)液晶顯示器系統(tǒng)設(shè)計
- 液晶顯示器課程設(shè)計--tn-lcd顯示屏設(shè)計——電子體溫計顯示屏設(shè)計
- 畢業(yè)設(shè)計---基于單片機(jī)控制的點(diǎn)陣式漢字電子顯示屏的設(shè)計
- 基于單片機(jī)的點(diǎn)陣電子顯示屏的設(shè)計
評論
0/150
提交評論