專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

T6963C的51單片機(jī)驅(qū)動(dòng)程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月31日   【字體:
#include<stdio.h>

#include<intrins.h>   
#include <reg52.h>
#include <math.h>
#include <absacc.h>
#include <string.h>
#include "Test.h"
/*   地址定義   */
#define  d_c_add XBYTE[0x00] //數(shù)據(jù)口  命令口
/*   常數(shù)定義   */
#define  uchar unsigned char
#define  uint unsigned  int

/* T6963C 命令定義 */
#define  LCD_CUR_POS  0x21      /* 光標(biāo)位置設(shè)置(只有設(shè)置到有效顯示地址并打開顯示時(shí)才看到) */
#define  LCD_CGR_POS  0x22      /* CGRAM偏置地址設(shè)置(可以增加自已的符號(hào)) */
#define  LCD_ADR_POS  0x24      /* 地址指針位置(設(shè)置讀寫操作指針) */

#define  LCD_TXT_STP  0x40      /* 文本區(qū)首址(從此地址開始向屏幕左上角顯示字符) */
#define  LCD_TXT_WID  0x41      /* 文本區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */
#define  LCD_GRH_STP  0x42      /* 圖形區(qū)首址(從此地址開始向屏幕左上角顯示點(diǎn)) */
#define  LCD_GRH_WID  0x43      /* 圖形區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */

#define  LCD_MOD_OR         0x80                        /* 顯示方式:邏輯或 */
#define  LCD_MOD_XOR  0x81      /* 顯示方式:邏輯異或 */
#define  LCD_MOD_AND  0x82      /* 顯示方式:邏輯與 */
#define  LCD_MOD_TCH  0x83      /* 顯示方式:文本特征 */

#define  LCD_DIS_SW      0x90      /* 顯示開關(guān):D0=1/0,光標(biāo)閃爍啟用/禁用 */
                                                       / *        D1=1/0,光標(biāo)顯示啟用/禁用 */
                                                       /*        D2=1/0,文本顯示啟用/禁用(打開后再使用) */
                                                      /*        D3=1/0,圖形顯示啟用/禁用(打開后再使用) */
              
#define  LCD_CUR_SHP  0xA0      /* 光標(biāo)形狀選擇:0xA0-0xA7表示光標(biāo)占的行數(shù) */

#define  LCD_AUT_WR      0xB0      /* 自動(dòng)寫設(shè)置 */
#define  LCD_AUT_RD      0xB1      /* 自動(dòng)讀設(shè)置 */
#define  LCD_AUT_OVR  0xB2      /* 自動(dòng)讀/寫結(jié)束 */

#define  LCD_INC_WR      0xC0      /* 數(shù)據(jù)一次寫,地址加1 */
#define  LCD_INC_RD      0xC1      /* 數(shù)據(jù)一次讀,地址加1 */
#define  LCD_DEC_WR   0xC2      /* 數(shù)據(jù)一次寫,地址減1 */
#define  LCD_DEC_RD   0xC3      /* 數(shù)據(jù)一次讀,地址減1 */
#define  LCD_NOC_WR   0xC4      /* 數(shù)據(jù)一次寫,地址不變 */
#define  LCD_NOC_RD   0xC5      /* 數(shù)據(jù)一次讀,地址不變 */
       
#define  LCD_SCN_RD   0xE0      /* 屏讀 */
       
#define  LCD_SCN_CP   0xE8      /* 屏拷貝 */

#define  LCD_BIT_OP   0xF0      /* 位操作:D0-D2--定義D0-D7位,D3--1為置位,0為清除 */
/*  定義標(biāo)志位  */
sbit CD    = P1^0;
sbit CE    = P1^1;
sbit light = P1^2;
extern uchar code HZTable[ ][32];
extern uchar code ASCII_DOT_LIB[][16];
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_TestStaBit01()
* 功能:判斷讀寫指令和讀寫數(shù)據(jù)是否允許。
* 入口參數(shù):無
* 出口參數(shù):返回0表示禁止,否則表示允許
***********************************************************************/
uchar   LCD_TestStaBit01(void)
{  uchar i;
   CD=1;
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x03)==0x03 ) break;
   }
   return(i);
}
/***********************************************************************
* 名稱:LCD_TestStaBit02()
* 功能:查詢是否可數(shù)據(jù)自動(dòng)讀狀態(tài)
* 入口參數(shù):無
* 出口參數(shù):返回0表示禁止,否則表示允許
***********************************************************************/
uchar   LCD_TestStaBit02(void)
{  uchar i;
   CD=1;
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x04)==0x04 ) break;
   }
   return(i);
}
/***********************************************************************
* 名稱:LCD_TestStaBit03()
* 功能:數(shù)據(jù)自動(dòng)寫狀態(tài)是否允許。
* 入口參數(shù):無
* 出口參數(shù):返回0表示禁止,否則表示允許
***********************************************************************/
uchar LCD_TestStaBit03(void)
{  uchar i;
   CD=1;
   for(i=100; i>0; i--)
   {  if( (d_c_add&0x08)==0x08 ) break;
   }
   return(i);
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_ReadState()
* 功能:讀取狀態(tài)字子程序。
* 入口參數(shù):無
* 出口參數(shù):返回值即為讀出的狀態(tài)字
* 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸入方式
***********************************************************************/
LCD_WriteCommand(uchar command)
{
CD=1;
d_c_add=command;
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteData()
* 功能:寫數(shù)據(jù)子程序。(發(fā)送數(shù)據(jù)前,不檢查液晶模塊的狀態(tài))
* 入口參數(shù):dat   要寫入LCM的數(shù)據(jù)
* 出口參數(shù):無
* 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸出方式
***********************************************************************/
LCD_WriteData(uchar dat)
{
CD=0;
d_c_add=dat;
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_ReadData()
* 功能:讀取數(shù)據(jù)子程序。
* 入口參數(shù):無
* 出口參數(shù):返回值即為讀出的數(shù)據(jù)
* 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸入方式
***********************************************************************/
uchar LCD_ReadData(void)
{
 uchar dat;
 CD=0;
 dat=d_c_add;
 return dat;
}
/**************************************LCD_WriteTCommand1******************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand1()
* 功能:寫無參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。
* 入口參數(shù):command    要寫入LCM的命令字
* 出口參數(shù):操作出錯(cuò)返回0,否則返回1
***********************************************************************/
uchar  LCD_WriteTCommand1(uchar command)
{  if( LCD_TestStaBit01()==0 )return(0);
   LCD_WriteCommand(command);  // 發(fā)送命令字
   return(1);
}
/********************************LCD_WriteTCommand2************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand2()
* 功能:寫單參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。
* 入口參數(shù):command   要寫入LCM的命令字
*          dat1  參數(shù)1
* 出口參數(shù):操作出錯(cuò)返回0,否則返回1
* 說明:先發(fā)送參數(shù)據(jù)數(shù)據(jù),再發(fā)送命令字
***********************************************************************/
uchar LCD_WriteTCommand2(uchar command, uchar dat1)
{  if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat1);    // 發(fā)送數(shù)據(jù)1
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteCommand(command);  // 發(fā)送命令字
   return(1);
}
/********************************LCD_WriteTCommand3************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand3()
* 功能:寫雙參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。
* 入口參數(shù):command   要寫入LCM的命令字
*          dat1  參數(shù)1
*          dat2  參數(shù)2
* 出口參數(shù):操作出錯(cuò)返回0,否則返回1
* 說明:先發(fā)送兩字節(jié)參數(shù)據(jù)數(shù)據(jù),再發(fā)送命令字
***********************************************************************/
uchar  LCD_WriteTCommand3(uchar command, uchar dat1, uchar dat2)
{  if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat1);    // 發(fā)送數(shù)據(jù)1
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteData(dat2);    // 發(fā)送數(shù)據(jù)2
  
   if( LCD_TestStaBit01()==0 ) return(0);
   LCD_WriteCommand(command);  // 發(fā)送命令字
  
   return(1);
}
/******************************LCD_WriteTData1**************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTData1()
* 功能:寫1字節(jié)數(shù)據(jù)子程序。會(huì)先判斷狀態(tài)字。
* 入口參數(shù):dat    要寫入LCM的數(shù)據(jù)
* 出口參數(shù):操作出錯(cuò)返回0,否則返回1
***********************************************************************/
uchar  LCD_WriteTData1(uchar dat)
{  if( LCD_TestStaBit03()==0 ) {return(0);}
   LCD_WriteData(dat);    // 發(fā)送命令字
   return(1);
}

/*******************************LCD_Initialize*************************************************************************/
 void  LCD_Initialize(void)
{  LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00);   // 設(shè)置文本方式RAM起始地址
   LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00);   // 設(shè)置文本模式的寬度,寬度為N/6或N/8,N為寬度點(diǎn)數(shù),如240
   LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00);   // 設(shè)置圖形方式RAM起始地址
   LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00);   // 設(shè)置圖形模式的寬度,寬度為N/6或N/8,N為寬度點(diǎn)數(shù),如240
   LCD_WriteTCommand1(LCD_MOD_OR);      // 設(shè)置顯示方式為"或"
   LCD_WriteTCommand1(LCD_DIS_SW|0x08);     // 設(shè)置純圖形顯示模式
   LCD_WriteTCommand1(LCD_CUR_SHP|0x07);    // 光標(biāo)形狀
}
/*********************************LCD_FillAll**********************************************************************/
void  LCD_FillAll(uchar dat)
{  uint  i;

   LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);   // 置地址指針
   LCD_WriteTCommand1(LCD_AUT_WR);      // 自動(dòng)寫
   for(i=0;i<128*30;i++)
   {  LCD_WriteTData1(dat);        // 寫數(shù)據(jù)
   }
   LCD_WriteTCommand1(LCD_AUT_OVR);      // 自動(dòng)寫結(jié)束
   LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);   // 重置地址指針
}
/********************************************************************************************************/
void Write_Hz(uchar x,uchar y,uchar datah)
{
 uchar i;
 uint StartAddr;
 StartAddr=x*480+y;     
 for(i=0;i<16;i++)
 { LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,((StartAddr)/256));
  LCD_WriteTCommand2(LCD_INC_WR,HZTable[datah][i*2] );
  LCD_WriteTCommand2(LCD_NOC_WR,HZTable[datah][i*2+1]);
  StartAddr=StartAddr + 30;
 }
}
/********************************************************************************************************/
//顯示數(shù)字
void Write_No(uchar x,uchar y,uchar ch)
{
 uchar i, dat;
 uint StartAddr;
 StartAddr=x*480+y; 
 for(i=0;i<16;i++)
 {
  dat=ASCII_DOT_LIB[ch][i];
  LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);
  LCD_WriteTCommand2(LCD_NOC_WR,dat);
  StartAddr=StartAddr + 30;
  
 }
}
/********************************************************************************************************/
//顯示字母,縱向?qū)懽,取模方式:縱向取模,字節(jié)正序
void Write_Char(uchar x,uchar y,uchar ch)
{
 uchar i, dat;
 uint StartAddr,StartAddr1;
 StartAddr=x*240+y;
 StartAddr1=x*240+y+1;
 for(i=0;i<8;i++)
 { 
   dat=ASCII_DOT_LIB[ch][i];
      LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);
   LCD_WriteTCommand2(LCD_NOC_WR,dat);
      StartAddr=StartAddr+30;
 } 
