轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示

2019-12-04来源: eefocus关键字:LCD12864  AVR单片机  串行显示

LCD12864是一种常用的图形液晶显示模块,顾名思义,就是可以在水平方向显示128个点,在竖直方向显示64个点。通过对控制芯片写入数据,可以控制点的亮灭,从而显示字符、数字、汉字或者自定义的图形。尽管LCD12864有各个不同厂家生产的产品,控制芯片和引脚定义也不尽相同,但是控制原理都大同小异。本文是对我个人使用LCD12864的经验做一个总结,希望能对入门者起到抛砖引玉的作用。


就以深圳市亚晶达电子有限公司生产的YJD12864C-1为例,我不想深究显示屏的内部结构,单讲讲各个引脚的作用以及数据读写时的时序。

上图是YJD12864C-1的实物图,从右往左,1脚到20脚的定义如下:

1:VSS,接地端

2:VDD,电源正,接+5V

3:VO,对比度调整,一般接+5V就行了

4:D/I(CS*),片选,也叫使能,接+5V

5:R/W(SID*),数据输入端

6:E(SCLK*),时钟输入端

7~14:DB0 ~ DB7,并行数据总线

15:PSB,串并模式选择,串行模式下接地,并行模式下接+5V

16:NC,空引脚,不需要连接

17:RSTB,复位端,低电平有效,一般接+5V就行了

18:VEE,空引脚,不需要连接

19:BLA,背光正极,接+5V

20: BLK,背光负极,接地


在实际编程时,有串行、并行两种模式可以选择。个人觉得,并行模式占用单片机引脚多(11个),优点是速度快(一次传8位数据,速度自然快),串行模式占用引脚少(2个),速度慢点。我喜欢使用串行模式,AVR单片机的时钟频率最快可达20MHZ(不用除以12),经过实测,从头到尾刷一次屏大约只需0.1s,这在很多场合已经够用了。由于并行模式用的少,不熟悉,下面只讲串行模式。


在串行模式下,硬件的连接为:1、15、20接地,2、3、4、17、19接+5V,5接单片机SPI输出(下图第6脚),6接单片机SPI时钟信号输出(下图第8脚)。

ATMEGA324引脚图

下面介绍程序:

1、底层数据通信程序:包括SPI设置,SPI发送单字节,LCD写数据,LCD初始化

//////////////////////////////////////////////////////////////////////////////////////////

#define F_CPU 8//时钟频率8MHZ

#include

#include"delay.h"

//////////////////////////////////////////////////////////////////////////////////////////

上面是开头部分,其中delay.h内容如下:

#ifndef __IAR_DELAY_H

#define __IAR_DELAY_H

#include

#define  delay_us(x)   __delay_cycles((unsigned long)(x * F_CPU))

#define  delay_ms(x)   __delay_cycles((unsigned long)(x * F_CPU*1000UL))

#define  delay_s(x)    __delay_cycles((unsigned long)(x * F_CPU*1000000UL))

#endif

//////////////////////////////////////////////////////////////////////////////////////////

SPI设置:

void SPI_MasterInit(void)

{

  DDRB=(1<<7)|(1<<5)|(1<<4);//(1<<5)|(1<<7);//设置MOSI和SCK 为输出

SPCR = (1<<6)|(1<<4);// 1<

SPSR = 1<<0;// 1<

}

//////////////////////////////////////////////////////////////////////////////////////////

SPI发送单字节:

void SPI_MasterTransmit(char cData)

{

SPDR = cData;

while(!(SPSR & (1<<7)));//1<

}

LCD写数据:

void LCD_Write (char RS,char content)//RS=1发数据RS=0发命令

{        charStart,High4,Low4;

         Start=0xf8|(RS<<1);

         High4=content&0xf0;

         Low4=(content<<4)&0xf0;

         SPI_MasterTransmit(Start);//发送开始字节,前面5个1,倒数第二位RS

         SPI_MasterTransmit(High4);//发送数据高4位

         SPI_MasterTransmit(Low4);//发送数据低4位

    delay_us(300);

}

//////////////////////////////////////////////////////////////////////////////////////////

LCD初始化

void LCD_INIT()

{

         LCD_Write(0,0x30); /*30---基本指令动作*/

         LCD_Write(0,0x01); /*清屏,地址指针指向00H*/

         LCD_Write(0,0x06); /*光标的移动方向*/

         LCD_Write(0,0x0c); /*开显示,关游标*/

}

//////////////////////////////////////////////////////////////////////////////////////////


2、应用层程序,包括汉字显示,字符显示,图形显示等等

汉字显示:

分4行,一行可显示8个汉字,每个汉字占16*16个格

void Show_Chinese(char x0,char y0,chark,char *chn)

//x0,y0为显示位置x0: 0~3, y0: 0~7, k为汉字个数, chn为汉字数组

{

         charadr,i;

         switch(x0)

         {

                   case0: adr = 0x80 + y0;break; //在第1行y列显示

                   case1: adr = 0x90 + y0;break; //在第2行y列显示

                  case 2: adr = 0x88 + y0;break; //在第3行y列显示

                   case3: adr = 0x98 + y0;break; //在第4行y列显示

                   default:;

         }

         LCD_Write(0,adr);

         for(i=0;i<2*k;i++)

         LCD_Write(1,chn);

}

//////////////////////////////////////////////////////////////////////////////////////////

显示字符串:

分4行,一行可显示16个汉字,每个汉字占8*16个格

