发新话题
打印

[资料整理]OCMJ4X8C 液晶驱动程序(串行)

本主题由 YYLT 于 2008-8-15 20:30 解除置顶

[资料整理]OCMJ4X8C 液晶驱动程序(串行)

//=====================================================================
//                    OCMJ4X8C 液晶驱动程序(串行)
//硬件连接:SCLK--IOB15
//         STD--IOB14
//         CS--IOB13
//         PSB--接地  选择串行工作方式
//         VDD--GND(0V)
//         VSS--逻辑电源(+5V)
//
//=====================================================================
#include "SPCE061A.H"
//**************************修改硬件时要修改的部分********************************
#define CS_1 0x2000
#define STD_1 0x4000
#define SCLK_1 0x8000
#define lcd_io_dir *P_IOB_Dir
#define lcd_io_attrib *P_IOB_Attrib
#define lcd_io_data   *P_IOB_Data
#define lcd_io_buffer *P_IOB_Buffer
#define lcds_delay   delay(1)  //修改此,有可能影响显示
//********************************************************************************
#define CS_H    lcd_io_buffer|=CS_1   //CS->1            data
#define CS_L    lcd_io_buffer&=0xFFFF-CS_1   //CS->0      code
#define STD_H   lcd_io_buffer|=STD_1    //STD->1       //read
#define STD_L   lcd_io_buffer&=0xFFFF-STD_1//write
#define SCLK_H  lcd_io_buffer|=SCLK_1   //SCLK->1      
#define SCLK_L  lcd_io_buffer&=0xFFFF-SCLK_1
//***************************************************888
#define x1    0x80
#define x2    0x88
#define y     0x80

void OCM_lcd_init();
void OCM_send(unsigned int data,unsigned int flag);
void delay(unsigned int dd) ;
//=================================================================
//函数名:void OCM_lcd_init()
//函数功能:LCE 初始化
//无参数
//=================================================================
void OCM_lcd_init()
{
   lcd_io_dir|=CS_1+STD_1+SCLK_1;
   lcd_io_attrib|=CS_1+STD_1+SCLK_1;
   lcd_io_data&=0xFFFF-CS_1+STD_1+SCLK_1;
   OCM_send(0x0020,0);  //
   OCM_send(0x0001,0);   //
   OCM_send(0x000c,0);
}
//=================================================================
//函数名: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,t;
    SCLK_L;   //SCLK=0
    CS_H;
    STD_H;
    for(i=5;i>=1;i--)
    {
       SCLK_H;
       lcds_delay;
       SCLK_L;
     }
     STD_L;//write
     SCLK_H;
     lcds_delay;
     SCLK_L;
     if(flag==1) STD_H;//read
     else STD_L;//write
     SCLK_H;
     lcds_delay;
     SCLK_L;
     STD_L;  //0write
     SCLK_H;
     lcds_delay;
     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;
            lcds_delay;
            SCLK_L;
            data=data<<1;
          }
        for(i=4;i>=1;i--)
        {
            STD_L;
            SCLK_H;
            lcds_delay;
            SCLK_L;
         }
      }
      CS_L;
}
//=================================================================
//函数名: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_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(0x01,0);
}
//=================================================================
//函数名: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);
lcds_delay;

}
//============================================================
//函数名:
//延时
//
//============================================================            
void delay(unsigned int dd)    //延时((50*dd+126)*30.5)ns 最小延时(dd=0)3843ns,最大延时1s
{          //延时t us--dd=t*0.65536-2.52,延时10ms--dd=6551,20ms--dd=13104
unsigned int temp;
temp=*P_SystemClock;
*P_SystemClock=0x50;  //选择CPUCLK=32.768MHz,周期=30.5ns
while(dd--)*P_Watchdog_Clear=0x0001;
*P_SystemClock=temp;
}
我是个好男人啊 嫁给我吧 我们村很好的 我还有几亩地,家里有一头牛,2个猪 还有很多 够你吃的了
佛曰:人脸是一个苦字,苦今生,修来世!
我的博客:http://hi.baidu.com/murufy

TOP

这个程序是上一任版主lnyper的程序.我做了一些修改,加了一些注释!特此说明
我是个好男人啊 嫁给我吧 我们村很好的 我还有几亩地,家里有一头牛,2个猪 还有很多 够你吃的了
佛曰:人脸是一个苦字,苦今生,修来世!
我的博客:http://hi.baidu.com/murufy

TOP

arm上的,根据上面的程序改的


//=====================================================================
//                    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);
}

TOP

引用:
原帖由 杜宇 于 2008-8-13 08:17 发表

//=====================================================================
//                    OCMJ4X8C 液晶驱动程序(串行)
//硬件连接:SCLK--0.15
//         STD--0.14
//         CS-- ...
写得不错,好好努力,加油
我是个好男人啊 嫁给我吧 我们村很好的 我还有几亩地,家里有一头牛,2个猪 还有很多 够你吃的了
佛曰:人脸是一个苦字,苦今生,修来世!
我的博客:http://hi.baidu.com/murufy

TOP

还是这个问题,我什么时候能看懂这些程序呀?
肯定很有用。。

TOP

引用:
原帖由 牧云天 于 2008-8-14 19:09 发表
还是这个问题,我什么时候能看懂这些程序呀?
肯定很有用。。
不是学过C语言了么??这就是C了,不懂的地方只是与硬件有关的地方,一学就会,不用担心,呵
我是个好男人啊 嫁给我吧 我们村很好的 我还有几亩地,家里有一头牛,2个猪 还有很多 够你吃的了
佛曰:人脸是一个苦字,苦今生,修来世!
我的博客:http://hi.baidu.com/murufy

TOP

发新话题
版块跳转