for(i=0;i<8;i++)
 { 
   dat=ASCII_DOT_LIB[ch][i+8];
      LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);
   LCD_WriteTCommand2(LCD_NOC_WR,dat);
   StartAddr1=StartAddr1+30;
 } 
  
}
/********************************************************************************************************/
void Charline(uchar x,uchar y ,uchar n,uchar m)
{
 uchar i;
 for(i=0;i<m;i++)
 Write_Char(x,y+i,n+i);
}
/********************************************************************************************************/
void ReverseShowChar(uchar x,uchar y,uchar ch)//CGTAB
{
  uchar i, dat;
 uint StartAddr,StartAddr1;
 StartAddr=x*240+y;
 StartAddr1=x*240+y+1;
 for(i=0;i<8;i++)
 { 
      LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);
   //LCD_WriteTCommand1(0xc5); //數(shù)據(jù)一次讀,地址不變
      //dat=LCD_ReadData(); //讀入數(shù)據(jù)
   dat=ASCII_DOT_LIB[ch][i];
      dat=(0xff-dat); //取反
   //LCD_WriteTCommand2( dat, 0xc4); //送回
   LCD_WriteTCommand2(LCD_NOC_WR,dat);
      StartAddr=StartAddr+30;
  }
 for(i=0;i<8;i++)
 {
      LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);
   //LCD_WriteTCommand1(0xc5); //數(shù)據(jù)一次讀,地址不變
     // dat=LCD_ReadData(); //讀入數(shù)據(jù)
  dat=ASCII_DOT_LIB[ch][i+8];
      dat=(0xff-dat); //取反
  // LCD_WriteTCommand2(dat, 0xc4); //送回
  LCD_WriteTCommand2(LCD_NOC_WR,dat);
      StartAddr1=StartAddr1+30;
  }
}
/**********************************
//= 函數(shù)原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
//= 功    能: 在指定坐標(biāo)位置顯示一個(gè)點(diǎn)
//= 參    數(shù): 坐標(biāo),顯示點(diǎn)或清除點(diǎn)
//= 返 回 值:
//= 函數(shù)性質(zhì):私有函數(shù)
//= 如果顯示屏超過了256*256,請(qǐng)修改這個(gè)函數(shù) PointX,PointY的類型
//= Mode 1:顯示 0:清除該點(diǎn)
**********************************/
Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
    unsigned int StartAddr;
 uchar StartAddrL,StartAddrH;
    unsigned char dat;
    StartAddr=(uint)((uint)PointX*30 + PointY/8 );//grhome
 StartAddrL=StartAddr&0xFF;
 StartAddrH=StartAddr>>8;
    dat=LCD_BIT_OP+7-PointY%8; //生產(chǎn)位操作命令畫點(diǎn)的數(shù)據(jù)
    if(Mode) dat=dat|0x08;
    LCD_WriteTCommand3(LCD_ADR_POS,StartAddrL,StartAddrH);//設(shè)置該點(diǎn)所在單元地址
    LCD_WriteTCommand1(dat); // 利用位操作命令畫點(diǎn)
}

