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
已阅
谢谢