LPC2134学习日志 -- LCD12864学习

发布者:jingyan最新更新时间:2016-04-05 来源: eefocus关键字:LPC2134  LCD12864 手机看文章 扫描二维码
随时随地手机看文章
       由于项目所需,所以这段时间,抽空学了一下LPC2134,它是基于ARM7核的微处理器,内部有128K的flash与16k的RAM,所以一般的处理程序,内部空间就够用了,当然你要上想在上面跑跑操作系统什么的,那就另当别论了。关于这个处理器其它方面的内部资料,如果你想了解,建议你好好翻翻它的数据手册,如果你说英文太难啃,网上有大把中文的资料,当然懒猫还是建议你看英文原版,一它是厂家的资料,比较真实可靠一般不会有什么大错,二你还可以凑这个空档学学英语,真学好了这也是你要工资的筹码。

         今天只是实验一下它的IO端口功能,如何实验,懒猫就不再从流水灯开始了,懒猫选择从LCD12864开始,说实在看着这么大一块屏,挺吓人的,其实LCD也没有那么可怕,处理好时序就能让它乖乖的显示,所以想写好LCD12864的驱动首先还是要好好翻看它的数据手册,这里懒猫就不再详述数据手册上的内容了。不过在这里懒猫要先啰嗦一句,想让LCD12864正确显示,一定要记住先清屏,其实也就是清它内部寄存器,否则初始化时它内部的RAM中不知道是什么乱七八糟的东东,一旦你没有清屏,很可能在显示时会出现乱码或显示不正常,如下图所示:


 12845c51-0d96-46c0-abba-0892458a798d.jpg


 


图1-1 初始化时没有加清屏函数


        其实懒猫在上大学时就试着用51写LCD12864的驱动程序,所以这次使用还算顺利,记得当时初次使用LCD12864出现这种情况,懒猫非常郁闷,以为自己的驱动程序没有写好,于是使劲翻看数据手册,仔细的看时序,最后还单步调试,发现问题还是没有解决,最后懒猫看到LCD12864中RAM时,突然想到单片机的设置变量时,初值也是随机的,于是就想着清一下RAM,结果问题还真解决了,呵呵,当时那个兴奋呀,无以言表。现在想想那时真的有点傻的可爱,网上有好多现成的程序,自己却一个人死扣自己的程序。可惜时光如梭,转眼间懒猫毕业就要两年了,那些激情燃烧的岁月已渐渐远去,却永远无法抹去我美好的记忆……


        好了,不费话,说一说这次测试的电路,外围电路很简单,没有接什么东东,就接了一块LCD12864,2134的晶振是12MHz的,实时时钟频率是32.768KHz,下面给出仿真电路图,上面省略了很多东东,这次仿真用的是proteus7.5的版本,仿真不能代替实物,懒猫的程序都是通过实物测试通过的,仿真只是为了调试之用,如果你真想学到真本领,做项目是最好的途径。


b4ec4165-b005-4873-af4b-91844cd95a1a.JPG


 


图2 电路仿真图


        注意,这是仿真电路图,实际设计中要加上电源,晶振,电位器等部件,这个电路图只说明一下LCD与LPC2134的数据接口。


        说一下程序,程序包括main.c与display.c两个C源程序代码,只是简单的测试一下lpc2134与LCD12864为后面的实验做一个铺垫,以后的实验可能会用到这个驱动,由于程序东东比较多,所以就只贴出display.c这个源程序,其它的程序在附件中,如果有兴趣可以下载下来查看:


 


//文件名称:display.c


//功    能:LCD12864驱动函数


//作    者:懒猫爱飞


//备    注:MCU      -- LPC2134


//          Crystal  -- 12MHz


//          RTC      -- 32.768KHz  


//          开发环境 -- RealView MDK-ARM Verxion 4.12


 


#define IN_DISPLAY


 


#include "config.h"


#include "display.h"


 


//LCD12864引脚配置


#define LCD_CS1 4    


#define LCD_CS2 3    


#define LCD_RST 5    


#define LCD_DI  21   


#define LCD_RW  11   


#define LCD_EN  10   


 


//LCD12864操作宏定义


#define LCD_DE() IO0SET |= 1<  


