?? mspf2ocm128c.c
字號:
/**********************
//2008年9月3日,需要重新檢查兩個延時函數
命令:
參照廠家給的程序
**************************/
#include "msp430x22x2.h"
#include "mspf2ocm128c.h"
uchar read_gt_data_32[32];
/***********************************************************************/
ulong get_chn16x16_addr_of_gt(uchar msb,uchar lsb)
{
ulong addr=0x00000000;
if(msb>=0xa1 && msb<=0xab && lsb>=0xa1)
addr=(((ulong)msb-0xa1)*94+((ulong)lsb-0xa1))*32;
else if(msb>=0xb0 && msb<=0xf7 && lsb>=0xa1)
addr=(((ulong)msb-0xb0)*94+((ulong)lsb-0xa1))*32+0x69c0;
return addr;
}
ulong get_eng8x16_addr_of_gt(uchar ASCIICode)
{
ulong addr=0x0003b7c0;
if(ASCIICode>=0x20 && ASCIICode<=0x7e)
{
if(ASCIICode>=0x60)
addr=((ulong)ASCIICode-0x20+1)*16+addr;
else
addr=((ulong)ASCIICode-0x20)*16+addr;
}
return addr;
}
ulong get_eng8x8_addr_of_gt(uchar ASCIICode)
{
ulong addr=0x0003bfc0;
if(ASCIICode>=0x20 && ASCIICode<=0x7f)
addr=((ulong)ASCIICode-0x20)*8+addr;
return addr;
}
void send_byte_to_gt(uchar outdata)
{
GT_DIR |= GT_SI + GT_SCLK;
uchar i;
for(i=0;i<8;i++)
{
GT_OUT &= ~GT_SCLK;
if((outdata&0x80)==0x80)
GT_OUT |= GT_SI;
else
GT_OUT &= ~GT_SI;
GT_OUT |= GT_SCLK;
outdata=outdata<<1;
}
//送完數據必須將時鐘拉高,因為發送完地址后在下降沿接收數據,如果時鐘不為高,在置高時會發送一個數據過去,導致出錯
}
uchar get_byte_from_gt(void)
{
uchar i,indata=0x00;
GT_DIR |= GT_SCLK;
GT_DIR &= ~GT_SO;
for(i=0;i<8;i++)
{
indata=indata<<1;
GT_OUT &= ~GT_SCLK;
if(GT_IN & GT_SO)
indata=indata|0x01;
GT_OUT |= GT_SCLK;
}
return indata;
}
void highspeed_readdata_from_gt(ulong addr,uchar byte_number)
{
uchar i;
GT_DIR |= GT_CS;
GT_OUT &= ~GT_CS;
GT_OUT &= ~GT_CS;
GT_OUT &= ~GT_CS;
send_byte_to_gt(0x0b);
send_byte_to_gt(addr>>16);
send_byte_to_gt(addr>>8);
send_byte_to_gt(addr);
send_byte_to_gt(0xff);
for(i=0;i<byte_number;i++)
read_gt_data_32[i]=get_byte_from_gt();
GT_OUT |= GT_CS;
}
/***********************************************************************/
void delay_nus(uint n) //delay time
{
while(n--)_NOP();
}
/*毫秒級延時*/
void delay_n_ms(uint n)
{
int i;
for(i=0;i<n;i++)
delay_nus(140);
}
//..........串口寫..........
void serial_write(uchar lcm_cmd_or_data)
{
uchar i;
OCM128_DIR |= OCM128_SCLK + OCM128_CS + OCM128_CDA;
OCM128_OUT |= OCM128_SCLK;
OCM128_OUT &= ~OCM128_CS; //片使能
for(i=0;i<8;i++)
{
if((lcm_cmd_or_data&0x80)==0x80)
OCM128_OUT |= OCM128_CDA;
else
OCM128_OUT &= ~OCM128_CDA;
OCM128_OUT &= ~OCM128_SCLK; //注意時序
OCM128_OUT |= OCM128_SCLK; //注意時序
lcm_cmd_or_data = lcm_cmd_or_data<<1;
}
OCM128_OUT |= OCM128_CS;//片禁能
delay_n_ms(1);
}
//..........寫命令..........
void send_cmd(uchar lcm_cmd)
{
OCM128_DIR |= OCM128_AO;
OCM128_OUT &= ~ OCM128_AO;
serial_write(lcm_cmd);
}
//..........寫數據到DDRAM..........
void send_data(uchar lcm_data)
{
OCM128_DIR |= OCM128_AO;
OCM128_OUT |= OCM128_AO;
serial_write(lcm_data);
}
/*寫頁地址*/
void set_page_address(unsigned char dat)
{
send_cmd(dat|0xb0); //Page Address Set:bit3--bit0:Page address 0--8
}
/*寫列地址 topped at 83H*/
void set_column_address(unsigned char dat)
{
send_cmd((dat>>4)|0x10); //送列地址高四位
send_cmd(dat&0x0f); //送列地址低四位
}
/*初始化*/
void lcd_initial(void)
{
OCM128_DIR |= OCM128_RST;
OCM128_OUT |= OCM128_RST;
delay_n_ms(1);
OCM128_OUT &= ~OCM128_RST;
delay_n_ms(5);
OCM128_OUT |= OCM128_RST;
delay_n_ms(5);
/*send_cmd(0xa0);
send_cmd(0xc8); //bit3:select COM output direction 0=normal 1=reverse 如:normal:com0--com63 ;reverse:com63--com0
send_cmd(0xa2); //lcd bias set:bit0 = 1:1/7 bias ;bit1 = 1: 1/9bias
send_cmd(0x2c); //d2:1=select internal power supply operating mode
send_cmd(0x2e); //Power Controller Set
send_cmd(0x2f); //Power Controller Set
send_cmd(0x25); //voltage Regulator internal Resistor Ratio Set
send_cmd(0x81); //The Electronic Volume Mode Set
send_cmd(0x18); //Column Address Set :bit4 = 1: High bits;bit4 = 0: low bits;
send_cmd(0xaf); //Display ON/OFF :bit0=0:Off;bit0=1:On;
send_cmd(0xe0); //Column address increment :at write:+1;at read: 0
send_cmd(0x40); //set the display RAM start line address*/
//////////////////////////////////////////////////////////////////////////
send_cmd(0xdc);
send_cmd(0xc8);
send_cmd(0xa2);
send_cmd(0xc8);
send_cmd(0x2c);
send_cmd(0x2e);
send_cmd(0x2f);//
send_cmd(0x25);//
send_cmd(0xf8);//
send_cmd(0x01);//
send_cmd(0x81);//
send_cmd(0x20);//
send_cmd(0xaf); //
send_cmd(0xe0); //
send_cmd(0x40); //
//////////////////////////////////////////////////////////////////
GT_DIR |= GT_CS + GT_SCLK;
GT_OUT &= ~GT_CS;
GT_OUT &= ~GT_SCLK;
GT_OUT |= GT_CS;
GT_OUT |= GT_SCLK;
}
//..........顯示中文.............
void disp_chinese(uchar *chn,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number,uchar white)
{
uchar i,j,k;
for(i=0;i<y_number;i++)
{
for(j=0;j<x_number;j++)
{
highspeed_readdata_from_gt(get_chn16x16_addr_of_gt(*(chn+i*x_number*2+j*2),*(chn+i*x_number*2+j*2+1)),32);
set_page_address(page_addr+i*2);
set_column_address(clm_addr+j*16);
if (white == 0)
{
for(k=0;k<16;k++)
{
send_data(read_gt_data_32[k*2]);
}
set_page_address(page_addr+i*2+1);
set_column_address(clm_addr+j*16);
for(k=0;k<16;k++)
{
send_data(read_gt_data_32[k*2+1]);
}
}
else if(white == 1)
{
for(k=0;k<16;k++)
{
send_data(~read_gt_data_32[k*2]);//這樣寫對不
}
set_page_address(page_addr+i*2+1);
set_column_address(clm_addr+j*16);
for(k=0;k<16;k++)
{
send_data(~read_gt_data_32[k*2+1]);
}
}
}
}
}
//..........顯示8x16點陣字符.............
void disp_8x16character(uchar *eng,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number,uchar white) // y_number 和x_number的為實際數減1
{
uchar i,j,k;
for(i=0;i<=y_number;i++)
{
for(j=0;j<=x_number;j++)
{
highspeed_readdata_from_gt(get_eng8x16_addr_of_gt(*(eng+i*x_number+j)),16);
set_page_address(page_addr+i*2);
set_column_address(clm_addr+j*8);
if(white ==0)
{
for(k=0;k<8;k++)
{
send_data(read_gt_data_32[k*2]);
}
set_page_address(page_addr+i*2+1);
set_column_address(clm_addr+j*8);
for(k=0;k<8;k++)
{
send_data(read_gt_data_32[k*2+1]);
}
}
else if(white == 1)
{
for(k=0;k<8;k++)
{
send_data(~read_gt_data_32[k*2]);
}
set_page_address(page_addr+i*2+1);
set_column_address(clm_addr+j*8);
for(k=0;k<8;k++)
{
send_data(~read_gt_data_32[k*2+1]);
}
}
}
}
}
//..........顯示8x8點陣字符.............
void disp_8x8character(uchar *eng,uchar page_addr,uchar clm_addr,uchar x_number,uchar y_number)
{
uchar i,j,k;
for(i=0;i<y_number;i++)
{
for(j=0;j<x_number;j++)
{
highspeed_readdata_from_gt(get_eng8x8_addr_of_gt(*(eng+i*x_number+j)),8);
set_page_address(page_addr+i);
set_column_address(clm_addr+j*8);
for(k=0;k<8;k++)
{
send_data(read_gt_data_32[k]);
}
}
}
}
void disp_8x8character1(uchar *eng,uchar page_addr,uchar clm_addr)
{
uchar k;
set_page_address(page_addr);
set_column_address(clm_addr);
for(k=0;k<8;k++)
{
send_data(read_gt_data_32[k]);
}
}
//..........顯示點陣..........
void disp_lattice(uchar lcm_data1,uchar lcm_data2)
{
uchar i,j;
for(i=0;i<8;i++)
{
set_page_address(i);
set_column_address(0x00);
for(j=0;j<64;j++)
{
send_data(lcm_data1);
send_data(lcm_data2);
}
}
}
//..........顯示圖形..........
void disp_graphics(uchar *gph)
{
uchar i,j;
for(i=0;i<8;i++)
{
set_page_address(i);
set_column_address(0x00);
for(j=0;j<128;j++)
{
send_data(*(gph+i*128+j));
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -