?? 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 + -