📄 main.c
字号:
/* 一点一点的移植过来 */
/*原创:网上 金鹏资料 */
/*******************************************************************************
修改:高维
修改日期:2008年8月26日晚
移植芯片;nxp lpc2378 显示芯片:ocmj12232c-1
其它设置:
显示芯片采用8位并口的方式驱动
soc采用内置rc 4M频率 1%误差
引脚连接:
p2_0-p2_7 接 DB0-DB7
p0_9 接 e 6
p0-7 接 r/w 5
p0_8 接 rs 4
悬空 v0 3
+5v vdd 2
gnd vss 1
*******************************************************************************/
/* 头文件 */
#include<nxp/iolpc2378.h>
/*基本定义*/
#define uint unsigned int
#define uchar unsigned char
#define x 0x80
#define y 0x80
#define comm 0
#define dat 1
//sbit rs = P3^0; //H=data; L=command;
//sbit rw = P3^1; //H=read; L=write;
//sbit e = P3^2; //input enable;
//sbit busy=P1^7; //lcd busy bit
//#define busy IO2PIN
/* 下面是RS就是P0_8 */
/*h is data l is instruction code*/
#define RSH FIO0SET_bit.P0_8=1
#define RSL FIO0CLR_bit.P0_8=1
/* 下面是rw 就是0_7 */
/*h is read l is write*/
#define RWH FIO0SET_bit.P0_7=1
#define RWL FIO0CLR_bit.P0_7=1
/* 下面是E 就是p0_9 */
/* enable h is enable */
#define EH FIO0SET_bit.P0_9=1
#define EL FIO0CLR_bit.P0_9=1
/*函数声明*/
void wr_lcd (uchar dat_comm,uchar content);
void chk_busy (void);
void delay (uint us);
/*code*/
uchar tab1[]={
"高维通威山西国"
"永远的黄皮肤牛"
};
uchar tab3[]={
"通威电子有限公司"
"TongWeiPalm TECH"
};
/*-- 调入了一幅图像:F:\梁\画图\HOCO12832.bmp --*/
/*-- 宽度x高度=128x32 --*/
uchar tab5[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,
0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,
0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,
0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,
0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,
0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,
0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,
0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,
0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,
0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,
0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,
0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,
0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,
0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,
0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,
0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,
0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,
0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,
0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,
0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,
0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,
0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,
0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,
0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,
0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*------------------初始化-----------------*/
/*
高维 080826新增加
2378初始化,初始化端口sel和输入输出
*/
void lpc2378init(void)
{
SCS |= 0x00000001; //设置PORT0为Fast GPIO
PINSEL10 = 0X00000000;//关闭emc接口
PINSEL0 = 0X00000000;
PINSEL1 = 0X00000000;
PINSEL2 = 0X00000000;
PINSEL3 = 0X00000000;
PINSEL4 = 0X00000000;
PINSEL5 = 0X00000000;//设置所有为GPIO口
FIO2DIR = 0x000000ff;//设置低8位为输出
FIO0DIR = 0x000003c0;//设置0口相关脚输出
}
/*
高维080826修改 lcd初始化,
现在有个问题是,下面各个命令是不是该留空闲时间等待7.2us*/
void init_lcd (void)
{
lpc2378init();//soc端口初始化
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
/*---------------显示汉字或字符----------------*/
/*高维 08.27注释 */
void chn_disp (uchar *chn)
{
uchar i,j;
wr_lcd (comm,0x30);/*30---基本指令动作*/
//delay 1ms 目的是凑够1200 u000ns 1.2ms
wr_lcd (comm,0x80);//设定ddram的地址 为000,0000,就是归零的意思,更确切的说,是第一行第一个字的位置
//必须delay 1.2us (1/1000ms = 1us= 1000 ns)
j=0;
for (i=0;i<16;i++)
{
wr_lcd (dat,chn[j*16+i]);//
//delay1ms 必须的!
}
wr_lcd (comm,0x90);//第二行 第一个字的位置
j=1;
for (i=0;i<16;i++)
{
wr_lcd (dat,chn[j*16+i]);
//延时 1.2us
}
}
/*----------------显示图形-----------------*/
void img_disp (uchar *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,x+i);
wr_lcd (comm,0x30); /*30---基本指令动作*/
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 i,j;
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
wr_lcd (comm,0x34);
wr_lcd (comm,y+j*2);
wr_lcd (comm,x+i);
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);
}
}
wr_lcd (comm,0x36);
}
/*-----------------------------------------------*/
//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.
void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)
{
uchar i,j;
for(j=0;j<yl;j++)
{
for(i=0;i<xl;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);
}
/*--------------清DDRAM------------------*/
/*高维 8.27 注释 */
void clrram (void)
{
wr_lcd (comm,0x30);
//必须加1.2us的延时
wr_lcd (comm,0x01);
//延时1.2us后
}
/*---------------------------------------*/
/*高维 080826修改
这里值得注意的是,是不是再考虑下时序理的时间
再有,FIOSET 那步骤前 有一步是清零02口,是不是对操作有影响??
*/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();//已经添加注释,最快的一条指令是72us>>1200ns(1.2us)所以有了他可以不要delay
if(dat_comm)//如果是dat_comm ==1 说明是数据模式
{
//rs=1; //data
RSH;
//rw=0; //write
RWL;
}
else
{
//rs=0; //command
RSL;
//rw=0; //write
RWL;
}
//这块必须delay 10ns,算下晶振吧,看几个nop可以解决
//P1=content; //output data or comm
FIO2CLR = 0xff;//这步是不是有影响,应该没有
FIO2SET = content;//写入数据内容
//e=1;
EH;
//最少delay 140ns 就是0.14us
//e=0;
asm("NOP");
EL;//在e的下降沿 数据进入了7920
//同样 本操作必须要 在结束的时候 延时1us 保险1.2us
}
/*高维 0826修改 0827添加注释 */
/*现在的问题是,在这个函数内部有改变输入输出方向的命令 需要对照时序别时间 超标
对照工作没有进行 同时 是不是该加延时 */
void chk_busy (void)
{
//P1=0xff;
FIO2SET = 0xff;//各个口输出高 ,为读入数据做准备,实际上,这步骤是可是不要的 因为在资料上已经说了 不管输入输出什么样,都可以读出来
FIO2DIR_bit.P2_7 = 0;//控制第7位是 输入,为读入数据准备
//rs=0;
RSL;//instruction code
//rw=1;
RWH;//读状态,从时序图来看,rs r/w之间是不需要有延时的
//e =1;
//该延时10ns。!!!必须的!!!
EH;//本 语句 和上面的语句 至少要有10ns的间隔,现在不进行延时,会不会出问题!
//这块该空一下
//nop 2下就可以了,
while(FIO2PIN&0x80 == 1);//就是判断p2口的 P2_7的值 就是DB7的值
//e =0;
FIO2DIR_bit.P2_7 = 1;//把这个端口的重新调成输出状态
//delay 40ns目的是为了 凑够e脉冲宽度的140ns
EL;//本语句和上面的 e=1 语句执行时,必须有140ns 的延时,而读的过程要
//还应该注意的是,在下次e太高之前必须满足,
//再有1000ns就是1ms最好是1.2us的延时,否则这个过程不结束
}
/*---------------------------------------*/
void delay (uint us) //delay time
{
while(us--);
}
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<15;j++)
delay(1);
}
/*------------------主程序--------------------*/
void main ()
{
init_lcd ();
while (1)
{
lat_disp (0x00,0x00);
chn_disp (tab1);
con_disp (0xff,0xff,0x84,0x90,2,16);
delay1 (8000);
clrram();
lat_disp (0xcc,0xcc);
delay1 (8000);
wr_lcd (comm,0x34);
chn_disp (tab3);
delay1 (8000);
clrram();
lat_disp (0xff,0x00);
delay1 (8000);
img_disp (tab5);
delay1 (8000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -