TM320*240的MSP430驱动

TM320*240,控制器为RA8806.

1、有DDRAM1,DDRAM2,具有双层显示功能。

2、接口和操作类似LCD12864。

3、需要对控制器配置很多寄存器的值。基本操作方法是写寄存器地址,写寄存器内容,写显示数据,读显示数据,判忙。

4、写文字字符步骤:a.设置显示位置.通过设置寄存器0x60[seg],0x70[com]的值实现的。b.内存写入指令。c.写数据。

.c文件

//=================================版本信息==================================//

//Ver:2011082301

//Author:XZQ

//Note:显示方式实例:示波器。在DDRAM2显示背景信息,网格,坐标等;在DDRAM1显示波形、数据

//===========================================================================//

#include "TM320X240_Driver.h"



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

函数名称:LCD_CmdWrite

功    能:选择寄存器并向寄存器写入数据

参    数:unsigned char cmdaddr,unsigned char wrdata

          cmdaddr要写入寄存器地址 wrdata要写入的内容

返回值  :无

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

void LCD_CmdWrite(unsigned char cmdaddr,unsigned char wrdata)//8080

{

      CtrlDIR |=0xff;

      DataDIR |=0xff;

      CtrlOUT &=~lcd_cs1;  //cs1=0;

      CtrlOUT |=lcd_rd;    //rd=1;

      CtrlOUT |=lcd_rs;    //rs=1;

      DataOUT  =cmdaddr;

      delay_us(1);

      CtrlOUT &=~lcd_wr;   //wr=0;

      delay_us(1);

      CtrlOUT |=lcd_wr;    //wr=1;

      CtrlOUT |=lcd_cs1;   //cs1=1;



      CtrlOUT &=~lcd_cs1;  //cs1=0;

      CtrlOUT |=lcd_rd;    //rd=1;

      CtrlOUT &=~lcd_rs;   //rs=0;

      delay_us(1);

      DataOUT=wrdata;

      delay_us(1);

      CtrlOUT &=~lcd_wr;   //wr=0;

      delay_us(1);

      CtrlOUT |=lcd_wr;    //wr=1;

      CtrlOUT |=lcd_cs1;   //cs1=1;

      delay_us(1);

}



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

函数名称:LCD_DataWrite

功    能:向液晶中写显示数据

参    数:unsigned char wrdata

返回值  :无

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

void LCD_DataWrite(unsigned char wrdata)

{  

      CtrlDIR |=0xff;

      DataDIR |=0xff;

      CtrlOUT &=~lcd_cs1;   //cs1=0;

      CtrlOUT |=lcd_rd;     //rd=1;

      CtrlOUT &=~lcd_rs;    //rs=0;

      DataOUT = wrdata;

      delay_us(1);

      CtrlOUT &=~lcd_wr;    //wr=0;

      delay_us(1);

      CtrlOUT |=lcd_wr;     //wr=1;

      CtrlOUT |=lcd_cs1;    //cs1=1;

}

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

函数名称:LCD_RegWrite

功    能:选择寄存器

参    数:unsigned char reg。寄存器地址

返回值  :无

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

void LCD_RegWrite(unsigned char reg)

{  

      CtrlDIR |=0xff;

      DataDIR |=0xff; 

      CtrlOUT &=~lcd_cs1;  //cs1=0;

      CtrlOUT |=lcd_rd;    //rd=1;

      CtrlOUT |=lcd_rs;    //rs=1;

      DataOUT=reg;

      delay_us(1);

      CtrlOUT &=~lcd_wr;   //wr=0;

      delay_us(1);

      CtrlOUT |=lcd_wr;    //wr=1;

      CtrlOUT |=lcd_cs1;   //cs1=1;

      delay_us(1);

}

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

函数名称:LCD_DataRead

功    能:读取显示内容数据

参    数:无

返回值  :unsigned char data状态值

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

unsigned char LCD_DataRead(void)

{

   unsigned char data;

   LCD_ChkBusy();

   DataDIR|=0xFF;      //设置为输出方向

   DataOUT=0xff;       //lcd_data = 0xff

   DataDIR&=~0xFF;     //设置为输入方向

   

   CtrlOUT|=lcd_wr;    //lcd_wr = 1 bWRZ = 1;

   CtrlOUT&=~lcd_cs1;  //lcd_cs1 =0,chINT enable  bCSZ = 0;

   CtrlOUT&=~lcd_rs;   //lcd_rs = 0//数据选择   bA0  = 0;

   CtrlOUT&=~lcd_rd;   //lcd_rd = 0  bRDZ = 0;

   

   data = DataIN;

   CtrlOUT|=lcd_rd;    //lcd_rd = 1   bRDZ = 1;

   CtrlOUT|=lcd_cs1;   //lcd_cs1 =1,chINT disable   bCSZ = 1;

   CtrlOUT|=lcd_rs;    //lcd_rs = 1

   

   DataDIR|=0xFF;      //设置为输出方向

   DataOUT=0xff;       //lcd_data = 0xff

   return(data);

}

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

函数名称:lcd_data_read

功    能:从DDRAM读取数据

参    数:无

返回值  :unsigned char data状态值

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

unsigned char lcd_data_read(void)      //从DDRAM读取数据

{

  unsigned char data;

  LCD_RegWrite(0XB1);

  data=LCD_DataRead();   

  return(data);

}

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

函数名称:LCD_StatusRead

功    能:读取状态数据

参    数:无

返回值  :unsigned char data状态值

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

unsigned char LCD_StatusRead(void)

{

   unsigned char data;

   

   DataDIR|=0xFF;      //设置为输出方向

   DataOUT=0xff;       //lcd_data = 0xff

   DataDIR&=~0xFF;     //设置为输入方向

   

   

   CtrlOUT|=lcd_wr;    //lcd_wr = 1 bWRZ = 1;

   CtrlOUT&=~lcd_cs1;  //lcd_cs1 =0,chINT enable  bCSZ = 0;

   

   CtrlOUT|=lcd_rs;    //lcd_rs = 1//命令选择 bA0  = 1;

   CtrlOUT&=~lcd_rd;   //lcd_rd = 0  bRDZ = 0;

   

   data = DataIN;

   CtrlOUT|=lcd_rd;    //lcd_rd = 1   bRDZ = 1;

   CtrlOUT|=lcd_cs1;   //lcd_cs1 =1,chINT disable   bCSZ = 1;

   CtrlOUT|=lcd_rs;    //lcd_rs = 1

  

   DataDIR|=0xFF;      //设置为输出方向

   DataOUT=0xff;       //lcd_data = 0xff

   return(data);

}

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

函数名称:LCD_ChkBusy

功    能:查忙

参    数:无

返回值  :无

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

void LCD_ChkBusy(void)

{

   uchar temp;

   do

    {

      temp = LCD_StatusRead();

    }while((temp & 0xc0));

}





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

函数名称:LCD_Rst

功    能:TM320X240复位操作

参    数:无

返回值  :无

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

void LCD_Rst()

{   

     CtrlDIR |=0xff;

     CtrlOUT &=~lcd_cs1;  //cs1=0;

     CtrlOUT |=lcd_rd;    //rd = 1;

     CtrlOUT &=~lcd_rst;  //rst=0;

     delay_ms(300);//300ms

     CtrlOUT |=lcd_rst;   //rst=1;

     delay_ms(100);//100ms

}

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

函数名称:lcd_inital

功    能:TM320X240初始化操作

参    数:无

返回值  :无

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

void lcd_inital()

{ 

      LCD_CmdWrite(WLCR,0x00);		//[00H] , Default --> 0x00 绘图模式,屏幕显示关闭

      LCD_CmdWrite(MISC,0x08);		//[01H] , Default --> 0x00 扫描顺序 seg 0-319 com 0-239

      LCD_CmdWrite(ADSR,0x00);		//[03H] , Default --> 0x00 关闭卷动功能

      LCD_CmdWrite(INTR,0x00);          //[0FH] , Default --> 0x10 开触摸中断.0x00 禁止各类型中断

      LCD_CmdWrite(WCCR,0x00);		//[10H] , Default --> 0x00 写入DDRAM时游标自动加1,关游标显示,关游标闪烁

      LCD_CmdWrite(CHWI,0x00);		//[11H] , Default --> 0x00 设置游标大小 

      LCD_CmdWrite(MAMR,0x33);		//[12H] , Default --> 0x11 双图层显示,同时存取DDRAM1/DDRAM2,两图层关系为'OR'

      LCD_CmdWrite(AWRR,0x27);		//[20H] , Default --> 0x27 工作窗口边界

      LCD_CmdWrite(DWWR,0x27);		//[21H] , Default --> 0x27 工作窗口边界 

      LCD_CmdWrite(AWBR,0xEF);		//[30H] , Default --> 0xEF 工作窗口边界	

      LCD_CmdWrite(DWHR,0xEF);		//[31H] , Default --> 0xEF 工作窗口边界

      LCD_CmdWrite(AWLR,0x00);		//[40H] , Default --> 0x00 工作窗口边界

      LCD_CmdWrite(DWLR,0x00);		//[41H] , Default --> 0x00 工作窗口边界

      LCD_CmdWrite(AWTR,0x00);		//[50H] , Default --> 0x00 工作窗口边界

      LCD_CmdWrite(DWTR,0x00);		//[51H] , Default --> 0x00 工作窗口边界

      LCD_CmdWrite(CURX,0x00);		//[60H] , Default --> 0x00 设置segment位置 范围[0-39]

      LCD_CmdWrite(BGSG,0x00);		//[61H] , Default --> 0x00 设置卷动模式seg起点

      LCD_CmdWrite(EDSG,0x00);		//[62H] , Default --> 0x00 设置卷动模式seg起点

      LCD_CmdWrite(CURY,0x00);		//[70H] , Default --> 0x00 设置common位置 范围[0-239]

      LCD_CmdWrite(BGCM,0x00);		//[71H] , Default --> 0x00 设置卷动模式com起点 

      LCD_CmdWrite(EDCM,0x00);		//[72H] , Default --> 0x00 设置卷动模式com起点

      LCD_CmdWrite(BTMR,0x00);		//[80H] , Default --> 0x00 设置光标闪烁和卷动时间

      LCD_CmdWrite(ITCR,0x27);		//[90H] , Default --> 0x00 设置空闲时间

      LCD_CmdWrite(KSCR1,0x00);	        //[A0H] , Default --> 0x00 设置键盘功能

      LCD_CmdWrite(KSCR2,0x00);	        //[A1H] , Default --> 0x00 设置键盘功能

      LCD_CmdWrite(KSDR0,0x00);	        //[A2H] , Default --> 0x00 设置键盘功能

      LCD_CmdWrite(KSDR1,0x00);	        //[A3H] , Default --> 0x00 设置键盘功能

      LCD_CmdWrite(KSDR2,0x00);	        //[A3H] , Default --> 0x00 设置键盘功能

      LCD_CmdWrite(PCR,0x40);		//[D0H] , Default --> 0x00 PWM控制

      LCD_CmdWrite(PDCR,0x00);		//[D1H] , Default --> 0x00 PWM控制

      LCD_CmdWrite(PNTR,0x00);		//[E0H] , Default --> 0x00 要写入DDRAM内的数据

      LCD_CmdWrite(FNCR,0x00);		//[F0H] , Default --> 0x00 ASCII表选择等文字显示控制

      LCD_CmdWrite(FVHT,0x00);		//[F1H] , Default --> 0x00 设置字符大小为原始大小	

}

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

函数名称:DrawPicture

功    能:TM320X240显示图片

参    数:unsigned char const *m。图片数据首地址

返回值  :无

