基于LPC213X的OCMJ8X15B驱动(以前写的,大家别笑我)
#include "config.h"#include "string.h"
#include <stdio.h>
/*定义总线起始的GPIO,即对应的GPIO值(本程序中为p1.18)*/
#define BUS_NO 18
/*输出总线宏定义 用于拉低拉高电平,以准备及发送数据*/
#define Data_Start() IO1CLR = 0xff<<BUS_NO //将总线电平拉低,准备数据
#define Data_Send(dat) IO1SET = dat<<BUS_NO
/*定义BUSY控制*/
#define LCM_BUSY 7 //接第4位
#define LCM_IOPIN IO0PIN //接P0 即接P0.4
#define BUSY_1 LCM_IOPIN &(1<<LCM_BUSY)
/*定义REQ控制*/
#define LCM_REQ 5
#define SREQ() IO0SET =1<<LCM_REQ
#define CREQ() IO0CLR =1<<LCM_REQ
/*定义REQ控制*/
#define LCM_RES 6
#define SRES() IO0SET =1<<LCM_RES
#define CRES() IO0CLR =1<<LCM_RES
/*
*********************************************************
**延时dly * 1 us
*********************************************************
*/
void delay_1(uint32 dly1)
{
uint32 j;
for(;dly1>0;dly1--)
for(j=0;j<=6;j++);
}
/*
*********************************************************
**延时dly * 5 us
*********************************************************
*/
void delay_5(uint32 dly)
{
while(dly--)
delay_1(5);
}
/*
*************************************************************
** 函数名称 : delay()
** 函数功能 : 小延时
*************************************************************
*/
void delay(void)
{uint32 i;
for(i=0;i<1000;i++);
}
/*
******************************************************************************************
** 函数名称 : DelayNS()
** 函数功能 : 长软件延时。
** 入口参数 : dly 延时控制值,值越大延时越长
** 出口参数 : 无
******************************************************************************************
*/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/*
*************************************************************
**向端口P1口[25:18]送数据
*************************************************************
*/
void LCM_Send(uint32 dat)
{
Data_Start();
while(BUSY_1 == 0);
delay();
Data_Send(dat); //送数据到LCD
delay();
SREQ(); //送请求信号REQ
delay();
CREQ(); // 撤销请求REQ
while(BUSY_1 == 1); //应答信号BUSY为1,表明已收到数据并正在处理中;等待
delay();
}
/*
*************************************************************
**向LCD送命令和坐标位置
*************************************************************
*/
void LCM_Command(uint32 comm,uint32 addr_x,uint32 addr_y)
{
LCM_Send(comm); //送命令
LCM_Send(addr_x);//送X坐标
LCM_Send(addr_y);//送Y坐标
}
/*
*************************************************************
**复位
*************************************************************
*/
void LCM_Reset(void)
{
CRES();//RES清0
DelayNS(5);
SRES();//RES置位
}
/*
*************************************************************
**清屏
*************************************************************
*/
void LCM_ClrScr(void)
{
LCM_Send(0xf4);
}
/*
*************************************************************
**向LCD显示
*************************************************************
*/
void show(uint8 x,uint8 y,char *buf)
{
while(*buf)
{
LCM_Command(0xf9,x+4,y*8);
LCM_Send(*(buf++));
x++;
}
}
/*
*************************************************************
**显示汉字1行 分别为汉字指针,汉字个数,汉字所在行,汉字开始列
*************************************************************
*/
void disp_chn1(uint8 const *chn,uint8 num,uint8 line,uint8 row)
{
uint8 i;
for(i=3;i<num+3;i++)
{
LCM_Command(0xf0,i-4+row,line-1);
LCM_Send(chn[(i-3)*2]-0xa0);
LCM_Send(chn[(i-3)*2+1]-0xa0);
}
}
/*
*************************************************************
**显示数字,
*************************************************************
*/
void disp_eng2(uint32 x,uint8 m)
{
LCM_Command(0xf9,x,16);
LCM_Send(m);
}
/*
*************************************************************
**显示字符8*16
*************************************************************
*/
void disp_eng(uint8 const *eng)
{
uint32 i,j;
for(j=0;j<4;j++)
{
for(i=4;i<20;i++)
{
LCM_Command(0xf9,i,j*16);
LCM_Send(eng[j*16+i-4]);
}
}
}
/*
*************************************************************
**LCM_DispInit(void) 显示初始化
*************************************************************
*/
void LCM_DispInit(void)
{
uint32 i;
/*设置引脚连接*/
#if LCM_BUSY<16
PINSEL0&=~(3<<(2*LCM_BUSY));
#else
PINSEL1&=~(3<<(2*LCM_BUSY));
#endif
#if LCM_REQ<16
PINSEL0&=~(3<<(2*LCM_REQ));
#else
PINSEL1&=~(3<<(2*LCM_REQ));
#endif
#if LCM_RES<16
PINSEL0&=~(3<<(2*LCM_RES));
#else
PINSEL1&=~(3<<(2*LCM_RES));
#endif
/* //如果总线用的是P0口则此处打开
#if BUS_NO<9
for(i=BUS_NO;i<BUS_NO+8;i++)
{
PINSEL0&=~(3<<(2*i));
}
#else
for(i=BUS_NO;i<16;i++)
{
PINSEL0&=~(3<<(2*i));
}
for(;i<(BUS_NO+8);i++)
{
PINSEL1&=~(3<<(2*(i-16)));
}*/
/*本程序硬件所用P1.18`25,故用以下代码*/
PINSEL2 =PINSEL2 & (~0x08);
/*设置IO输出方式*/
IO0DIR=IO0DIR|(1<<LCM_BUSY)|(1<<LCM_REQ)|(1<<LCM_RES);
//IO0DIR=IO0DIR|(0xFF<<BUS_NO); //若总线连接此口,则打开,将下一行关闭
IO1DIR=0xff<<BUS_NO;//特殊位需注意
LCM_Reset();//复位一下
LCM_ClrScr();
LCM_ClrScr();
}
/*****************************************************************
**LCM_White() 反白显示
******************************************************************/
void LCM_White()
{
LCM_Send(0xfa);
}
//------------------------以下为绘图函数---------------------
/*****************************************************************
**GUI_Point() x表示指定列坐标,y表示指定行坐标,color 显示颜色或亮灭
**x 0~239
**y 0~127 仅针对OCMJ8X15B
******************************************************************/
void GUI_Point(uint8 x,uint8 y)
{
LCM_Command(0xf2,x,y);
}
/*****************************************************************
**GUI_HLine()
**功能:画水平线
**x0 水平线起点所在的列的位置
**y0 水平线起点所在的行的位置
**x1 水平线终点所在的列的位置
******************************************************************/
void GUI_HLine(uint8 xx,uint8 yy,uint8 x1)
{
uint8 bak;
if(xx>x1)//排序,方便画图
{
bak=x1;
x1=xx;
xx=bak;
}
do
{
GUI_Point(xx,yy);
xx++;
}while(x1>=xx);
}