Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71303
  • 博文数量: 27
  • 博客积分: 2015
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 19:36
文章分类

全部博文(27)

文章存档

2011年(1)

2010年(5)

2009年(16)

2008年(5)

我的朋友

分类: C/C++

2009-04-16 15:36:45

//=====================================================================
//                    OCMJ4X8C 液晶驱动程序(串行)
//硬件连接: cs——P0^0;  
//          std——P0^1;   
//          sclk——P0^2;    
//          psb——P0^3;  
//          rst——P0^4;
//          VDD--逻辑电源(+5V)
//          VSS--GND(0V)
//ocm4x8c(串).c
//writer:谷雨 2008年3月12日于EDA实验室整理
//=====================================================================
#include

#define uint unsigned int
#define uchar unsigned char


#define comm 0
#define dat   1
#define x1    0x80
#define x2    0x88
#define y     0x80

void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);

//**************************修改硬件时要修改的部分********************************

sbit cs   = P0^0;   //串行口使能,高电平有效(作RS时,1为数据,0为指令)
sbit std = P0^1;     //串口数据(作R/W时,1为读,0为写)
sbit sclk = P0^2;     //串口时钟,高电平有效
sbit psb = P0^3;   //1为选择并口,0为串口
sbit rst = P0^4;   //复位信号,低电平有效

//=================================================================
// 函数名称 :void init_lcd (void)
// 函数功能 :实现lcd初始化
// 入口参数 :无
// 出口参数 :无
//=================================================================
void init_lcd (void)
{
    rst=0;   //复位
delay(100);
rst=1;   //复位无效
psb=0;   //使能串口
wr_lcd (comm,0x30); //30---基本指令动作
wr_lcd (comm,0x01); //清屏,地址指针指向00H
delay (100); //清屏需较长时间
wr_lcd (comm,0x06); //光标的移动方向
    wr_lcd (comm,0x0c); //显示打开,光标关,反白关
}

//=================================================================
//函数名: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;
   wr_lcd (comm,0x30); //30---基本指令动作
   switch(xx)
   {
     case 0:line=0x00;break;
     case 1:line=0x10;break;
     case 2:line=0x08;break;
     case 3:line=0x18;break;
     default:break;
    }
   wr_lcd(comm,0x80+line+yy);    //设定地址
}

//=================================================================
//函数名:void send_str(unsigned char *cc)
//函数功能: 显示汉字或是字符
//入口参数:*cc
//出口参数:无  
//注意:注意为全角字符,即每个字符占十六个字节
//     显示汉字或者字符时先设定显示坐标,最多显示8个汉字          
//=================================================================        
void send_str(uchar code *cc)
{
   unsigned int i;
   wr_lcd (comm,0x30);
   for(i=0;(i<16)&&*(cc+i);i++)
     wr_lcd(dat,*(cc+i));
}

//=================================================================
//函数名:void send_img(unsigned code *img)
//函数功能: 显示图形
//入口参数:uchar code *img    
//出口参数:无
//注意:显示图形时先写第一行数据,依次向后
//=================================================================
void send_disp (uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++)      //上半屏写入图形数据
{
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34); //8位控制端口,选择扩充指令集
      wr_lcd (comm,y+j); //选择图形区Y轴坐标
      wr_lcd (comm,x1+i); //选择图形区X轴坐标
      wr_lcd (comm,0x30); //选择基本指令集
      wr_lcd (dat,img[j*16+i*2]); //写图形数据
      wr_lcd (dat,img[j*16+i*2+1]);
    }
}
for(j=32;j<64;j++)    //下半屏写入图形数据
{
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y+j-32);
      wr_lcd (comm,x2+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,img[j*16+i*2]);
      wr_lcd (dat,img[j*16+i*2+1]);
    }
}
wr_lcd (comm,0x36);   //写入数据后选择图形显示
}

//=================================================================
//函数名:void send_img1(unsigned char *img)
//函数功能: 下半屏显示图形
//入口参数:uchar code *img
//出口参数:无    
//=================================================================
void send_img1(uchar code *img)
{
uchar i,j;
for(j=0;j<32;j++)
{
    for(i=0;i<8;i++)
    {
      wr_lcd (comm,0x34);  
      wr_lcd (comm,y+j);  
      wr_lcd (comm,x2+i);  
      wr_lcd (comm,0x30);  
      wr_lcd (dat,img[j*16+i*2]);  
      wr_lcd (dat,img[j*16+i*2+1]);
    }
}
wr_lcd (comm,0x36);
}

