|
完整例程下載(包含工程文件 OS洗衣機(例3.4.4)):http://www.zg4o1577.cn/bbs/dpj-46245-1.html
‘
關于本程序的詳細解說大家可以下載電子書點擊上圖即可
- /*
-
- MSP430F4XX系列LCD顯示通用驅動程序
- 說明:該驅動程序庫包含了常用的LCD顯示功能,如顯示數字、字母等
- 可以作為各種程序的底層驅動使用。
- 要使用該庫函數,需要將本文件(LCD_Display.c)添加進工程,并在
- 需要調用顯示函數的文件開頭處包含"LCD_Display.h"
-
- (C)西安電子科技大學 測控技術與儀器教研中心 編寫:謝楷 2008/02/02
-
- */
- //
- //
- // MSP430F4XX
- // +---------------+ Digital Number
- // | | 左8+ 7654321右
- // | | +----------------------+
- // |A0+ S0-S15|--->| SoftBaugh LCD_048 |
- // |A0- COM0-COM3|--->| 7.1Digit,4-Mux LCD |
- // |P2.0 | +----------------------+
- // |P2.1 |
- // |VRef R03-R33|<---LCD Voltage Ladder Rs
- // | |
- // | XIN/XOUT|<---32.768KHz Watch Crystal
- // | |
- // +---------------+
- #include "msp430x42x.h"
- /*宏定義,數碼管a-g各段對應的比特,更換硬件只用改動以下8行*/
- #define d 0x01 // AAAA
- #define g 0x02 // F B
- #define b 0x04 // F B
- #define a 0x08 // GGGG
- #define DOTSEG 0x10 // E C
- #define e 0x20 // E C
- #define f 0x40 // DDDD
- #define c 0x80
- #define NEGSEG 0x02
- /*用宏定義自動生成段碼表,很好的寫法,值得學習*/
- /*更換硬件無需重寫段碼表*/
- const char LCD_Tab[] = {
- a + b + c + d + e + f, // Displays "0"
- b + c, // Displays "1"
- a + b + d + e + g, // Displays "2"
- a + b + c + d + g, // Displays "3"
- b + c + f + g, // Displays "4"
- a + c + d + f +g, // Displays "5"
- a + c + d + e + f + g, // Displays "6"
- a + b + c, // Displays "7"
- a + b + c + d + e + f + g, // Displays "8"
- a + b + c + d + f + g, // Displays "9"
- a + b + c + e + f + g, // Displays "A"
- c + d + e + f + g, // Displays "B"
- a + d + e + f, // Displays "C"
- b + c + d + e + g, // Displays "D"
- a + d + e + f + g, // Displays "E"
- a + e + f + g, // Displays "F"
- a + c + d + e + f, // Displays "G"
- b + c + e + f + g, // Displays "H"
- e + f, // Displays "I"
- b + c + d + e, // Displays "J"
- b + d + e + f + g, // Displays "K"
- d + e + f, // Displays "L"
- a + c + e + g, // Displays "M"
- a + b + c + e + f, // Displays "N"
- c + e + g, // Displays "n"
- c + d + e + g, // Displays "o"
- a + b + c + d + e + f, // Displays "O"
- a + b + e + f + g, // Displays "P"
- a + b + c + f + g, // Displays "Q"
- e + g, // Displays "r"
- a + c + d + f +g, // Displays "S"
- d + e + f + g, // Displays "t"
- a + e + f , // Displays "T"
- b + c + d + e + f, // Displays "U"
- c + d + e, // Displays "v"
- b + d + f + g, // Displays "W"
- b + c + d + f + g, // Displays "Y"
- a + b + d + e + g, // Displays "Z"
- g, // Displays "-"
- b, // Displays "'"
- 0 // Displays " "
- };
- #undef a
- #undef b
- #undef c
- #undef d
- #undef e
- #undef f
- #undef g
- #define AA 10
- #define BB AA+1
- #define CC BB+1
- #define DD CC+1
- #define EE DD+1
- #define FF EE+1
- #define GG FF+1
- #define HH GG+1
- #define II HH+1
- #define JJ II+1
- #define KK JJ+1
- #define LL KK+1
- #define mm LL+1
- #define NN mm+1
- #define nn NN+1
- #define oo nn+1
- #define OO oo+1
- #define PP OO+1
- #define QQ PP+1
- #define rr QQ+1
- #define SS rr+1
- #define tt SS+1
- #define TT tt+1
- #define UU TT+1
- #define VV UU+1
- #define WW VV+1
- #define YY WW+1
- #define ZZ YY+1
- #define BR ZZ+1 /* - */
- #define DT BR+1 /* ' */
- #define SP DT+1 /* 空白 */
- /****************************************************************************
- * 名 稱:LCD_Init()
- * 功 能:初始化LCD顯示屏。
- * 入口參數:無
- * 出口參數:無
- * 說 明: 在主程序LCD操作之前,需要調用該函數設置LCD參數。由于LCD刷新率發生
- 器復用了BasicTimer,因此調用LCD_Init()之前需要先初始化BasicTimer。
- 可以調用BasicTimer程序庫中的BT_Init()函數或直接對BTCTL賦值之后再
- 調用LCD_Init()函數。若程序中不使用BasicTimer,在調用LCD_Init()之
- 前需要加一句BTCTL=0;用來復位BTCTL寄存器(第一次通電,BTCTL的值是隨
- 機的)。
- ****************************************************************************/
- void LCD_Init()
- { char i;
- char *pLCD = (char *)&LCDM1; // 取LCDM1寄存器(最低位)的地址
- for (i = 0; i < 8; i++) // Clear LCD memory
- *pLCD++ = 0; // 清屏
- LCDCTL = LCDSG0_1 + LCD4MUX + LCDON; // LCD模式:4mux LCD, segs0-15
- BTCTL |= BT_fLCD_DIV64; // 設置 LCD 刷新率
- /*刷新率越慢功耗越低,但速度太慢LCD會閃爍*/
- }
- /****************************************************************************
- * 名 稱:LCD_DisplayLongDecimal()
- * 功 能:在LCD上顯示一個帶有小數點的長數據。
- * 入口參數:Number:顯示數值 (-999999~9999999)
- DOT :小數點位數(0~3)
- * 出口參數:無
- * 范 例: LCD_DisplayDecimal( 123456,2); 顯示結果: 1234.56 (2位小數)
- LCD_DisplayDecimal(-123456,1); 顯示結果:-12345.6 (1位小數)
- * 說 明: 該函數能夠顯示滿屏7位數字,但執行時間較長,耗電大。
- ****************************************************************************/
- void LCD_DisplayLongDecimal( long int Number, char DOT)
- {
- char Neg;
- char i;unsigned char temp;
- char *pLCD = (char *)&LCDM1;
- char PolarLocate;
- char DispBuff[8];
- if(Number<0) {Number=-Number; Neg=1;} //處理負數
- else Neg=0;
- for(i=0;i<7;i++) //拆分數字
- {
- DispBuff[i]=Number%10;
- Number/=10;
- }
- for(i=6;i>DOT;i--) //消隱無效"0"
- {
- if (DispBuff[i]==0) DispBuff[i]=SP;
- else break;
- }
- PolarLocate=i+1; // 負號顯示在第一個有效數字左邊
- if(DOT>3) DOT=255; // 無效的小數點不顯示
- if(DOT<1) DOT=255; // LCD048段碼中只有123位數字有小數點
- for(i=0;i<7;i++)
- {
- temp=LCD_Tab[DispBuff[i]]; //查表
- if (DOT==i) temp|=DOTSEG;//顯示小數點
- if ((PolarLocate==i)&&(Neg)) temp|=NEGSEG;//負號
- pLCD[i]=temp; //寫入顯存
- }
- }
- /****************************************************************************
- * 名 稱:LCD_DisplayDecimal()
- * 功 能:在LCD上顯示一個帶有小數點的短整型數據。
- * 入口參數:Number:顯示數值 (-32768~32767)
- DOT :小數點位數(0~3)
- * 出口參數:無
- * 范 例: LCD_DisplayDecimal( 12345,2); 顯示結果: 123.45 (2位小數)
- LCD_DisplayDecimal(-12345,1); 顯示結果:-1234.5 (1位小數)
- * 說 明: 該函數顯示數值范圍小,但執行時間短,耗電小。
- ****************************************************************************/
- void LCD_DisplayDecimal( int Number, char DOT)
- {
- char Neg;
- char i;unsigned char temp;
- char *pLCD = (char *)&LCDM1;
- char PolarLocate;
- char DispBuff[8];
- if(Number<0) {Number=-Number; Neg=1;} //處理負數
- else Neg=0;
- for(i=0;i<7;i++) //拆分數字
- {
- DispBuff[i]=Number%10;
- Number/=10;
- }
- for(i=6;i>DOT;i--) //消隱無效"0"
- {
- if (DispBuff[i]==0) DispBuff[i]=SP;
- else break;
- }
- PolarLocate=i+1; // 負號顯示在第一個有效數字左邊
- if(DOT>3) DOT=255; // 無效的小數點不顯示
- if(DOT<1) DOT=255; // LCD048段碼中只有123位數字有小數點
- for(i=0;i<7;i++)
- {
- temp=LCD_Tab[DispBuff[i]]; //查表
- if (DOT==i) temp|=DOTSEG;//顯示小數點
- if ((PolarLocate==i)&&(Neg)) temp|=NEGSEG;//負號
- pLCD[i]=temp; //寫入顯存
- }
- }
- /****************************************************************************
- * 名 稱:LCD_DisplayLongNumber()
- * 功 能:在LCD上顯示一個長整數。
- * 入口參數:Number:顯示數值 (-999999~9999999)
- * 出口參數:無
- * 范 例: LCD_DisplayNumber( 123456); 顯示結果: 123456
- LCD_DisplayNumber(-123456); 顯示結果:-123456
- * 說 明: 該函數能夠顯示滿屏7位數字,但執行時間較長,耗電大。
- ****************************************************************************/
- void LCD_DisplayLongNumber(long int Number)
- {
- LCD_DisplayLongDecimal(Number,0) ;//整數沒有小數點
- }
- /****************************************************************************
- * 名 稱:LCD_DisplayNumber()
- * 功 能:在LCD上顯示一個短整數。
- * 入口參數:Number:顯示數值 (-32768~32767)
- * 出口參數:無
- * 范 例: LCD_DisplayNumber( 12345); 顯示結果: 12345
- LCD_DisplayNumber(-12345); 顯示結果:-12345
- ****************************************************************************/
- void LCD_DisplayNumber(int Number)
- {
- LCD_DisplayDecimal(Number,0) ;//整數沒有小數點
- }
- /****************************************************************************
- * 名 稱:LCD_DisplayChar()
- * 功 能:在LCD上顯示一個字符。
- * 入口參數:ch :顯示內容 可顯示字母請參考LCD_Display.h中的宏定義
- Location:顯示位置 從左至右對應76543210
- * 出口參數:無
- * 說 明: 調用該函數不影響LCD其他位的顯示。但顯示數字的函數會覆蓋該函數的結
- 果,因此該函數要在顯示數據函數之后調用。
- * 范 例: LCD_DisplayChar(AA,4);
- LCD_DisplayChar(PP,5);
- LCD_DisplayChar(2 ,6); 顯示結果: 2PAXXXX
- ****************************************************************************/
- void LCD_DisplayChar(char ch,char Location)
- {
- char *pLCD = (char *)&LCDM1;
- pLCD[Location]=LCD_Tab[ch];
- }
- /****************************************************************************
- * 名 稱:LCD_InsertChar()
- * 功 能:在LCD最右端插入一個字符。
- * 入口參數:ch :插入字符 可顯示字母請參考LCD_Display.h中的宏定義
- * 出口參數:無
- * 說 明: 調用該函數后,LCD所有已顯示字符左移一位,新的字符插入在最右端一位。
- 該函數可以實現滾屏動畫效果,或用于在數據后面顯示單位。
- * 范 例: LCD_DisplayDecimal(1234,1);
- LCD_InsertChar(PP);
- LCD_InsertChar(FF);顯示結果: 123.4PF
-
- ****************************************************************************/
- void LCD_InsertChar(char ch)
- { char i;
- char *pLCD = (char *)&LCDM1;
- for(i=6;i>=1;i--) pLCD[i]=pLCD[i-1];
- pLCD[0]=LCD_Tab[ch];
- }
- /****************************************************************************
- * 名 稱:LCD_ON()
- * 功 能:開啟LCD顯示
- * 入口參數:無
- * 出口參數:無
- * 說 明: 調用該函數將開啟LCD顯示。開啟后LCD仍顯示最后一次顯示內容
- ****************************************************************************/
- void LCD_ON()
- {
- LCDCTL |= LCDON;
- }
- /****************************************************************************
- * 名 稱:LCD_ON()
- * 功 能:關閉LCD顯示
- * 入口參數:無
- * 出口參數:無
- * 說 明: 調用該函數將關閉LCD顯示,可節省3~5uA電流。該函數不清除顯示內容。
- ****************************************************************************/
- void LCD_OFF()
- {
- LCDCTL &=~ LCDON;
- }
- /****************************************************************************
- * 名 稱:LCD_Clear()
- * 功 能: 清除LCD顯示
- * 入口參數:無
- * 出口參數:無
- * 說 明: 調用該函數將LCD顯示清除,但并不關閉LCD模塊。
- ****************************************************************************/
- void LCD_Clear()
- { char i;
- char *pLCD = (char *)&LCDM1; // 取LCDM1寄存器(最低位)的地址
- for (i = 0; i < 8; i++) // Clear LCD memory
- {
- *pLCD++ = 0; //清屏
- }
- }
復制代碼
|
|