void Show_String(char x0,char y0,chark,char *chn)

//x0,y0为显示位置x0: 0~8, y0:0~3, k为字符串个数, chn为字符串

{

         charadr,i;

         switch(x0)

         {

                   case0: adr = 0x80 + y0;break; //在第1行y列显示

                   case1: adr = 0x90 + y0;break; //在第2行y列显示

                   case2: adr = 0x88 + y0;break; //在第3行y列显示

                   case3: adr = 0x98 + y0;break; //在第4行y列显示

                   default:;

         }

         LCD_Write(0,0x30);

         LCD_Write(0,adr);

         for(i=0;i

         LCD_Write(1,chn);

}

//////////////////////////////////////////////////////////////////////////////////////////

显示数字:

void Show_Number(char x0,char y0,charnum)//显示两位数字

//x0,y0为显示位置x0: 0~8, y0:0~3,显示数字位数可调

{

         charadr;

         switch(x0)

         {

                   case0: adr = 0x80 + y0;break; //在第1行y列显示

                   case1: adr = 0x90 + y0;break; //在第2行y列显示

                   case2: adr = 0x88 + y0;break; //在第3行y列显示

                   case3: adr = 0x98 + y0;break; //在第4行y列显示

                   default:;

         }

         LCD_Write(0,0x30);

         LCD_Write(0,adr);

         //LCD_Write(1,num/100%10+'0');

//上句不注释则显示3位数字,要显示更多位可以此类推,不过要注意num的字长

LCD_Write (1,num/10%10+'0');

    LCD_Write(1,num%10+'0');

}

//////////////////////////////////////////////////////////////////////////////////////////

显示图片:

char lcd_x,lcd_y;

void Show_Image(char *p) //水平扫描

//P含128*64/8=1024字节

//可用字模软件获得任意图片的水平扫描码

{

         chari,j,k;

         lcd_x=0x9f;

         lcd_y=0x80;

         LCD_Write(0,0x34);

         for(i=0;i<2;i++)//分为上下两屏

         {

                   for(j=0;j<32;j++)

                   {

                            LCD_Write(0,lcd_y+j);

                        LCD_Write (0,lcd_x);

                            for(k=0;k<16;k++)//写入显示数据

                        { LCD_Write (1,*p++); }

                   }

[1] [2]
关键字:LCD12864  AVR单片机  串行显示 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481962.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Arduino+Avr libc制作Badusb原理及示例讲解
下一篇:KS0108_AVR驱动[0617]

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

LCD12864中文液晶屏显示
单片机源程序如下:/* ***************************************************** */ /* ***************************************************** */// 工  程   : 51单片机开发板// 文件名   : LCD12864.c// 处理器   : STC89C52RC// 编译环境 : Keil4 C51 // 系统时钟 : 11.0592MHZ// 版    本        : V1.0 
发表于 2019-11-30
LCD12864中文液晶屏显示
LCD12864--头文件
LCD12864.h#define LCD12864_RS PORTA.0#define LCD12864_RW PORTA.1 #define LCD12864_EN PORTA.2#define LCD12864_PortOut DDRA|=0x07  //P3口的低三位设置为输出#define LCD12864_Data DDRB#define LCD12864_Read  PINB#define LCD12864_Write  PORTBvoid lcd12864_init(void);void lcd12864_cleardd(void);void
发表于 2019-11-29
LCD12864万年历单片机程序+实物制作+Proteus仿真
制作出来的LCD12864万年历实物图如下: LCD12864万年历仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 电路原理图如下:单片机源程序如下:*-----------------------------------------------  名称:12864字库液晶显示  内容:通过显示字符、数字、汉字和图片测试液晶基本功能------------------------------------------------*/#include <reg52.h>#include <intrins.h>#include "
发表于 2019-11-29
LCD12864万年历单片机程序+实物制作+Proteus仿真
51单片机做的智能时钟具有闹钟功能(DS1302+DS18B20+LCD1602)
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。单片机源程序如下:#include<reg52.h>#include<key.h>#include<LCD1602.h>#include<DS1302.h>#include<music.h>#include<
发表于 2019-11-29
51单片机控制LCD12864显示汉字
程序:#include <reg52.h>#define DATA_PORT P0sbit LCD12864_EN   = P1^2;sbit LCD12864_RSET = P1^3;sbit LCD12864_RS   = P1^0;sbit LCD12864_RW   = P1^1;sbit LCD12864_PSB  = P1^6;void delay(unsigned int xms)  //延时//{        unsigned char i,j
发表于 2019-11-26
51单片机控制LCD12864显示汉字
TX2440裸机程序-LCD
一、LCD简介LCD-liquid crystal  display 的简称,液晶显示器按驱动方式分为1.静态驱动、2.简单矩阵驱动及3.主动矩阵驱动。其中,简单矩阵又可分为1.扭转向列型(TN)和超转向列型(STN)两种,而主动矩阵驱动则以TFT为主。TN与STN都采用场电压驱动方式,如果显示尺寸加大,中心部分对电机变化的反应时间就会变长,显示器的速度跟不上。为解决这个问题,主动矩阵驱动TFT被提出,他通过晶体管显示信号开启过关闭液晶分子的电压,从而避免了显示器对电场效应的依靠。1.1LCD常见参数:像素 :LCD屏上所能控制最小单位分辨率:LCD屏像素总数,一般采用“横向像素点x纵向像素点”,如320*240或640
发表于 2019-11-23
TX2440裸机程序-LCD
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved