zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    NetCore指令集和
    在WPF中的Canvas上实现控件的拖动、缩放
    WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小
    利用百度API(js),怎样通过地址获取经纬度
    讨论一下hibernate如何动态注册一个动态生成的实体类
    大端序vs小端序
    influxdb+telegraf+grafana实现nginx监控
    python库pillow:实现生成图片并加水印
    mac使用之设置vim colors
    学习python库:elasticsearch-dsl
  • 原文地址:https://www.cnblogs.com/yuesheng/p/2151174.html
Copyright © 2011-2022 走看看