#define LCD_IE() IO0CLR |= 1<  


#define LCD_RE() IO0SET |= 1<  


#define LCD_WE() IO0CLR |= 1<  


#define LCD_EH() IO0SET |= 1<  


#define LCD_EL() IO0CLR |= 1<  


 


 


//LCD12864命令宏定义


#define LCDSTARROW 0xC0   


#define LCDPAGE    0xB8   


#define LCDLINE    0x40   


 


 


void delay_us(uint32 us)


{


    while(us--);     


}


 


 


void Out_Data(uint8 Odata)


{


    IO1CLR |= (uint32)(0xFF<<16);  // 将输出端口置0


    IO1SET |= (uint32)(Odata<<16); // 输出要输出的数据Odata


}


 


 


void Write_Data(uint8 Wdata)


{


    LCD_DE();        // 写数据使能


    delay_us(1);     // 延时等待端口电平稳定   


    LCD_WE();        // 写命令使能


    delay_us(1);     // 延时等待数据写进端口寄存器


    Out_Data(Wdata); // 输出要写入LCD12864的数据


    delay_us(1);     // 延时等待端口电平稳定


    LCD_EH();        // 数据在EN下降沿写入LCD12864中


    delay_us(3);     // 延时


    LCD_EL();        // EN下降沿


    delay_us(3);     // 延时一下


}


 


 


void Write_Cmd(uint8 Wcmd)


{


    LCD_IE();        // 写命令使能


    delay_us(1);


    LCD_WE();        // 写命令使能


    delay_us(1);  


    Out_Data(Wcmd);  // 写入命令


    delay_us(1);


    LCD_EH();        // 数据在EN下降沿写入LCD12864中


    delay_us(3);    


    LCD_EL();        // EN下降沿


    delay_us(3);                                     


}


 


 


void Init_LCDIO(void)