//=================================================================
//函数名:void lat_disp (uchar data1,uchar data2)
//函数功能:显示点阵
//入口参数:uchar data1 奇数行显示的点阵
//         uchar data2 偶数行显示的点阵
//出口参数:无
//=================================================================
void lat_disp (uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);    //8位控制端口,选择扩充指令集
        wr_lcd (comm,y+j*2);   //Y轴
        wr_lcd (comm,x+i);    //X轴
        wr_lcd (comm,0x30);    //选择基本指令集
        wr_lcd (dat,data1);    //写入数据
        wr_lcd (dat,data1);
      }
      for(i=0;i<8;i++)
      {
        wr_lcd (comm,0x34);
        wr_lcd (comm,y+j*2+1);
        wr_lcd (comm,x+i);
        wr_lcd (comm,0x30);
        wr_lcd (dat,data2);
        wr_lcd (dat,data2);
      }
    }
    x=x2;
}
wr_lcd (comm,0x36);   //写入数据后选择显示
}

//=================================================================
//函数名:void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
//函数功能:反白显示
//入口参数:data1,data2,x0,y0,x1,y1
//     当data1=0xff,data2=0xff时,在x0,y0处开始反白显示区域为16*xl*yl.
//出口参数:无
//=================================================================

void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j{
    for(i=0;i    {
      wr_lcd (comm,0x34);
      wr_lcd (comm,y0+j);
      wr_lcd (comm,x0+i);
      wr_lcd (comm,0x30);
      wr_lcd (dat,data1);
      wr_lcd (dat,data2);
    }
}
wr_lcd (comm,0x36);
}

//=================================================================
//函数名:void con_disp_line (uchar line)
//函数功能:选择某行反白显示
//入口参数:line
//         line为1或者2,1选择1、3行反白显示,2选择2、4行反白显示
//出口参数:无
//=================================================================
void con_disp_line (uchar line)
{
     uchar a;
     wr_lcd (comm,0x34); //8位控制端口,选择扩充指令集
switch(line)
{
       case 1:a=0x04;break;
       case 2:a=0x05;break;
       default:break;
     }
wr_lcd (comm,a);     //反白选择
delay(50);
wr_lcd (comm,0x36);   //显示

}
//=================================================================
//函数名:void clear()
//函数功能:清屏
//入口参数:无
//出口参数:无
//=================================================================
void clear (void)
{
wr_lcd (comm,0x30);   //选择基本指令集
wr_lcd (comm,0x01);   //清屏
delay (180);     //延时
}

//=================================================================
//函数名:void clear_line(uint line)
//函数功能:清除一行
//入口参数: line 0~3
//出口参数:无
//=================================================================
void clear_line(uint line) //清除一行(0~3行)
{
uint i;
set_position(line,0);
for(i=0;i<16;i++)
    wr_lcd (dat,0x20);//填充空格
}
//=================================================================
//函数名:void clear_point(unsigned int line,unsigned int row)
//函数功能:清除一点
//入口参数: line 选择的行
//          row 选择的列
//出口参数:无
//=================================================================
void clear_point(unsigned int line,unsigned int row)
{
set_position(line,row);
wr_lcd (dat,0x20);//填充空格
wr_lcd (dat,0x20);
}

//=================================================================
// 函数名称 :void delay (uint us)
// 函数功能 :延时
// 入口参数 :us 延时时间的长短
// 出口参数 :无
//=================================================================
void delay (uint us)  
{
while(us--);
}

//=================================================================
// 函数名称 :void wr_lcd (uchar dat_comm,uchar content)
// 函数功能 :向lcd中写数据或者指令
// 入口参数 :dat_comm 选择是写数据或者写指令位
//            content    dat_comm为1时写数据,否则写指令
// 出口参数 :无
//=================================================================
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50);    //延时,等待内部动作完成
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++)   //写入5个1,作为启动位
{
    sclk=1;
    sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)    //判断写数据还是指令
    std=1;   //data
else
    std=0;   //command
sclk=1;
sclk=0;
std=0;      //写入1个0
sclk=1;
sclk=0;
for(j=0;j<2;j++)  
{
    for(i=0;i<4;i++) //分别写入高四位和低四位
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;       //写入4个0
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
}
}

阅读(2182) | 评论(1) | 转发(0) |
0

上一篇:双机通讯1

下一篇:51单片机简单串口程序

给主人留下些什么吧!~~

chinaunix网友2009-05-09 12:33:51

我司有完全兼容OCMJ4X8C 的液晶屏,而且价格有优势,已经成批量替代OCMJ4X8C了,如有需要麻烦你联系我 QQ:479900288 MSN:yinlinjiang1985@hotmail.com