⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 开发环境为:iarEWARM5.20 语言为c语言 2378的启动文件
💻 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 + -