|
這是一個溫度監控系統的lcd12864液晶顯示部分
0.png (41.68 KB, 下載次數: 73)
下載附件
2016-9-4 22:51 上傳
0.png (57.08 KB, 下載次數: 79)
下載附件
2016-9-4 22:52 上傳
所有資料下載:
一個溫度監控系統的lcd12864液晶顯示部分.rar
(207.69 KB, 下載次數: 46)
2016-9-4 22:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
源程序如下:
- #include<reg52.h>
- #include <stdlib.h>
- #include "GraphicsDriver.h"
- #define LCDCS2W_COM (*((uchar volatile xdata *) 0x2000))
- #define LCDCS2W_DAT (*((uchar volatile xdata *) 0x2001))
- #define LCDCS1W_COM (*((uchar volatile xdata *) 0x2004))
- #define LCDCS1W_DAT (*((uchar volatile xdata *) 0x2005))
- #define LCDCS2R_DAT (*((uchar volatile xdata *) 0x2003))
- #define LCDCS1R_DAT (*((uchar volatile xdata *) 0x2007))
- #define LCD_Wr1command(command) LCDCS1W_COM = command
- #define LCD_Wr2command(command) LCDCS2W_COM = command
- #define LCD_Wr1data(wrdata) LCDCS1W_DAT = wrdata
- #define LCD_Wr2data(wrdata) LCDCS2W_DAT = wrdata
- uchar pageaddr=0xb8;
- uchar xaddr=0x40;
- uchar startx=0xc0;
- uchar control=0x3f;
- uchar r[8]={0};
- uchar code DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
- void delay5us()
- {
- uchar i;
- i=0;
- }
- /****************************************************************************
- *函數名:LCD_WriteByte
- *功能:向LCD寫字節
- *取值范圍:x 橫坐標, y縱坐標, wrdata要寫入的數據
- ****************************************************************************/
- void LCD_WriteByte(uchar x, uchar y, uchar wrdata)
- {
- uchar m;
- m=x;
- if(m<64)
- { LCD_Wr1command(xaddr+m);
- delay5us();
- LCD_Wr1command(pageaddr+y);
- delay5us();
- LCD_Wr1data(wrdata);
- delay5us();
- }
- else
- {
- m=m-64;
- LCD_Wr2command(xaddr+m);
- delay5us();
- LCD_Wr2command(pageaddr+y);
- delay5us();
- LCD_Wr2data(wrdata);
- delay5us();
- }
- }
- /****************************************************************************
- *函數名:LCD_Point
- *功能:在LCD中點亮一個像素點
- *xaddress:像素點橫坐標, yaddress:像素點的縱坐標
- ****************************************************************************/
- void LCD_Point(uchar xaddress,uchar yaddress)
- {
- uchar wrdata,x,y;
- x=xaddress+2;
- yaddress=61-yaddress;
- y=yaddress>>3;
- wrdata=DEC_HEX_TAB[yaddress&0x07];
- if(y==7)
- {
- if(x!=2) {wrdata|=0x20;}
- else {wrdata=0x3f;}
- }
- else if(x==2) wrdata=0xff;
- LCD_WriteByte(x,y,wrdata);
- }
- /*************************************************************
- *函數名:HLine
- *功能:畫出水平線
- *其中:xaddress 為起始點橫坐標,yaddress為起始點縱坐標,
- * toyaddress為結束點橫坐標,坐標原點位于LCD左下角
- *************************************************************/
- void HLine(uchar xaddress,uchar yaddress,uchar toxaddress)
- {
- uchar bak;
- if(xaddress>toxaddress)
- {
- bak = toxaddress;
- toxaddress = xaddress;
- xaddress = bak;
- }
- while(xaddress<=toxaddress)
- {
- LCD_Point(xaddress,yaddress);
- xaddress++;
- }
- }
- /*************************************************************
- *函數名:RLine
- *功能:畫出垂直線
- *其中:xaddress 為起始點橫坐標,yaddress為起始點縱坐標,
- * toyaddress為結束點縱坐標,坐標原點位于LCD左下角
- *************************************************************/
- void RLine(uchar xaddress,uchar yaddress,uchar toyaddress)
- {
- uchar bak,x,y,longth,wrdata,i;
- if(yaddress<toyaddress)
- {
- bak = toyaddress;
- toyaddress = yaddress;
- yaddress = bak;
- }
- x=xaddress+2;
- yaddress=61-yaddress;
- toyaddress=61-toyaddress;
- longth=toyaddress-yaddress+1;
- while(yaddress<=toyaddress)
- {
- y=yaddress>>3;
- if(y==7) wrdata|=0x20;
- r[y]=wrdata=r[y]|DEC_HEX_TAB[yaddress&0x07];
- yaddress++;
- LCD_WriteByte(x,y,wrdata);
- }
- for(i=0;i<=7;i++)
- r[i]=0;
- }
- /*************************************************************
- *函數名:Line
- *功能:畫出水平線
- *其中:x0 為起始點橫坐標,y0為起始點縱坐標,
- * x1為結束點橫坐標,y1為結束點橫坐標
- *************************************************************/
- void Line(uchar x0, uchar y0, uchar x1, uchar y1)
- { int dx; // 直線x軸差值變量
- int dy; // 直線y軸差值變量
- char dx_sym; // x軸增長方向,為-1時減值方向,為1時增值方向
- char dy_sym; // y軸增長方向,為-1時減值方向,為1時增值方向
- int dx_x2; // dx*2值變量,用于加快運算速度
- int dy_x2; // dy*2值變量,用于加快運算速度
- int di; // 決策變量
-
- x0=x0+1;
- x1=x1+1;
- dx = x1-x0; // 求取兩點之間的差值
- dy = y1-y0;
-
- /* 判斷增長方向,或是否為水平線、垂直線、點 */
- if(dx>0) // 判斷x軸方向
- { dx_sym = 1; // dx>0,設置dx_sym=1
- }
- else
- { if(dx<0)
- { dx_sym = -1; // dx<0,設置dx_sym=-1
- }
- else
- { // dx==0,畫垂直線,或一點
- RLine(x0, y0, y1);
- return;
- }
- }
-
- if(dy>0) // 判斷y軸方向
- { dy_sym = 1; // dy>0,設置dy_sym=1
- }
- else
- { if(dy<0)
- { dy_sym = -1; // dy<0,設置dy_sym=-1
- }
- else
- { // dy==0,畫水平線,或一點
- HLine(x0, y0, x1);
- return;
- }
- }
-
- /* 將dx、dy取絕對值 */
- dx = dx_sym * dx;
- dy = dy_sym * dy;
-
- /* 計算2倍的dx及dy值 */
- dx_x2 = dx*2;
- dy_x2 = dy*2;
-
- /* 使用Bresenham法進行畫直線 */
- if(dx>=dy) // 對于dx>dy,則使用x軸為基準
- { di = dy_x2 - dx;
- while(x0!=x1)
- { LCD_Point(x0, y0);
- x0 += dx_sym;
- if(di<0)
- { di += dy_x2; // 計算出下一步的決策值
- }
- else
- { di += dy_x2 - dx_x2;
- y0 += dy_sym;
- }
- }
- LCD_Point(x0, y0); // 顯示最后一點
- }
- else // 對于dx<=dy,則使用y軸為基準
- { di = dx_x2 - dy;
- while(y0!=y1)
- { LCD_Point(x0, y0);
- y0 += dy_sym;
- if(di<0)
- { di += dx_x2;
- }
- else
- { di += dx_x2 - dy_x2;
- x0 += dx_sym;
- }
- }
- LCD_Point(x0, y0); // 顯示最后一點
- }
- }
- /**************************************************************
- *函數名:BuildXY()
- *功能:建立平面直角坐標系
- *x0(x0>1) 為原點的橫坐標, y0(y0>1) 為原點的縱坐標,
- *x1(x1>2) 為橫軸截止點, y1(y1>2)為縱軸截止點
- *張猛,2010-8-8
- **************************************************************/
- void BulidXY(uchar x0, uchar y0, uchar x1, uchar y1)
- {
- RLine(x0,y0,y1); //畫出縱軸
- HLine(x0,y0,x1); //畫出橫軸
- }
- /****************************************************************************
- * 名稱:Rectangle()
- * 功能:畫矩形。
- * 入口參數:x0 矩形起點所在列的位置
- * y0 矩形起點所在行的位置
- * x1 矩形終點所在列的位置
- * y1 矩形終點所在行的位置
- * 出口參數:無
- * 說明:操作失敗原因是指定地址超出緩沖區范圍。
- ****************************************************************************/
- void Rectangle(uchar x0, uchar y0, uchar x1, uchar y1)
- { HLine(x0, y0, x1);
- HLine(x0, y1, x1);
- RLine(x0, y0, y1);
- RLine(x1, y0, y1);
- }
復制代碼
|
|