{


    IO0DIR |=  (1<                  // 初始端口方向


              |(1<

                                  |(1<

                                  |(1<

                                  |(1<

                                  |(1<

    IO0SET |= (1<

    IO0CLR |= 1<               // 初始化时EN脚置低


    IO0CLR |= 1<               // 初始化时先复位一下


    delay_us(50);


    IO0SET |= 1<               // 再重新启动LCD12864


    delay_us(50);


    IO0SET |= (1<

    Write_Cmd(0x3F);                     //开显示, 关显示为 -- 0x3e


    Write_Cmd(0x38);                                        // 8位形式,两行字符


    Write_Cmd(0x0F);                     // 开显示


    Write_Cmd(0x01);                     // 清屏


    Write_Cmd(0x06);                     // 画面不动,光标右移


    Write_Cmd(0xC0);                     // 设置起始行


}


 


 


void Show_Row(uint8 ucPage,uint8 ucLine,uint8 ucWidth,uint8 const *ucaRow)


{


    uint8 ucCount = 0;


    if(ucLine<64)


    {


        IO0SET |= 1<                  // 选通左屏


                  IO0CLR |= 1<

                  Write_Cmd(LCDPAGE+ucPage);     // 设定页号


                  Write_Cmd(LCDLINE+ucLine);     // 设定列号


                  Write_Cmd(0x34);


                  if(ucLine+ucWidth<64)          // 位于左半屏


                  {


                                for(ucCount = 0;ucCount


                                {


                                              Write_Data(*(ucaRow+ucCount));   // 写入数据


                                          


                  }


                  else                                    // 跨越两个半屏 先写完左半屏


                  {


                                for(ucCount=0;ucCount<64-ucLine;ucCount++)


                                {


                                               Write_Data(*(ucaRow+ucCount));              // 写入数据


                                }


 


                                IO0CLR |= 1<                                       // 再写右半屏


            IO0SET |= 1<

                      Write_Cmd(LCDPAGE+ucPage);          // 设定页号


                      Write_Cmd(LCDLINE);                 // 设定列号


                                Write_Cmd(0x34); 


                                for(ucCount=64-ucLine;ucCount


                                {


                                                Write_Data(*(ucaRow+ucCount));// 写入数据


                                                                                                                              


                  }


    }


    else                                    // 位于右半屏


    {


                  IO0CLR |= 1<                                     


        IO0SET |= 1<

                  Write_Cmd(LCDPAGE+ucPage);          // 设定页号


                  Write_Cmd(LCDLINE+ucLine-64);       // 设定列号


                  Write_Cmd(0x34);


                  for(ucCount=0;ucCount


                  {


                                Write_Data(*(ucaRow+ucCount));  // 写入数据           


                  }


    }


}


 


 


void Show_Word(uint8 ucPage,uint8 ucLine,uint8 const *ucaChinMap)


{


    Show_Row(ucPage,ucLine,16,ucaChinMap);                                      // 汉字上半部分


    Show_Row(ucPage+1,ucLine,16,ucaChinMap+16);                          // 汉字下半部分


}


 


 


void Display_HZ(uint8 pagenum,uint8 colnum,uint8 num)


{


  //uint8 k;


  uint8 const *p1;


  //k=colnum*16;


  p1=hz_mode[num];


  Show_Word(pagenum,colnum,p1);


}


 


void Show_Char(unsigned char ucPage,unsigned char ucLine,unsigned char const *ucaCharMap)


{


    Show_Row(ucPage,ucLine,8,ucaCharMap);


    Show_Row(ucPage+1,ucLine,8,ucaCharMap+8);


}


 


void Clear_Screen()


{


   uint8 i,j;


   for(i=0;i<8;i+=2)   //共8页


   {


      for(j=0;j<128;j+=8)     //共128列


      {


        Show_Char(i,j,CHAR_B);


      }


   }


}


 


void Init_LCD(void)


{


    Init_LCDIO();    // 初始化LCD接口


    Clear_Screen();  // 要先清屏,不然会显示不正常


 


   


    Display_HZ(2,0,10);     // 懒


    Display_HZ(2,16,11);    // 猫


    Display_HZ(2,32,12);    // 爱


    Display_HZ(2,48,13);    // 飞


 


    Display_HZ(3,64,14);    // 学


    Display_HZ(3,80,15);    // 习


    Display_HZ(3,96,16);    // 日


    Display_HZ(3,112,17);   // 志


}


        当然这个程序还不完善,还没显示图片的函数,还没有菜单等功能,不过这些以后会慢慢加上的,现在只是在LPC2134中裸奔,主要是为了了解一下它内部结构与内部资源,以后的日志中会涉及到ucos或其它嵌入式系统,这个以后在日志中慢慢总结。


好了,今天说就先到这吧


631b4a24-3204-4c02-b1c9-69fd54da7d3d.jpg

关键字:LPC2134  LCD12864 引用地址:LPC2134学习日志 -- LCD12864学习

上一篇:LPC2134学习日志(二)-- LCD12864时钟
下一篇:STM32是否可以跑linux

推荐阅读最新更新时间:2024-03-16 14:49

基于51单片机的银行排队呼叫系统设计
一.硬件方案 本系统是以排队抽号顺序为核心,客户利用客户端抽号,工作人员利用叫号端叫号;通过显示器及时显示当前所叫号数,客户及时了解排队信息,通过合理的程序结构来执行排队抽号。 主要由51单片机+最小系统+LCD12864液晶显示屏+WT588语音模块+按键输入;如图: 二.设计功能 (1)LCD12864液晶显示当前窗口01、02 排队人数 取号号码。 (2)第一个按键到1号窗口,第二个按键到二号窗口。 (3)第三个按键进行取号。 (4)语音播报当前取号号码到几号窗口。 三.设计原理图 (1)原理图主要采用AD软件进行设计,如图: (2)PCB图如下: 四.软件设计 主程序源码 /************
[单片机]
基于51单片机的银行排队呼叫系统设计
LCD12864中文液晶屏显示
单片机源程序如下: /* ***************************************************** */ /* ***************************************************** */ // 工 程 : 51单片机开发板 // 文件名 : LCD12864.c // 处理器 : STC89C52RC // 编译环境 : Keil4 C51 // 系统时钟 : 11.0592MHZ // 版 本 : V1.0 // 生成日期 : 2017-09-20 // 修改日期
[单片机]
<font color='red'>LCD12864</font>中文液晶屏显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved