0.png (62.37 KB, 下載次數: 66)
下載附件
2017-3-6 03:24 上傳
下載:
12864b-資料.zip
(2.75 MB, 下載次數: 76)
2017-3-6 03:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
主程序:
- #include <reg52.h>
- #include <math.h>
- #include <INTRINS.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define DataPort P0
- #define DELAYMS 80
- sbit RS_Port = P1^0;
- sbit RW_Port = P1^1;
- sbit E_Port = P2^5;
- sbit PSB_Port = P1^2;
- sbit RST_Port = P1^4;
- xchar CorpInf[]=
- {
- "自定義的漢字數組"
- "自定義的漢字數組"
- "自定義的漢字數組"
- "自定義的漢字數組"
- };
- //用來顯示數字0-9,每個數字7行*5列,將一豎排儲存為一個字節,最高位為0
- unsigned char xdata ucxFigure[10][5]=
- {
- {0x3E,0x51,0x49,0x45,0x3E},//0
- {0x00,0x42,0x7F,0x40,0x00},//1
- {0x42,0x61,0x51,0x49,0x46},//2
- {0x21,0x41,0x45,0x2B,0x31},//3
- {0x18,0x14,0x12,0x7F,0x10},//4
- {0x27,0x45,0x45,0x45,0x39},//5
- {0x3C,0x4A,0x49,0x49,0x30},//6
- {0x01,0x71,0x09,0x05,0x03},//7
- {0x36,0x49,0x49,0x49,0x36},//8
- {0x06,0x49,0x49,0x29,0x1E},//9
- };
- /*******************************************************
- * 函 數 名:void delay(uchar uc_dly)
- * 功能描述:短延時函數
- * 函數說明:用于彌補MPU和單片機在執行時序上的差異
- * 輸入參數:(1)uchar ui_dly
- * 返 回 值:無
- *******************************************************/
- #pragma disable //在函數前聲明,只對一個函數有效,該函數在調用過程中將不可被中斷。
- void delay(uint ui_dly)
- {
- while (ui_dly--);
- }
- /*******************************************************
- * 函 數 名:void delays()
- * 功能描述:長延時函數
- * 函數說明:測試時兩畫面之間的延時
- * 輸入參數:無
- * 返 回 值:無
- *******************************************************/
- #pragma disable
- void delays()
- {
- uchar uc_dly,uc_dly1,uc_dly2;
- uc_dly =DELAYMS;
-
- while (uc_dly --)
- {
- for (uc_dly1=0;uc_dly1<50;uc_dly1++)
- for (uc_dly2=0;uc_dly2<50;uc_dly2++);
- };
- }
- /*******************************************************
- * 函 數 名:void rdbf(void)
- * 功能描述:讀忙狀態
- * 函數說明:讀忙狀態
- * 輸入參數:無
- * 返 回 值:無
- *******************************************************/
- void rdbf(void)
- {
- unsigned int nTimeOut = 0 ;
- RS_Port=0;
- RW_Port=1;
- E_Port=0;
- E_Port=1;
- while( ( DataPort & 0x80 ) && ( ++nTimeOut != 0 ) ) ;
- E_Port=0;
- RS_Port=0;
- RW_Port=1;
- }
- /*******************************************************
- * 函 數 名:void wr_cmd(uchar cmd)
- * 功能描述:寫指令
- * 函數說明:往12864b寫指令
- * 輸入參數:uchar cmd
- * 返 回 值:無
- *******************************************************/
- #pragma disable
- void wr_cmd(uchar cmd)
- {
- rdbf();
- RS_Port=0;
- RW_Port=0;
- E_Port=1;
- DataPort=cmd;
- E_Port=0;
- }
- /*******************************************************
- * 函 數 名:void wr_dat(uchar dat)
- * 功能描述:寫數據
- * 函數說明:往12864b寫數據
- * 輸入參數:uchar dat
- * 返 回 值:無
- *******************************************************/
- #pragma disable
- void wr_dat(uchar dat)
- {
- rdbf();
- RS_Port=1;
- RW_Port=0;
- E_Port=1;
- DataPort=dat;
- E_Port=0;
- }
- /*******************************************************
- * 函 數 名:unsigned char rd_dat( void )
- * 功能描述:讀數據
- * 函數說明:從12864b讀數據
- * 輸入參數:無
- * 返 回 值:unsigned char byReturnValue
- *******************************************************/
- #pragma disable
- unsigned char rd_dat( void )
- {
- unsigned char byReturnValue ;
- DataPort = 0xff ;
- rdbf();
- RS_Port=1;
- RW_Port=1;
- E_Port=0;
- E_Port=1;
- byReturnValue = DataPort ;
- E_Port=0;
- return byReturnValue ;
- }
- /*******************************************************
- * 函 數 名:void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
- * 功能描述:畫點
- * 函數說明:在制定位置畫一個像素的點
- * 輸入參數:unsigned char X, unsigned char Y, unsigned char Color
- * X為列,Y為行,COLOR為不顯示、顯示或者翻轉(0、1、2)
- * 返 回 值:無
- *******************************************************/
- void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
- {
- unsigned char Row , Tier , Tier_bit ;
- unsigned char ReadOldH, ReadOldL ;
- Tier = X >> 4 ;
- Tier_bit = X & 0x0f ;
- if( Y < 32 )
- {
- Row = Y ;
- }
- else
- {
- Row = Y - 32 ;
- Tier += 8 ;
- }
- wr_cmd(Row + 0x80); //寫入行坐標
- wr_cmd(Tier + 0x80); //寫入列坐標
- rd_dat();
- ReadOldH = rd_dat() ; //讀出原始數據
- ReadOldL = rd_dat() ;
- wr_cmd(Row + 0x80);
- wr_cmd(Tier + 0x80);
- if( Tier_bit < 8 )
- {
- switch( Color)
- {
- case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ; //不顯示
- case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ; //顯示
- case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit )) ; break ; //翻轉
- default : break ;
- }
- wr_dat(ReadOldH); //寫入新數據
- wr_dat(ReadOldL);
- }
- else
- {
- switch(Color)
- {
- case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;
- case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit )) ; break ;
- case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
- default : break ;
- }
- wr_dat(ReadOldH);
- wr_dat(ReadOldL);
- }
- }
- /*******************************************************
- * 函 數 名:void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
- * 功能描述:在制定位置畫數字,7*5個像素點
- * 函數說明:在制定位置畫數字
- * 輸入參數:unsigned char X, unsigned char Y, unsigned char Color
- * X為列,Y為行,Figure為待顯示的數字
- * 返 回 值:無
- *******************************************************/
- void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
- {
- unsigned char i=0,j=0;
- for(j=0;j<5;j++)
- {
- for(i=0;i<7;i++)
- {
- DrawPoint(X+i,Y-j,(ucxFigure[Figure][j]>>i)&0x01);
- }
- }
- }
- /*******************************************************
- * 函 數 名:void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
- * 功能描述:畫一條水平線
- * 函數說明:在制定位置畫一條水平線
- * 輸入參數:unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color
- * X0列的起始位置,X1列的終止位置,Y行位置,COLOR
- * 返 回 值:無
- *******************************************************/
- void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
- { unsigned char Temp ;
- if( X0 > X1 )
- {
- Temp = X1 ;
- X1 = X0 ;
- X0 = Temp ;
- }
- for( ; X0 <= X1 ; X0++ )
- DrawPoint( X0, Y, Color ) ;
- }
- /*******************************************************
- * 函 數 名:void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
- * 功能描述:畫一條垂直線
- * 函數說明:在制定位置畫一條垂直線
- * 輸入參數:unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color
- * X列位置,Y0行的起始位置,Y1行的終止位置,COLOR
- * 返 回 值:無
- *******************************************************/
- void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
- {
- unsigned char Temp ;
- if( Y0 > Y1 )
- {
- Temp = Y1 ;
- Y1 = Y0 ;
- Y0 = Temp ;
- }
- for(; Y0 <= Y1 ; Y0++)
- DrawPoint( X, Y0, Color);
- }
- /*******************************************************
- * 函 數 名:void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
- * 功能描述:畫一條任意的線
- * 函數說明:在起點,終點之間畫一條直線
- * 輸入參數:unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color
- * 返 回 值:無
- *******************************************************/
- void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
- {
- int t, distance; /*根據屏幕大小改變變量類型(如改為int型)*/
- int x = 0 , y = 0 , delta_x, delta_y ;
- char incx, incy ;
- delta_x = EndX - StartX ;
- delta_y = EndY - StartY ;
- if( delta_x > 0 )
- {
- incx = 1;
- }
- else if( delta_x == 0 )
- {
- DrawLineY( StartX, StartY, EndY, Color ) ;
- return ;
- }
- else
- {
- incx = -1 ;
- }
- if( delta_y > 0 )
- {
- incy = 1 ;
- }
- else if(delta_y == 0 )
- {
- DrawLineX( StartX, EndX, StartY, Color ) ;
- return ;
- }
- else
- {
- incy = -1 ;
- }
- delta_x = abs( delta_x );
- delta_y = abs( delta_y );
- if( delta_x > delta_y )
- {
- distance = delta_x ;
- }
- else
- {
- distance = delta_y ;
- }
- DrawPoint( StartX, StartY, Color ) ;
- /* Draw Line*/
- for( t = 0 ; t <= distance+1 ; t++ )
- {
- DrawPoint( StartX, StartY, Color ) ;
- x += delta_x ;
- y += delta_y ;
- if( x > distance )
- {
- x -= distance ;
- StartX += incx ;
- }
- if( y > distance )
- {
- y -= distance ;
- StartY += incy ;
- }
- }
- }
- /*******************************************************
- * 函 數 名:void DisGBStr(xchar *CorpInf)
- * 功能描述:文本顯示
- * 函數說明:寫入漢字
- * 輸入參數:xchar *CorpInf
- * 返 回 值:無
- *******************************************************/
- void DisGBStr(unsigned char code *CorpInf)
- {
- uchar uc_GBCnt;
- wr_cmd(0x30); //DL=1:8-BIT interface
- wr_cmd(0x30); //RE=0:basic instruction
- wr_cmd(0x0C); //Display ON,Cursor OFF,Cursor position blink OFF 。整體顯示開,光標及其設置關。
- wr_cmd(0x80);
- for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
- {
- wr_dat(CorpInf[2 * uc_GBCnt]);
- wr_dat(CorpInf[2 * uc_GBCnt + 1]);
- };
- wr_cmd(0x90);
- for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
- {
- wr_dat(CorpInf[2 * uc_GBCnt + 32]);
- wr_dat(CorpInf[2 * uc_GBCnt + 33]);
- };
- delays();
- }
- /*******************************************************
- * 函 數 名:void Cram_Off()
- * 功能描述:清除文本顯示
- * 函數說明:清除文本顯示
- * 輸入參數:無
- * 返 回 值:無
- *******************************************************/
- void Cram_Off(void)
- {
- wr_cmd(0x30); //DL=1:8-BIT interface
- wr_cmd(0x30); //RE=0:basic instruction
- wr_cmd(0x08); //Display OFF,Cursor OFF,Cursor position blink OFF
- wr_cmd(0x01); //CLEAR
- delay(250);
- }
- /*******************************************************
- * 函 數 名:void Clr_GDRAM(void)
- * 功能描述:清除繪圖顯示
- * 函數說明:清除繪圖顯示
- * 輸入參數:無
- * 返 回 值:無
- *******************************************************/
- void Clr_GDRAM(void)
- {
- uchar x,y;
- for(y=0;y<64;y++)
- for(x=0;x<16;x++)
- {
- wr_cmd(0x34);
- wr_cmd(0x36);//開顯示
- wr_cmd(y+0x80);
- wr_cmd(x+0x80);
- wr_dat(0x00);
- wr_dat(0x00);
- }
- }
- /*******************************************************
- * 函 數 名:void Lcd_Init(void)
- * 功能描述:12864初始化
- * 函數說明:初始化
- * 輸入參數:無
- * 返 回 值:無
- *******************************************************/
- void Lcd_Init(void)
- {
- PSB_Port =1;//并行接口
- _nop_();
- _nop_();
- RST_Port =0;
- delay(250);
- delay(250);
- delay(250);
- delay(250);
-
- RST_Port =1;
- delay(250);
- delay(250);
- delay(250);
- delay(250);
- wr_cmd(0x30); //DL=1:8-BIT interface。功能設定,RE=0,基本指令集
- wr_cmd(0x30); //RE=0:basic instruction
- wr_cmd(0x06); //Entire display shift right by 1。光標右移
- Cram_Off(); //清空文本顯示
- Clr_GDRAM(); //清空繪圖顯示
-
- }
復制代碼
為大家提供一份12864的程序,是我花了很長時間根據網上程序精簡而成,比網上的版本運行速度快了很多,并增加部分功能及注釋,很穩定好用,希望能幫到大家。 包含了如下功能:
①在任意位置畫一個像素點
②畫一條任意長度的水平/垂直線
③畫一條任意線
④寫入漢字
⑤在任意位置寫入7*5個像素點的數字(0-9)
用12864時,需要了解一點,寫漢字和繪圖是兩個分開的功能!在說明文檔里一個叫文本顯示,一個叫繪圖,它倆使用的RAM也不一樣,一個是DDRAM,一個是GDRAM,使用時的相關命令及地址也都是不同的,包括清屏,也得分開清除。再有一點是,不知道是不是我的12864有些問題,個別漢字顯示錯誤,比如我寫的“過”,它顯示的就是“梗”。
|