📄 lcd_driver.c
字号:
//By LINZH_BME_SEU
//头文件
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
//宏
#define SetCS GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0,GPIO_PIN_0)
#define SetSID GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_PIN_3)
#define SetCLK GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_PIN_2)
#define ClrCS GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_0,0)
#define ClrSID GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,0)
#define ClrCLK GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,0)
//宏 指令
#define LCD_CLR 0x01 //Clear
#define LCD_HOME 0x02 //地址归位
#define LCD_MODE 0x04 //指定在资料的读取与写入时,设定游标移动方向(Inc/Dec)及指定显示的移位(Shift)
// 0 0 0 0 0 I/D S
#define LCD_ON 0x08 //显示状态开关( 0 0 0 0 1 D C B) (D整体显示;C=1游标;B=1游标位置)
#define LCD_OFF 0x08 //同上
#define LCD_CUR 0x10 //游标或显示移位控制(0 0 0 1 S/C R/L X X)
#define LCD_IF 0x20 //功能设定(0 0 1 DL X RE X X) DL必须为 1 ,RE为扩充指令集
#define LCD_CGADDR 0x40 //设定CGRAM地址到地址计数器 0 1 AC(6)
#define LCD_DDADDR 0x80 //设定DDRAM地址到地址计数器 1 AC(7)
#define LCD_SH 0x01 //LCD_MODE的设定
#define LCD_ID 0x02
#define LCD_BLINK 0x01 //LCD_ON/OFF的设定
#define LCD_CURSOR 0x02
#define LCD_DIS 0x04
#define LCD_RL 0x04 //LCD_CURSE的设定
#define LCD_SC 0x08
#define LCD_RE 0x04 //LCD_IF的设定
#define LCD_DL 0x10
#define LCD_BUSY 0x80 //Flag(Busy)
//函数
void LcdWriteWord(unsigned char *str) ; //写字符
void LcdWriteTest(unsigned char start,unsigned char ddata); //(0,指令) (1,数据)
void LcdWriteByte(unsigned char bbyte); //写一个字节
void LcdDelay(unsigned int di); //延时
void LcdInit(void); //初始化
void LcdClear(void); //清屏
void LcdPst(unsigned int xx,unsigned int yy); //设定位置(8×4)
//初始化
void LcdInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_0);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_3);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_2);
//GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_0,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
//GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
//GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
LcdDelay(10); //启动等待,等LCM讲入工作状态
LcdWriteTest(0x00,LCD_IF|LCD_DL); //8 位介面,基本指令集
LcdDelay(10);
LcdWriteTest(0x00,LCD_ON|LCD_DIS); //显示打开,光标关,反白关
LcdDelay(10);
LcdWriteTest(0x00,LCD_CLR); //清屏,将DDRAM的地址计数器归零
LcdDelay(10);
}
//发送一个字节
void LcdWriteByte(unsigned char bbyte)
{
unsigned char i;
unsigned char x;
for(i=0;i<8;i++)
{
x=bbyte&0x80;
if(x==0x80) SetSID;
if(x==0x00) ClrSID;
ClrCLK;
LcdDelay(4);
SetCLK;
LcdDelay(4);
bbyte<<=1; //左移
}
}
//发送一个字符串
void LcdWriteWord(unsigned char *str)
{
while(*str != '\0')
{
LcdWriteTest(0x01,*str);
*str++;
}
*str = 0;
}
//写指令或数据 (0,指令) (1,数据)
void LcdWriteTest(unsigned char start, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
SetCS;
if(start==0x00) start_data=0xf8; //0:写指令
else start_data=0xfa; //1:写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
LcdWriteByte(start_data); //发送起始信号
LcdWriteByte(Hdata); //发送高四位
LcdWriteByte(Ldata); //发送低四位
ClrCS;
}
//延时
void LcdDelay(unsigned int di)
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<100;db++);
}
//清屏函数
void LcdClear(void)
{
LcdWriteTest(0x00,LCD_CLR);
}
//设定位置
void LcdPst(unsigned int xx,unsigned int yy)
{
unsigned int line;
LcdWriteTest(0x00,LCD_IF|LCD_DL); //基本指令集
switch(yy)
{
case 0:line=0x00;break;
case 1:line=0x10;break;
case 2:line=0x08;break;
case 3:line=0x18;break;
}
LcdWriteTest(0x00,LCD_DDADDR+line+xx);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -