📄 320_240_driver.c
字号:
//===========================================================================
// TEST FOR MTG3316
// CONTROLLER: SED1335
// INTERFACE: 8080
// SIDE: 320 X 240 DOTS
//===========================================================================
#include <msp430x24x.h>
#include "math.h"
#include "ra8835.h"
//===========================================================================
unsigned int txthome,grhome;
unsigned int lcmcp,lcmdp,lcd_data;
extern int sindata[256];
//================================================
// 系统设置
// dataTAB1 系统参数设置
// dataTAB2 显示控制设置
//================================================
const unsigned int dataTAB1[ ]={0x0030,0x0087,0x0007,0x0027,0x002C,0x00F0,0x0028,0x0000};
const unsigned int dataTAB2[ ]={0x0000,0x0000,0x00F0,0x00b0,0x0004,0x00F0,0x0000,0x0000,0x0000,0x0000};
//================================================
// 字母点阵定义
//================================================
const unsigned int HZ8_DOT_LIB[16]=
{
/*-- 文字: 0 --0*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00
};
const unsigned int HZ16_DOT_LIB[32]=
{
/*-- 文字: 江 --0*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x00,0x10,0x00,0x13,0xFC,0x00,0x40,0x88,0x40,0x48,0x40,0x50,0x40,0x10,0x40,
0x10,0x40,0x20,0x40,0xE0,0x40,0x20,0x40,0x20,0x40,0x2F,0xFE,0x20,0x00,0x00,0x00
};
const unsigned int HZ24_DOT_LIB[72]=
{
/*-- 文字: 电 0 --*/
/*-- 宋体18; 此字体下对应的点阵为:宽x高=24x24 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,
0x10,0x00,0x0F,0xFF,0xF0,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,
0x20,0x0F,0xFF,0xE0,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,0x08,0x10,0x20,
0x0F,0xFF,0xE0,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x10,0x08,0x00,0x10,0x04,0x00,
0x18,0x0E,0x00,0x0F,0xFC,0x00,0x00,0x00
};
//================================================
// 接口设置
// 8位数据 :(DB0--DB7)
// 输出口 P5.0~P5.7
// 控制信号:(/RES,C/D,/CE,/WR,/RD)
// 输出口 P2.3~P2.7
//================================================
void lcd_init_io(void)
{
// WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P2DIR = 0xff; //控制信号 P4.3~P4.7 /RES,C/D,CE,/WR,/RD
P2OUT = 0xff; //wait p4.0
P5DIR = 0xff; //数据端口 P5.0~P5.7 DB0~DB7
P5OUT = 0xff;
}
//===============================================
//===============================================
void Reset_lcd(void)
{
unsigned int i;
//------------------------------
//8080方式
P2OUT &= ~BIT3; //reset=0 P4.3=0
//------------------------------
for(i=10;i>0;i--)
{
_NOP();
}
P2OUT |= BIT3; //reset=1 P4.3=1
}
//**********************************************
// write one command to lcd
// 写命令
//==============================================
void write_lcd_command(unsigned int a)
{
unsigned int i;
//=================================
P5OUT = a;
//=================================
P2OUT &= ~BIT5; // ce=0 P4.5=0
P2OUT |= BIT4; // c/d=1 P4.4=1 command
P2OUT |= BIT7; // rd=1 P4.7=1
P2OUT &= ~BIT6; // wr=0 P4.6=0
for(i=20;i>0;i--)
{
_NOP();
}
P2OUT |= BIT6; // wr=1 P4.6=1
P2OUT |= BIT5; // ce=1 P4.5=1
//=================================
}
//*********************************************
// write one data to lcd
// 写数据
//*********************************************
void write_lcd_data(unsigned int a)
{
unsigned int i;
//=============================
P5OUT = a;
//==============================
P2OUT &= ~BIT5; // ce=0 P4.5=0
P2OUT &= ~BIT4; // c/d=0 P4.4=0 data
P2OUT |= BIT7; // rd=1 P4.7=1
P2OUT &= ~BIT6; // wr=0 P4.6=0
for(i=20;i>0;i--)
{
_NOP();
}
P2OUT |= BIT6; // wr=1 P4.6=1
P2OUT |= BIT5; // ce=1 P4.5=1
//==================================================
}
//*********************************************
// read display data or cursr adress
// 读显示数据或光标地址
//*********************************************
unsigned int read_lcd_data(void)
{
unsigned int i,data4;
//==============================
P5DIR = 0x00; //数据端口输入
//==============================
P2OUT &= ~BIT5; // ce=0 P4.5=0
P2OUT |= BIT4; // c/d=1 P4.4=1 data
P2OUT |= BIT6; // wr=1 P4.6=1
//=================================
P2OUT &= ~BIT7; // rd=0 P4.7=0
for(i=2;i>0;i--)
{
_NOP();
}
//=================================
data4 = P5IN&0xff;
//=================================
// P2OUT |= BIT2; // rd=1 P4.7=1
P2OUT |= BIT7;
P2OUT |= BIT5; // ce=1 P4.5=1
//=================================
P5DIR = 0xff; //重新定义数据端口输出
//=================================
return(data4);
}
//*********************************************
// clear text ram
// 清除文本区
//==================================================
void clr_textram(void)
{
unsigned int i;
write_lcd_command(0x4c); // Set direction of cursor movement
write_lcd_command(0x46); // Set cursor address
write_lcd_data(0);
write_lcd_data(0);
write_lcd_command(0x42); // Write to display memory
for(i=0;i<1200;i++)
{
write_lcd_data(0x00); // 文本区写数据 空格符
}
}
//*********************************************
// clear graphics ram
// 清除图形区
//==================================================
void clr_grphram(void)
{
unsigned int i;
write_lcd_command(0x4c); // Set direction of cursor movement
write_lcd_command(0x46); // Set cursor address
write_lcd_data(0xb0);
write_lcd_data(0x04);
write_lcd_command(0x42); //Write to display memory
for(i=0;i<9600;i++)
{
write_lcd_data(0x00); // 文本区写数据 空格符
}
}
//==================================================
//==================================================
void lcm_init(void)
{
unsigned int i;
const unsigned int *p;
Reset_lcd();
//---------------------------------
p=&dataTAB1[0];
write_lcd_command(0x40); // Initialize device and display
for(i=0;i<8;i++)
{
write_lcd_data(*p++); // 写系统设置数据
}
p=&dataTAB2[0];
write_lcd_command(0x44); // Set display start address and display regions
for(i=0;i<8;i++)
{
write_lcd_data(*p++); // 写显示控制数据
}
write_lcd_command(0x5a); // Set horizontal scroll position
write_lcd_data(0x00);
write_lcd_command(0x5b); // Set display overlay format
write_lcd_data(0x00); //
//write_lcd_command(0x60); //
//write_lcd_data(0x00); //
clr_textram();
clr_grphram();
write_lcd_command(0x59); //???? 58 Enable display flashing; 59 Disable display flashing
write_lcd_data(0x14); // text graph on 04
//=================================
}
//==================================================
void Test(void)
{
unsigned int i,j;
write_lcd_command(0x4c); //光标方向 // Set direction of cursor movement
write_lcd_command(0x46); //光标地址 // Set cursor address
write_lcd_data(0x00);
write_lcd_data(0x00);
write_lcd_command(0x42); //写显示存储器地址 //Write to display memory
for(i=0;i<30;i++)
{
for(j=0;j<40;j++)
{
write_lcd_data(0x0033); // 写数据
}
}
}
//==================================================
void Test1(void)
{
unsigned int i;
//----------------------------------
write_lcd_command(0x4c);
write_lcd_command(0x46);
write_lcd_data(0xb0);
write_lcd_data(0x04);
write_lcd_command(0x42);
for(i=0;i<9600;i++)
{
write_lcd_data(0x0f); // 写数据
}
}
//==================================================
void wr_cmd_2(unsigned int uCmd,unsigned int uPar) // 带两个参数的命令
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
lcmdp= uPar&0xff;
write_lcd_data(lcmdp);
lcmdp=uPar>>8;
lcmdp&=0x00ff;
write_lcd_data(lcmdp);
}
//==================================================
void wr_cmd_1(unsigned int uCmd,unsigned int uPar) // 带一个参数的命令
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
lcmdp= uPar;
write_lcd_data(lcmdp);
}
//==================================================
void wr_cmd_0(unsigned int uCmd) // 不带带参数的命令
{
lcmcp=uCmd;
write_lcd_command(lcmcp);
}
//==================================================
// 画水平线(Y1=Y2) X=8*i
//==================================================
void lineH(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
unsigned int i,ipos,length1,length2;
ipos=y1*40+x1/8+1200;
length1=y2*40+x2/8+1200;
length2=length1-ipos;
wr_cmd_0(0x4c);
wr_cmd_2(0x46,ipos);
wr_cmd_0(0x42);
for(i=0;i<length2;i++)
{
write_lcd_data(0xff);
}
}
//==================================================
// 画点
//==================================================
void pixel(unsigned int PointY,unsigned int PointX) // PointY 行 PointX 列
{
unsigned int i, StartAddr;
unsigned int dat,dat2,dat3;
StartAddr=PointY*40 + PointX/8 +1200;
dat=(unsigned int)(7-PointX%8); //产生点的数据
dat2=0x0001;
for(i=0;i<dat;i++)
{
dat2<<=1;
}
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,StartAddr); //读该点所在单元地址内容
wr_cmd_0(0x0043);
dat3=read_lcd_data();
dat2|=dat3;
wr_cmd_0(0x004c);
wr_cmd_2(0x0046,StartAddr); //设置该点所在单元地址
wr_cmd_1(0x0042,dat2); // 画点位数据
}
//==================================================
// 画点--点
//==================================================
void line(unsigned int y1,unsigned int x1,unsigned int y2,unsigned int x2)
{
unsigned int x,y;
float k,b;
if(x1==x2) // x1=x2,画垂直线
{
if(y1<=y2)
{
for(y=y1;y<=y2;y++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -