LCD12864串行驱动程序
本文参考了博主@Z小旋的博文,代码在博主的代码之上修改
在放函数之前,先讲一下接线,一定要注意PSB不能忘记接
端口 | 解释 |
---|---|
VSS | GND |
VDD | VCC(5V or 3.3V) |
CS | 接VCC,持续高电平,一直选通 |
SID | RW |
SCLK | E |
PSB | 接GND 表示串行驱动模式 |
BLA | VCC(5V or 3.3V) |
BLK | 接GND |
main函数
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include "lcd12864.H"void main(void)
{WDTCCR = 0x00; CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHzCLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz P0M0 = P0M0&0x0F|0x08; //P00设置为推挽输出P0M0 = P0M0&0xF0|0x80; //P01设置为推挽输出P0M1 = P0M1&0x0F|0x08; //P02设置为推挽输出Lcd_Init();LCD_Clear();while (1){LCD_Display_Words(0, 0, "秦时明月汉时关,");LCD_Display_Words(1, 0, "万里长征人未还。");LCD_Display_Words(2, 0, "但使龙城飞将在,");LCD_Display_Words(3, 0, "不教胡马度阴山。");}
}
lcd12864.c
#include "lcd12864.H"/* 字符显示RAM地址 4行8列 */
uint8_t LCD_addr[4][8]={{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87}, //第一行{0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97}, //第二行{0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F}, //第三行{0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F} //第四行
};void delay_2us(unsigned long fui_i)
{while(fui_i--);
}
void delay_ms(uint8_t time)
{while(time--)delay_2us(500);
}
/*** @name SendByte[发送一个字节的数据]*/
void SendByte(uint8_t Dbyte)
{uint8_t i; for(i = 0;i < 8;i++){ SID = (Dbyte << i) & 0x80; // 取最高位SCLK = 0; // 时钟线置低 允许SID变化delay_2us(3); // 延时使数据写入SCLK = 1; // 释放时钟线,让LCD读取}
}/*** @name Lcd_WriteCmd[写命令]*/
void Lcd_WriteCmd(uint8_t Cmd )
{delay_ms(1); // 延时等待,防止忙线SendByte(WRITE_CMD); SendByte(0xf0&Cmd); //发送高4位SendByte(Cmd<<4); //发送低4位
}/*** @name Lcd_WriteData[写数据]*/
void Lcd_WriteData(uint8_t Dat )
{delay_ms(1); SendByte(WRITE_DAT); //11111,RW(0),RS(1),0SendByte(0xf0&Dat); //发送高4位SendByte(Dat<<4); //发送低4位
}
/** * @name Lcd_Init[LCD初始化]*/
void Lcd_Init(void)
{ delay_ms(50); //等待液晶自检(延时>40ms)Lcd_WriteCmd(0x30); //功能设定:选择基本指令集delay_ms(1); //延时>100usLcd_WriteCmd(0x30); //功能设定:选择8bit数据流delay_ms(1); //延时>37usLcd_WriteCmd(0x0c); //开显示delay_ms(1); //延时>100usLcd_WriteCmd(0x01); //清除显示,并且设定地址指针为00Hdelay_ms(30); //延时>10msLcd_WriteCmd(0x06); //进入设定点,初始化完成
}/** * @name LCD_Display_Words[显示字符]*/
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str)
{ Lcd_WriteCmd(LCD_addr[x][y]); //写初始光标位置while(*str>0){ Lcd_WriteData(*str); //写数据str++; }
}/** * @name LCD_Display_Picture[显示图片] */
void LCD_Display_Picture(uint8_t *img)
{uint16_t line,row;Lcd_WriteCmd(0x34); //切换到扩充指令Lcd_WriteCmd(0x34); //关闭图形显示for(line = 0; line < 32; line++){Lcd_WriteCmd(0x80+line);Lcd_WriteCmd(0x80);for (row = 0; row < 16; row++){Lcd_WriteData(*img ++);}}for(line = 0; line < 32; line++){Lcd_WriteCmd(0x80+line);Lcd_WriteCmd(0x88);for (row = 0; row < 16; row++){Lcd_WriteData(*img ++);}}Lcd_WriteCmd(0x36); //打开图形显示 Lcd_WriteCmd(0x30); //切换回基本指令
}
/** * @name LCD_Clear[清屏]*/
void LCD_Clear(void){Lcd_WriteCmd(0x01); //清屏指令delay_ms(2); //延时以待液晶稳定【至少1.6ms】}
lcd12864.h
#ifndef __lcd12864_H_
#define __lcd12864_H_
#include "HC89S003F4.h"#define WRITE_CMD 0xF8 // 写命令
#define WRITE_DAT 0xFA // 写数据#define SID P0_1 //RW
#define SCLK P0_2 //E#define uint8_t unsigned char
#define uint16_t unsigned intvoid delay_2us(unsigned long fui_i);
void delay_ms(uint8_t time);
void SendByte(uint8_t Dbyte);
void Lcd_WriteCmd(uint8_t Cmd );
void SendByte(uint8_t Dbyte);
void Lcd_WriteData(uint8_t Dat );
void Lcd_Init(void);
void LCD_Display_Words(uint8_t x,uint8_t y,uint8_t*str);
void LCD_Display_Picture(uint8_t *img);
void LCD_Clear(void);#endif
文末提到一点,很多人在做LCD显示的时候,带字库的LCD也会显示汉字乱码,这是因为你用Keil编写的时候把代码的编码格式给改了,使用UltraEdit或者Notepad++把带你要显示的汉字的文件编码格式转为ASCII或者ANSI格式,之后写汉字的时候把Keil的编码格式改为GB2312就可以了
LCD12864串行驱动程序相关推荐
- ChibiOS系列:五、将STM32 USART与ChibiOS串行驱动程序配合使用
本文翻译自:http://www.playembedded.org/blog/stm32-usart-chibios-serial/ 将STM32 USART与ChibiOS串行驱动程序配合使用 发表 ...
- [转载]轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示
原文链接: http://bbs.elecfans.com/forum.php?mod=viewthread&tid=282698&extra=&highlight=12864 ...
- 硬件之路-串行LCD12864之MSP430简单实现
为什么80%的码农都做不了架构师?>>> 串行LCD12864引脚接法: 实现代码(MSP430): /** 12864.c* Created on: 2014-7-15* Auth ...
- AT24C02驱动程序,【I2C串行总线】的组成及工作原理
AT24C02驱动程序 此程序运用到模块化编程,涉及到一下几个函数: 延时函数 起始信号函数 中止信号函数 发送字节函数 接收字节函数 写入数据函数 读取字节函数 通过对以上几类函数的应用实现对数据的 ...
- Arduino UNO通过SPI串行方式驱动LCD12864液晶屏
LCD12864液晶屏简介 LCD12864带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字.英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低.显示内容丰富等特点而应用广 ...
- 液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动
液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动 一.LCD12864 / LCD12232 1.LCD12864 2.LCD12232 3.接线图 二.ST7920 1.接口时 ...
- STM32驱动LCD12864(串行模式)
效果呈现 引脚定义:(VCC接入先询问厂家供电) PIN1--GND PIN2--5V PIN3--不接 PIN4--RS(CS) PIN5--R/W(SID) PIN6--E(SCK) PIN7-- ...
- 串行LCM12864驱动程序
/****************************************************************************/ /* //程序说明 名字:lcm1286 ...
- 高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术
文章目录 前言 物理信号 预加重 差分传输线 参考资料 前言 对于数字工程师来说,我们可能关注的仅仅是本文中的差分信号电平标准以及预加重技术,CML电平标准是Transceiver技术的首选,在Xil ...
最新文章
- 【Oracle RAC+DG实验】Oracle RAC+ASM+DataGuard配置实验记录+常见问题
- LightGBM用法速查表
- 图像处理(二十一)基于数据驱动的人脸卡通动画生成-Siggraph Asia 2014
- CSSbackground的详细使用
- HP6531s安装windows2003无法调节亮度的解决方法
- 一个有趣的关于flash和多种设备交互等技术应用的演示网站
- Wpf 调用线程无法访问此对象,因为另一个线程拥有该对象,解决方案
- jQuery学习笔记(四)
- 合肥师范学院计算机与技术,合肥师范学院计算机科学与技术系JAVA复习提纲
- 初学者的回归测试,都该注意哪几点?
- (笔记)电路设计(六)之稳压二极管的应用
- 网络安全:系统进程的基本概述
- 啃老 万岁_Windows 7已死,您的杀毒软件万岁
- 阿里云搭建MQTT服务器
- 成功需要培养独特的眼光,芸赞通天下沈杨
- js实现图片左右移动轮播
- QImage 图像格式小结 Format_RGB32
- 分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!
- java 类一定要声明成public_关于使用public class 和 class声明类的区别
- 爱搞事情:我的黑苹果日记之安装路
热门文章
- 【JS】日期Date如何格式化为年月日yyyy-MM-dd hh:mm:ss
- ARM体系结构与编程(更)
- 特征融合的作用与手段
- python %d, %f, %s占位符的使用(学习笔记)
- MD5加密为什么不可逆?
- OpenGL中glRotatef()函数究竟对矩阵做了什么
- 【小白学习记录】渗透测试之信息收集
- 港科夜闻|香港科大校长史维教授获颁法国荣誉军团军官勋章(Officier de la Légion d'Honneur)...
- 区块链应用 | 一篇文章让你搞懂区块链,非标通证应用将首先落地
- socket PHP:详细简单的socket TCP通信PHP实现