/**********************************
//= 函數(shù)原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
//= 功    能: 劃線函數(shù)
//= 參    數(shù): 坐標(biāo)1,坐標(biāo)2,顯示點(diǎn)或清除點(diǎn)
//= 返 回 值:
//= 函數(shù)性質(zhì):私有函數(shù)
//= 其它:顯示點(diǎn)陣不超過255*255
/**********************************/

void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2,  bit Mode)
{
    unsigned char x,y;
    float k,b;
    if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
    {
        k=((float)y2-y1) / ((float)x2-x1) ;
        b=y1-k*x1;
        if( x1 <= x2 )
        {
            for(x=x1;x<=x2;x++)
            {
                y=(uchar)(k*x+b);
                Pixel(x, y, Mode);
            }
        }
        else
        {
            for(x=x2;x<=x1;x++)
            {
                y=(uchar)(k*x+b);
                Pixel(x, y, Mode);
            }
        }
    }
    else // abs(y1-y2) > abs(x1-x2) |K|>1
    {
        k=((float)x2-x1) / ((float)y2-y1) ;
        b=x1-k*y1;
        if( y1 <= y2 )
        {
            for(y=y1;y<=y2;y++)
            {
                x=(uchar)(k*y+b);
                Pixel( x , y,Mode );
            }
        }
        else
        {
            for(y=y2;y<=y1;y++)
            {
                x=(uchar)(k*y+b);
                Pixel( x , y,Mode );
            }
        }
    }
}


/********************************************************************************************************/

uchar code HZTable[ ][32]={
{0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04},/*"測(cè)",0*/

{0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00},/*"試",1*/

{0x0D,0xF8,0x71,0x08,0x11,0x08,0x11,0x08,0xFD,0x08,0x11,0xF8,0x30,0x00,0x3B,0xFC,
0x54,0x40,0x50,0x40,0x93,0xFC,0x10,0x40,0x10,0x40,0x10,0x40,0x17,0xFE,0x10,0x00},/*"程",2*/


{0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x00,0x27,0xF8,0x21,0x10,0x20,0xA0,0x20,0x40,
0x2F,0xFE,0x20,0x44,0x20,0x40,0x20,0x40,0x20,0x40,0x40,0x40,0x41,0x40,0x80,0x80},/*"序",0*/

{0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48,
0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02},/*"我",1*/

};


unsigned char code ASCII_DOT_LIB[][16]=
{
 //正確的,縱向取模,字節(jié)正序
  0x00,0x10,0x18,0x14,0x03,0x11,0x1F,0x10,0x00,0x04,0x1C,0x64,0x80,0x04,0xFC,0x04,
  0x00,0x08,0x10,0x17,0x11,0x11,0x1F,0x10,0x00,0x18,0x04,0xC4,0x04,0x04,0xFC,0x04,
  0x00,0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,

    0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,  // -0-

    0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,  // -1-

    0x00,0x0E,0x11,0x10,0x10,0x10,0x0E,0x00,0x00,0x0C,0x84,0x44,0x24,0x14,0x0C,0x00,  // -2-

    0x00,0x0C,0x12,0x11,0x11,0x10,0x0C,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x18,0x00,  // -3-

    0x00,0x00,0x1F,0x08,0x04,0x03,0x00,0x00,0x00,0x24,0xFC,0x24,0x24,0x20,0xE0,0x00,  // -4-

    0x00,0x10,0x10,0x11,0x11,0x10,0x1F,0x00,0x00,0x70,0x88,0x04,0x04,0x84,0x98,0x00,  // -5-

    0x00,0x00,0x18,0x11,0x11,0x08,0x07,0x00,0x00,0x70,0x88,0x04,0x04,0x88,0xF0,0x00,  // -6-

};
關(guān)閉窗口

相關(guān)文章