您的位置 首页 传感器

LPC2134学习日志 — LCD12864学习

由于项目所需,所以这段时间,抽空学了一下LPC2134,它是基于ARM7核的微处理器,内部有128K的flash与16k的RAM,所以一般的处理程序,内部

因为项目所需,所以这段时刻,抽暇学了一下LPC2134,它是根据ARM7核的微处理器,内部有128K的flash与16k的RAM,所以一般的处理程序,内部空间就够用了,当然你要上想在上面跑跑操作体系什么的,那就另当别论了。关于这个处理器其它方面的内部材料,假如你想了解,主张你好好翻翻它的数据手册,假如你说英文太难啃,网上有大把中文的材料,当然懒猫仍是主张你看英文原版,一它是厂家的材料,比较实在牢靠一般不会有什么大错,二你还能够凑这个空档学学英语,真学好了这也是你要薪酬的筹码。

今日仅仅试验一下它的IO端口功用,怎么试验,懒猫就不再从流水灯开端了,懒猫挑选从LCD12864开端,说实在看着这么大一块屏,挺吓人的,其实LCD也没有那么可怕,处理好时序就能让它乖乖的显现,所以想写好LCD12864的驱动首要仍是要好好翻看它的数据手册,这儿懒猫就不再胪陈数据手册上的内容了。不过在这儿懒猫要先烦琐一句,想让LCD12864正确显现,一定要记住先清屏,其实也便是清它内部寄存器,否则初始化时它内部的RAM中不知道是什么杂乱无章的东东,一旦你没有清屏,很可能在显现时会呈现乱码或显现不正常,如下图所示:

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

其实懒猫在上大学时就试着用51写LCD12864的驱动程序,所以这次运用还算顺畅,记住其时初度运用LCD12864呈现这种状况,懒猫十分抑郁,认为自己的驱动程序没有写好,所以用力翻看数据手册,细心的看时序,最终还单步调试,发现问题仍是没有处理,最终懒猫看到LCD12864中RAM时,忽然想到单片机的设置变量时,初值也是随机的,所以就想着清一下RAM,成果问题还真处理了,呵呵,其时那个振奋呀,无以言表。现在想想那时真的有点傻的心爱,网上有许多现成的程序,自己却一个人死扣自己的程序。惋惜韶光如梭,转眼间懒猫结业就要两年了,那些热情焚烧的年月已逐渐远去,却永久无法抹去我夸姣的回忆……

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

图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或其它嵌入式体系,这个今后在日志中渐渐总结。

好了,今日说就先到这吧

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/263345.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部