//=====================================================================
// OCMJ4X8C 液晶驱动程序(串行)
//硬件连接:SCLK--0.15
// STD--0.14
// CS--0.13
// PSB--接地 选择串行工作方式
// VSS--GND(0V)
// VDD--逻辑电源(+5V)
//
//=====================================================================
#include "config.h"
//**************************修改硬件时要修改的部分********************************
#define CS_1 (1<<13) //0.13
#define STD_1 (1<<14) //0.14
#define SCLK_1 (1<<15) //0.15
#define delay1 delay(4)
//********************************************************************************
#define CS_H IO0SET=CS_1 //CS->1 data
#define CS_L IO0CLR=CS_1 //CS->0 code
#define STD_H IO0SET=STD_1 //STD->1 //read
#define STD_L IO0CLR=STD_1 //write
#define SCLK_H IO0SET=SCLK_1 //SCLK->1
#define SCLK_L IO0CLR=SCLK_1
//***************************************************888
#define x1 0x80
#define x2 0x88
#define y 0x80
//============================================================
//函数名:
//延时
//
//============================================================
void delay(uint32 dly1)
{
uint32 j;
for(;dly1>0;dly1--)
for(j=0;j<6;j++);
}
void delay2(uint32 dly2)
{
uint32 j;
for(;dly2>0;dly2--)
for(j=0;j<50000;j++);
}
//=================================================================
//函数名:void OCM_send(unsigned int data,unsigned int flag)
//函数功能: 串行发送数据的函数
//入口参数:data flag
// flag=0: send code flag=1 :send data
//=================================================================
void OCM_send(unsigned int data,unsigned int flag)
{
unsigned int i,j;
SCLK_L; //SCLK=0
CS_H;
STD_H;
for(i=5;i>=1;i--)
{
SCLK_H;
delay1;
SCLK_L;
}
STD_L;//write
SCLK_H;
delay1;
SCLK_L;
if(flag==1) STD_H;//read
else STD_L;//write
SCLK_H;
delay1;
SCLK_L;
STD_L; //0write
SCLK_H;
delay1;
SCLK_L;
for(j=0;j<2;j++)
{
for(i=4;i>=1;i--)
{
if(data&0x0080)STD_H; //第8位
else STD_L;
SCLK_H;
delay1;
SCLK_L;
data=data<<1;
}
for(i=4;i>=1;i--)
{
STD_L;
SCLK_H;
delay1;
SCLK_L;
}
}
CS_L;
}
//=================================================================
//函数名:void OCM_lcd_init()
//函数功能:LCE 初始化
//无参数
//=================================================================
void OCM_lcd_init()
{
PINSEL0 =PINSEL0&0x03ffffff; // 管脚连接GPIO
IO0DIR|=(CS_1+STD_1+SCLK_1);
IO0CLR=(CS_1+STD_1+SCLK_1);
OCM_send(0x0020,0);
OCM_send(0x000c,0);
OCM_send(0x0001,0);
delay2(10);
}
//=================================================================
//函数名:void set_position(unsigned int a,unsigned int b)
//函数功能: 设定显示坐标
//参数:xx yy
// xx:0~3 yy:0~7
//=================================================================
void set_position(unsigned int xx,unsigned int yy) //坐标
{
unsigned int line;
switch(xx)
{
case 0:line=0x00;break;
case 1:line=0x10;break;
case 2:line=0x08;break;
case 3:line=0x18;break;
default:break;
}
OCM_send(0x0080+line+yy,0);
}
//=================================================================
//函数名:void send_chn(unsigned char *chn)
//函数功能: 显示汉字或是字符
//参数:chn
//注意:注意为全角字符,即每个字符占十六个字节
//=================================================================
void send_chn (char *chn[])
{
unsigned int i,j;
OCM_send (0x30,0);
OCM_send (0x80,0);
j=0;
for (i=0;i<16&&(*(chn[0]+i));i++)
OCM_send (*(chn[0]+i),1);
j=1;
OCM_send (0x30,0);
OCM_send (0x90,0);
for (i=0;i<16&&(*(chn[1]+i));i++)
OCM_send (*(chn[1]+i),1);
j=2;
OCM_send (0x30,0);
OCM_send (0x88,0);
for (i=0;i<16&&(*(chn[2]+i));i++)
OCM_send (*(chn[2]+i),1);
j=3;
OCM_send (0x30,0);
OCM_send (0x98,0);
for (i=0;i<16&&(*(chn[3]+i));i++)
OCM_send (*(chn[3]+i),1);
}
//=================================================================
//函数名:void send_str(unsigned char *cc)
//函数功能: 显示汉字或是字符
//参数:*cc
//注意:注意为全角字符,即每个字符占十六个字节
//=================================================================
void send_str(unsigned char *cc)
{
unsigned int i;
for(i=0;(i<16)&&*(cc+i);i++)
OCM_send(*(cc+i),1);
/* if((i>=16)&&(i<32))
{
set_position(1,0);
for(i=16;(i<32)&&*(cc+i);i++)
OCM_send(*(cc+i),1);
}
if((i>=32)&&(i<48))
{
set_position(2,0);
for(i=32;(i<48)&&*(cc+i);i++)
OCM_send(*(cc+i),1);
}
if((i>=48)&&(i<64))
{
set_position(3,0);
for(i=48;(i<64)&&*(cc+i);i++)
OCM_send(*(cc+i),1);
}*/
}
//=================================================================
//函数名:void send_img1(unsigned char *img)
//函数功能: 下半屏显示图形
//参数:unsigned char *img
//=================================================================
void send_img1(unsigned char *img)
{
unsigned int i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
OCM_send(0x34,0);
OCM_send (y+j,0);
OCM_send (x2+i,0);
OCM_send (0x30,0);
OCM_send (img[j*16+i*2],1);
OCM_send (img[j*16+i*2+1],1);
}
}
OCM_send (0x36,0);
}
//=================================================================
//函数名:void send_img(unsigned char *img)
//函数功能: 显示图形
//参数:unsigned char *img
//=================================================================
void send_img(unsigned char *img)
{
unsigned int i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
OCM_send (0x34,0);
OCM_send (y+j,0);
OCM_send (x1+i,0);
OCM_send (0x30,0);
OCM_send (img[j*16+i*2],1);
OCM_send (img[j*16+i*2+1],1);
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
OCM_send (0x34,0);
OCM_send (y+j-32,0);
OCM_send (x2+i,0);
OCM_send (0x30,0);
OCM_send (img[j*16+i*2],1);
OCM_send (img[j*16+i*2+1],1);
}
}
OCM_send (0x36,0);
}
//=================================================================
//函数名:void lat_disp (unsigned char data1,unsigned char data2)
//函数功能:显示点阵
//参数:unsigned char data1,unsigned char data2
//=================================================================
void lat_disp (unsigned char data1,unsigned char data2)
{
unsigned char i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
OCM_send (0x34,0);
OCM_send (y+j*2,0);
OCM_send (x+i,0);
OCM_send (0x30,0);
OCM_send (data1,1);
OCM_send (data1,1);
}
for(i=0;i<8;i++)
{
OCM_send (0x34,0);
OCM_send (y+j*2+1,0);
OCM_send (x+i,0);
OCM_send (0x30,0);
OCM_send (data2,1);
OCM_send (data2,1);
}
}
x=x2;
}
OCM_send (0x36,0);
}
//=================================================================
//函数名:void con_disp (unsigned char data1,unsigned char data2,unsigned char x0,unsigned char y0,unsigned char xl,unsigned char yl)
//函数功能:反白显示
//参数:data1,data2,x0,y0,x1,y1
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
//=================================================================
void con_disp (unsigned char data1,unsigned char data2,unsigned char x0,unsigned char y0,unsigned char xl,unsigned char yl)
{
unsigned char i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;i++)
{
OCM_send (0x34,0);
OCM_send (y0+j,0);
OCM_send (x0+i,0);
OCM_send (0x30,0);
OCM_send (data1,1);
OCM_send (data2,1);
}
}
OCM_send (0x36,0);
}
//=================================================================
//函数名:void clear()
//函数功能:清屏
//参数:
//=================================================================
void clear() //清屏
{
OCM_send (0x30,0);
OCM_send(0x01,0);
delay2(10);
}
//=================================================================
//函数名:void clear_line(unsigned int line)
//函数功能:清除一行
//参数: line 1~4
//=================================================================
void clear_line(unsigned int line) //清除一行(0~3行)
{
unsigned int i;
set_position(line,0);
for(i=0;i<16;i++)OCM_send(0x20,1);
}
//=================================================================
//函数名:void clear_point(unsigned int line,unsigned int row)
//函数功能:清除一点
//参数: line row
//=================================================================
void clear_point(unsigned int line,unsigned int row)
{
set_position(line,row);
OCM_send(0x20,1);
OCM_send(0x20,1);
}
//=========================
void opwhite(void)
{
CS_L;
STD_L;
OCM_send(0x04,0);
}
unsigned char menu2[]={ "菜单菜单菜单菜单菜单asdf"};
int main()
{
char *menu1[]={ "菜单一啊啊啊啊", //the main menu
"菜单二呵呵",
"菜单三",
"菜单四"};
PINSEL0 = 0x00000000; // 设置所有管脚连接GPIO
PINSEL1 = 0x00000000;
IO0DIR=(CS_1+STD_1+SCLK_1);
OCM_lcd_init();
set_position(0,0);
send_chn(menu1);
//set_position(0,0);
// OCM_send(0x10,1);
while(1);
}