顯示的程序如何用結構體封裝起來呢?
- //==========================================================================
- //程序功能: 1Lcd初始化
- // 2Lcd清屏
- // 3Lcd滿屏
- // 4Lcd顯示一行
- // 5Lcd畫一個點
- // 6lcd指定位置顯示一個字
- // 7Lcd指定位置顯示一串漢字
- // 8Lcd指定位置寫一串英文字符串,每行最多可寫21個字符
- // 9lcd指定位置顯示特定大小的圖片
- // 10lcd整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
- // 11lcd指定位置寫一串英文字符串,每行最多可寫21個字符
- //void Disp_Img(unsigned char code *img)
- // 程序接口:void Lcd_Init(void);
- // void Lcd_Clr(void);
- // void Lcd_Full(void);
- // void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
- // void DrawDot_12864(unsigned char y,unsigned char x,unsigned char type);
- // void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img)
- // void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len);
- // void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
- // void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
- // void Disp_Img(unsigned char code *img)/void Lcd_DispFullImg(unsigned char *img)
- // void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
- // 編寫時間: 2015-07-26
- //==========================================================================
- /**************************************************************************
- 1. void Lcd_DispFullImg(unsigned char *img);//顯示一幅全屏圖像,圖像像素點滿足128x64,單位:像素點
- 2. void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char lon, unsigned char wid, unsigned char *img); //指定位置顯示特定大小的圖片
- (2)屏蔽了未使用到的接口函數。
- ****************************************************************************/
- #include "Global.h"
- //#include "lcd595.h"
- #include "LCD12864.h"
- #include "english_8x16_ASCII.h"
- #include "intrins.h"
- //==========================================================================
- // 函數功能: Lcd的接02口信號(邏輯管腳與物理管腳的對應表)
- //==========================================================================
- sbit LCD_BL = P0^0;
- sbit LCD_RST = P0^1;
- sbit LCD_CS2 = P0^2;
- sbit LCD_CS1 = P0^3;
- sbit LCD_E = P0^4;
- sbit LCD_RW = P0^5;
- sbit LCD_RS = P0^6;
- #define LCD_DATA P2
- //==========================================================================
- // 函數功能: 本地變量及常量的定義
- //==========================================================================
- #ifdef FREQ_24M
- #define NOP Delay_uS(4)
- #else
- #define NOP Delay_uS(1)
- #endif
-
- /*100us延時*/
- void delay100us(void) //誤差 -0.234375us
- {
- unsigned char i;
- _nop_();
- i = 43;
- while (--i);
- }
- //==========================================================================
- // 函數功能: 1微秒延時函數
- //==========================================================================
- //void Delay_uS(unsigned char us_value)
- //{
- // unsigned char i;
- //
- // while(us_value--)
- // {
- // for(i=0; i<16; i++);
- // }
- //}
- //==========================================================================
- // 函數功能: 1毫秒延時函數
- //==========================================================================
- extern void Delay_mS(unsigned int ms_value)
- {
- unsigned int k;
-
- #ifdef FREQ_24M
- for(k=0; k<(4*ms_value); k++)
- #else
- for(k=0; k<(ms_value); k++)
- #endif
- {
- Delay_uS(200);
- }
- }
- //==========================================================================
- // 函數功能: 檢測是否空閑
- //==========================================================================
- void BusycChk_12864(void)
- {
- unsigned int timeout = 0;
-
- LCD_E = 0;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_E = 1;
- while((LCD_DATA & 0x80) && ++timeout != 0); //忙狀態檢測, 等待超時時間為60ms
- LCD_E = 0;
- }
- //==========================================================================
- // 函數功能: 往12864讀數據
- //==========================================================================
- unsigned char LCD_RdData(void)
- {
- unsigned char temp;
-
- BusycChk_12864();
- LCD_E = 0;
- LCD_DATA = 0xFF; //IO口置高電平, 以便讀引腳
- LCD_RS = 1;
- LCD_RW = 1;
- LCD_E = 1;
- NOP; //使能延時, 如果是較快的CPU應該延時久一些
- NOP;
- NOP;
- temp = LCD_DATA ;
-
- return temp;
- }
- //==========================================================================
- // 函數功能: 往12864寫命令
- //==========================================================================
- void Lcd_WrCmd(unsigned char cmd)
- {
- LCD_RS = 0;
- LCD_RW = 0;
- //lcdhc595(cmd);
- LCD_DATA =cmd;
- LCD_E = 1;
- NOP;
- LCD_E = 0;
- }
- //==========================================================================
- // 函數功能: 往12864寫數據
- //==========================================================================
- void Lcd_WrData(unsigned char wdata)
- {
- LCD_RS = 1;
- LCD_RW = 0;
- //lcdhc595(wata);
- LCD_DATA=wdata;
- LCD_E = 1;
- NOP;
- LCD_E = 0;
- }
- //==========================================================================
- // 函數功能: 地址轉換
- //==========================================================================
- void Lcd_Select(unsigned char x, unsigned char y)
- {
- if( y>=64 )
- {
- LCD_CS2 = 1; //選中左屏
- LCD_CS1 = 0;
- }
- else
- {
- LCD_CS1 = 1; //選中右屏
- LCD_CS2 = 0;
- }
-
- Lcd_WrCmd(0xC0);
- Lcd_WrCmd(0x40 + (y&0x3F)); //列地址
- Lcd_WrCmd(0xB8 + (x&7)); //行
- }
- //==========================================================================
- // 函數功能: Lcd清屏
- // 函數接口: void Lcd_Clr(void);
- //==========================================================================
- void Lcd_Clr(void)
- {
- unsigned char i, x=0;
-
- for(x=0; x<8; x++)
- {
- Lcd_Select(x, 0); //選中左屏
- for(i=0; i<64; i++)
- {
- Lcd_WrData(0);
- }
-
- Lcd_Select(x, 64); //選中右屏
- for(i=0; i<64; i++)
- {
- Lcd_WrData(0);
- }
- }
- }
- //==========================================================================
- // 函數功能: Lcd初始化
- // 函數接口: void Lcd_Init(void);
- //==========================================================================
- void Lcd_Init (void)
- {
- LCD_BL = 0; //打開背光
- LCD_RST = 0;
- Delay_mS(100);
- LCD_RST = 1;
- Delay_mS(1);
-
- LCD_CS1 = 1;
- LCD_CS2 = 1;
- Lcd_WrCmd(0xC0); //設置顯示起始行
- Lcd_WrCmd(0x3F); //顯示打開
- Lcd_Clr(); //清屏
- }
- //==========================================================================
- // 函數功能: Lcd滿屏
- // 函數接口: void Lcd_Full(void);
- //==========================================================================
- //void Lcd_Full(void)
- //{
- // unsigned char i, x=0;
- //
- // for(x=0; x<8; x++)
- // {
- // Lcd_Select(x, 0); //選中左屏
- // for(i=0; i<64; i++)
- // {
- // Lcd_WrData(0xFF);
- // }
- //
- // Lcd_Select(x, 64); //選中右屏
- // for(i=0; i<64; i++)
- // {
- // Lcd_WrData(0xFF);
- // }
- // }
- //}
- //==========================================================================
- // 函數功能: Lcd顯示一行
- // 函數接口: void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
- // 入口參數: unsigned char x, unsigned char y, unsigned char *buf, unsigned char len
- // x-顯示行, 0~7(一行寬度為8個點)
- // y-顯示起始列, 0~127, 超過列顯示無效
- // buf-指向要顯示的數組
- // len-要顯示的數據長度
- //==========================================================================
- /*void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len)
- {
- x = x&7;
-
- Lcd_Select(x, y);
- while(len--)
- {
- Lcd_WrData(*buf);
- buf++;
- y++;
- if( y == 64 )
- {
- Lcd_Select(x, y); //選中右屏
- }
- }
- }*/
- /*****************************************************************************
- * 函數功能: 整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
- * 函數接口: void Disp_Img(unsigned char code *img)
- * 入口參數: unsigned char code *img
- * img-指向待顯示的圖片
- *****************************************************************************/
- void Lcd_DispFullImg(unsigned char *img) //顯示圖片
- {
- unsigned char i=0,j=0;
- for(i=0;i<8;i++)
- {
- Lcd_Select(i, 0);
- for(j=0;j<128;j++)
- {
- if( j == 64 )
- {
- Lcd_Select(i, j); //選中右屏
- }
- Lcd_WrData(*img);
- img++;
- }
- }
- }
- /*****************************************************************************
- * 函數功能:指定位置顯示特定大小的圖片
- * 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
- * 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
- * x-顯示起始行, 0~7(一行寬度為8個點)
- * y-顯示起始列, 0~127, 超過列顯示無效
- * wid-圖片寬度,單位:像素點,最大值64
- * lon-圖片長度,單位:像素點,最大值128
- * img-指針,指向待顯示的圖片
- *****************************************************************************/
- void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char *img) //指定位置顯示特定大小的圖片
- {
- unsigned char i=0,j=0,k;
- k=wid/8;//16/8=2
- for(i=x;i<(k+x);i++)
- {
- Lcd_Select(i, y);
- for(j=y;j<(lon+y);j++)
- {
- if( j == 64 )
- {
- Lcd_Select(i, j); //選中右屏
- }
- Lcd_WrData(*img);
- img++;
- }
- }
- }
- /*****************************************************************************
- * 函數功能:在x行寫一個字符,輸入列計數初值,返回最終列計數的最后值,
- * 該列計數用于確定選中左OR右半屏幕
- * 函數接口: unsigned char Lcd_WriteCharData(unsigned char c,unsigned char x, unsigned char lineCount)
- * 入口參數: unsigned char c,unsigned char x, unsigned char lineCount
- * unsigned char c,要寫入的字符
- * unsigned char x,要寫入的行
- * unsigned char lineCount,列計數,用于確定選中左或右半屏幕
- *****************************************************************************/
- void Lcd_WriteEnglish(unsigned char x,unsigned char y, unsigned char c)
- {
- unsigned char i,line,temp;
- c -= 32;
- for(i=0;i<2;i++)
- {
- Lcd_Select(x+i,y);
- temp=i<<3;
- for(line=0; line<8; line++)
- {
- if((y+line)==64)
- {Lcd_Select(x+i,y+line);}//選中右半屏幕
- Lcd_WrData(font8x16[c][line+temp]);//此處的temp用于存放i*8的結果,
- }
- }
- }
- /*****************************************************************************
- * 函數功能:指定位置寫一串英文字符串,每行最多可寫21個字符
- * 函數接口: void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
- * 入口參數: unsigned char x,unsigned char y,unsigned char *s
- * unsigned char x,行值,取值范圍0~7
- * unsigned char y,列值,取值范圍0~127
- * unsigned char *s,s指向待寫入的字符串
- *****************************************************************************/
- void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
- {
- unsigned char lineCount=0;
- while(*s)
- {
-
- Lcd_WriteEnglish( x, y+lineCount, *s);
- lineCount+=8;//每個英文字符占用8列
- s++;
- }
- }
- /*****************************************************************************
- * 函數功能:指定位置顯示一串漢字
- * 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
- * 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
- * x-顯示起始行, 0~7(一行寬度為8個點)
- * y-顯示起始列, 0~127, 超過列顯示無效
- * wid-圖片寬度,單位:像素點,最大值64
- * lon-圖片長度,單位:像素點,最大值128
- * img-指針,指向待顯示的圖片
- *****************************************************************************/
- void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img) //顯示1個漢字
- {
- Lcd_DispImg( x, y, 16, 16, (unsigned char *)img);
- }
- void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len) //顯示一串漢字
- {
- unsigned char i;
-
- for(i=0;i<len;i++)
- {
- Lcd_WriteChinese(x, y, (unsigned char *)img);
- y += 16;
- img += 32;
-
- }
- }
- //==========================================================================
- // 函數功能: Lcd畫點
- // 函數接口: void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type);
- // 出口參數: unsigned char x, unsigned char y, unsigned char type
- // x-顯示行, 0~63
- // y-顯示起始列, 0~127, 超過列顯示無效
- //==========================================================================
- /*void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type)
- {
- unsigned char X, Y; //X存儲行地址, Y存儲列地址
- unsigned char dat, temp;
-
- if( x >= 0 && x < 64 )
- {
- X = x/8;
- Y = y;
- }
- Lcd_Select(X, Y); //地址轉換
-
- dat = LCD_RdData(); //假讀
- dat = LCD_RdData();
-
- temp = x % 8; //余數為點在字中的位置
-
- switch(type) //畫點類型, 0白, 1黑, 2取反
- {
- case 0:
- dat &= ~(0x01 << temp);; //修改該點同時保持其他位不變
- break;
- case 1:
- dat |= (0x01 << temp); //修改該點同時保持其他位不變
- break;
- case 2:
- dat ^= (0x01 << temp);; //修改該點同時保持其他位不變
- break;
- default:
- break;
- }
- Lcd_Select(X, Y);
- Lcd_WrData(dat); //將字節數據寫回
- }*/
復制代碼
|