说    明:取模方式 横向取模、字节正序。数据写入DDRAM2

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

void DrawPicture(unsigned char const *m)

{

      unsigned int y=0,x=0,c=0; 

      //LCD_CmdWrite(0xf0,0xa8);//ISO 8859模式,开启内存清除功能,将PNTR数据填满工作窗口

      LCD_CmdWrite(FNCR,0xa8);//ISO 8859模式,开启内存清除功能,将PNTR数据填满工作窗口

      LCD_CmdWrite(WLCR,0x04);//设置为文字模式

      LCD_CmdWrite(CURX,0x00);//设置seg 地址为0

      LCD_CmdWrite(CURY,0x00);//设置com 地址为0

      LCD_CmdWrite(CHWI,0x00);//设置游标宽度为8,高度为1,间距为1

      LCD_CmdWrite(WCCR,0x00);	//[10H] , Default --> 0x00 写入DDRAM时游标自动加1,关游标显示,关游标闪烁

      LCD_CmdWrite(MAMR,0x32);//双图层显示模式,存取DDRAM2 

      LCD_RegWrite(MWCR);     //内存写入指令 

      for(y=0;y<240;y++)

      {

          for(x=0;x<40;x++)

          {

            LCD_DataWrite(m[c++]); 

            LCD_CmdWrite(CHWI,0x00);//设置游标宽度为8,高度为1,间距为1

            delay_us(10);

            LCD_CmdWrite(MAMR,0x32);//双图层显示,存取DDRAM2 

            delay_us(10);

            LCD_RegWrite(MWCR);//内存写入指令  

            delay_us(10);

          }   

      }   

}

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

函数名称:Clear_DDRAM1

功    能:清除显示

参    数:无

返回值  :无

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

void Clear_DDRAM1(void)

{

      LCD_CmdWrite(MAMR,0x31);	//存取DDRAM1,同时显示DDRAM1/DDRAM2

      LCD_CmdWrite(0xE0,0x00);//要写入DDRAM的内容。当寄存器0XF0 BIT3=1时,此数据

                              //将填满窗口

      LCD_CmdWrite(0xF0,0xA8);//开启内存清理功能,将0XE0数据填满窗口

      delay_ms(50);

}

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

函数名称:Clear_All

功    能:

参    数:无

返回值  :无

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

void Clear_All()

{

      LCD_CmdWrite(MAMR,0x33);	//双图层显示模式,同时存取DDRAM1/DDRAM2

      LCD_CmdWrite(0xE0,0x00);  //要写入DDRAM的内容。当寄存器0XF0 BIT3=1时,此数据

                              //将填满窗口

      LCD_CmdWrite(0xF0,0xA8);//开启内存清理功能,将0XE0数据填满窗口

      delay_ms(30);

} 

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

函数名称:LCD_show_str

功    能:显示字符串

参    数:unsigned char *text。字符串首地址

返回值  :无

说    明:没有设置显示位置,故显示位置为调用此函数

          前,AC值所在地址

说    明:在DDRAM1中显示

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

void LCD_show_str(unsigned char *text)

{ 

      LCD_CmdWrite(0x00,0x0c);//文字模式

      LCD_CmdWrite(MAMR,0x31);//存取DDRAM1

      while(*text != '\0')          

	{

          LCD_RegWrite(0xb0);

    	  LCD_DataWrite(*text);

    	  ++text; 

          delay_us(20);

        }

}

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

函数名称:Disp_char

功    能:显示中文和字符

参    数:uchar x,uchar y.显示位置首地址

          unsigned char *text。字符串首地址

返回值  :无

说    明:可以显示中文和ASCII字符,在DDRAM1中显示

          显示行位置可以是单行步进,显示列位置可以是2列步进

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

void Disp_char(uchar x,uchar y,unsigned char *text)

{ 

    LCD_CmdWrite(0x60,x);//segment address 

    LCD_CmdWrite(0x70,y);//common address

    LCD_show_str(text); 

}

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

函数名称:LCD_point

功    能:在坐标(x,y)打点

参    数:int x,int y

返回值  :无

说    明: -----0---x---319----------

          |0

          |y

          |239

          在DDRAM1中显示

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

void LCD_point(int x,int y)

{

    uchar x_d,x_b,x_bb,r_d;

    x_d=x/8;

    x_b=x%8;

    switch(x_b)

    {

    case 0x00:x_bb=0x80;break;

    case 0x01:x_bb=0x40;break;

    case 0x02:x_bb=0x20;break;

    case 0x03:x_bb=0x10;break;

    case 0x04:x_bb=0x08;break;

    case 0x05:x_bb=0x04;break;

    case 0x06:x_bb=0x02;break;

    case 0x07:x_bb=0x01;break;

    }

    LCD_CmdWrite(0x00,0x04);

    LCD_CmdWrite(0x60,x_d); 

    LCD_CmdWrite(0x70,y); 

    r_d=lcd_data_read();

    x_bb |=r_d;

    LCD_CmdWrite(0x60,x_d); 

    LCD_CmdWrite(0x70,y);

    LCD_CmdWrite(MAMR,0x31);//存取DDRAM1

    LCD_RegWrite(0xb0);

    LCD_DataWrite(x_bb);

}

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

函数名称:Draw_Line

功    能:TM320X240初始化操作

参    数:int x0, int y0, int x1, int y1

           起点(x0,y0),终点(x1,y1)

返回值  :无

说    明: -----0---x---319----------

          |0

          |y

          |239

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

void Draw_Line(int x0, int y0, int x1, int y1)

{

    unsigned int  x,y;

    unsigned int  dx; // = abs(x1 - x0);

    unsigned int  dy; // = abs(y1 - y0);



    if(y0==y1)

    {

      if(x0<=x1)

      {

         x=x0;

      }

      else

      {

         x=x1;

         x1=x0;

      }

      while(x <= x1)

      {

         LCD_point(x,y0);

         x++;

      }

      return;

    }

    else if(y0>y1)

    {

        dy=y0-y1;

    }

    else

    {

        dy=y1-y0;

    }



    if(x0==x1)

    {

        if(y0<=y1)

        {

          y=y0;

        }

        else

        {

          y=y1;

          y1=y0;

        }

        while(y <= y1)

        {

          LCD_point(x0,y);

          y++;

        }

        return;

    }

    else if(x0 > x1)

    {

      dx=x0-x1;

      x = x1;

      x1 = x0;

      y = y1;

      y1 = y0;

    }

    else

    {

      dx=x1-x0;

      x = x0;

      y = y0;

    }



    if(dx == dy)

    {

      while(x <= x1)

      {

        x++;

        if(y>y1)

        {

           y--;

        }

        else

        {

           y++;

        }

        LCD_point(x,y);

      }

    }

    else

    {

      LCD_point(x, y);

      if(y < y1)

      {

          if(dx > dy)

          {

          int p = dy * 2 - dx;

          int twoDy = 2 * dy;

          int twoDyMinusDx = 2 * (dy - dx);

              while(x < x1)

              {

                  x++;

                  if(p < 0)

                  {

                    p += twoDy;

                  }

                  else

                  {

                    y++;

                    p += twoDyMinusDx;

                  }

                  LCD_point(x, y);

              }

          }

          else

          {

          int p = dx * 2 - dy;

          int twoDx = 2 * dx;

          int twoDxMinusDy = 2 * (dx - dy);

              while(y < y1)

              {

                  y++;

                  if(p < 0)

                  {

                     p += twoDx;

                  }

                  else

                  {

                    x++;

                    p+= twoDxMinusDy;

                  }

                  LCD_point(x, y);

              }

          }

      }

      else

      {

        if(dx > dy)

        {

            int p = dy * 2 - dx;

            int twoDy = 2 * dy;

            int twoDyMinusDx = 2 * (dy - dx);

            while(x < x1)

            {

              x++;

              if(p < 0)

              {

                p += twoDy;

              }

              else

              {

                y--;

                p += twoDyMinusDx;

              }

              LCD_point(x, y);

            }

        }

        else

        {

          int p = dx * 2 - dy;

          int twoDx = 2 * dx;

          int twoDxMinusDy = 2 * (dx - dy);

          while(y1 < y)

          {

              y--;

              if(p < 0)

              {

                  p += twoDx;

              }

              else

              {

                   x++;

                   p+= twoDxMinusDy;

              }

              LCD_point(x, y);

          }

        }

      }

    }

}

.h文件

//=================================版本信息==================================//

//Ver:2011082301

//Author:XZQ

//===========================================================================//

#ifndef _TM320X240_DRIVER_H

#define _TM320X240_DRIVER_H



#include <msp430f5438.h>

#include "MCU_Init.h"

#include "RA8806Reg.h"

/*********************TM320X240引脚接口*****************************/

//控制线 P7口   

#define CtrlDIR   P7DIR

#define CtrlOUT   P7OUT

#define lcd_rs    BIT2//RS-->L:存取缓存器,H:存取DDRAM

#define lcd_wr    BIT3//WR--> L有效

#define lcd_rd    BIT4//RD--> L有效

#define lcd_cs1   BIT5//CS1-->L有效

#define lcd_rst   BIT6//RST-->L有效

#define lcd_busy  BIT7 //BUSY-->检测忙信号

//液晶数据引脚 DB0~DB7

#define DataDIR P3DIR

#define DataOUT P3OUT

#define DataIN  P3IN

#define DataSEL P3SEL



//底层函数

extern void LCD_CmdWrite(unsigned char cmdaddr,unsigned char wrdata);

extern void LCD_DataWrite(unsigned char wrdata);

extern void LCD_RegWrite(unsigned char reg);

extern unsigned char LCD_DataRead(void);

extern unsigned char lcd_data_read(void);

extern unsigned char LCD_StatusRead(void);

extern void LCD_ChkBusy(void);



//基本功能函数

extern void lcd_inital(void);

extern void LCD_Rst(void);

extern void Clear_DDRAM1(void);

extern void Clear_All(void);



extern void LCD_show_str(unsigned char *text);//字符显示

extern void Disp_char(uchar x,uchar y,unsigned char *text);



extern void LCD_point(int x,int y);//图形显示

extern void DrawPicture(unsigned char const *m);

//高级功能函数

extern void Draw_Line(int x0, int y0, int x1, int y1);



#endif 

RA8806控制器寄存器宏定义文件

//=================================版本信息==================================//

//Ver:20110822

//Author:XZQ

//===========================================================================//

#define WLCR	0x00

#define MISC	0x01

#define ADSR	0x03

#define INTR	0x0F

#define WCCR	0x10

#define CHWI    0x11						//new(have change)

#define MAMR	0x12

#define AWRR	0x20

#define DWWR	0x21

#define AWBR	0x30

#define DWHR	0x31						//new(have change)

#define AWLR	0x40

#define DWLR	0x41

#define AWTR	0x50

#define DWTR	0x51

#define CURX	0x60						//new(have change)

#define BGSG	0x61

#define EDSG    0x62						//new

#define CURY	0x70						//new(have change)	

#define BGCM	0x71

#define EDCM	0x72

#define	BTMR	0x80

#define ITCR	0x90						//new(have change)

#define KSCR1	0xA0

#define KSCR2	0xA1

#define KSDR0  	0xA2						//new(have change)

#define KSDR1  	0xA3

#define KSDR2  	0xA4

#define MWCR	0xB0						//new(have change)

#define MRCR	0xB1						//new

#define TPCR	0xC0

#define TPXR	0xC1

#define TPYR	0xC2

#define TPZR	0xC3

#define PCR     0xD0						//new(have change)

#define PDCR    0xD1						//new

#define PNTR	0xE0

#define FNCR	0xF0

#define FVHT	0xF1

你可能感兴趣的:(驱动)