分类: 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;
}
}
}
chinaunix网友2009-05-09 12:33:51
我司有完全兼容OCMJ4X8C 的液晶屏,而且价格有优势,已经成批量替代OCMJ4X8C了,如有需要麻烦你联系我 QQ:479900288 MSN:yinlinjiang1985@hotmail.com