📄 lcd_12864.c
字号:
//--------------------------------------------------------------------------*
//文件描述:本文件包含了液晶显示相关子程序,分别为: *
//(1)Lcdinit:液晶初始化子程序 *
//(2)LcdShCh:在液晶显示屏上显示字符数据 *
//(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
//(4)LcdDrawCircle:在Lcd上显示或取消空心圆型 *
//--------------------------------------------------------------------------*
//包含头文件
#include "QSPI.h"
#include "LCD_12864.h"
//这是驻留在SRAM中的显示缓冲区,其大小为ROW*COL个字节,用户可以根据LCD的类型来
//决定LcdBuffer大小
static uint8 LcdBuffer[ROW][COL];
//这个数组用于标志相应的行是否刷新。如果某行的WriteEnable=1则LCD服务程序加载
//LcdBuffer的相应行到LCD模块中。
static uint8 LcdRowWriteEnable[ROW];
//内部调用函数声明
//在Lcd指定位置上设置线型16个点的显示
void LcdDrawDot16(uint8,uint8,int16);
//在Lcd指定位置上画1个点
void LcdDrawDot(uint8,uint8);
void DelayusTimes(uint16); //延时指定时间
void LcdSendCommand(uint8); //将控制命令写入Lcd
void LcdSendData(uint8); //将数据写入Lcd
void LcdDrawClear(void); //在Lcd上清图形显示屏
//-------------------------------------------------------------------------*
//函数名: strlen() *
//功 能: 计算字符串长度 *
//参 数: str:字符串 *
//返 回: 输入的字符串长度 *
//说 明: 无 *
//-------------------------------------------------------------------------*
uint8 strlen(uint8 *str)
{
uint8 i=0;
while(*(str+i)!='\0')
{
i++;
}
return i;
}
//-------------------------------------------------------------------------*
//函数名: LCD_init *
//功 能: LCD初始化 *
//参 数: 无 *
//返 回: 无 *
//说 明: *
//-------------------------------------------------------------------------*
void LCD_init()
{
QSPI_init(para); //初始化SPI接口,使用8位数据格式,不使用中断
LcdSendCommand(0x30);//功能设定:基本指令集动作
LcdSendCommand(0x02);//位址归位:设置 AC 为 0, 且移动光标到0
LcdSendCommand(0x04);//设置光标移动方向
LcdSendCommand(0x0c);//设置不显示光标
LcdSendCommand(0x01);//清除显示
LcdSendCommand(0x80);//设置DDRAM地址到AC
DelayusTimes(1600); //延时>1.6ms
LcdSendCommand(0x06);//进入模式设定
LcdDrawClear(); //清Lcd图形显示屏,要花点时间的
}
//-------------------------------------------------------------------------*
//函数名: LCD_DisplayBuf() *
//功 能:显示缓存 *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LCD_DisplayBuf()
{
uint8 i, j;
for (i = 0; i < ROW; i ++)
{
if (LcdRowWriteEnable[i]) //允许该行刷新
{
LcdSendCommand(0x80+ ((i&0x1)<<4) + ((i>>1)<<3));//移动光标
for (j = 0; j < COL; j ++)
{
//每行16 个字符
LcdSendData(LcdBuffer[i][j]);//刷新新的数据到控制器
}
LcdRowWriteEnable[i] = 0; //显示完之后禁止这一行
}
}
}
//-------------------------------------------------------------------------*
//函数名: LcdShowStringData *
//功 能: 在液晶显示屏上显示字符串(靠左端)和数据(靠右端),总字符数不大于16 *
//参 数: row: 行号,取值0-3 *
// LcdSBuff: 待显示的字符串首地址 *
// data:待显示的数据,取值0-255 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdShowStringData(uint8 row, uint8 *LcdSBuff,uint8 data)
{
uint8 i,len,ch1,ch2,ch3,tmp;
switch (row){
case 0:
LcdSendCommand(0x80);
break;
case 1:
LcdSendCommand(0x90);
break;
case 2:
LcdSendCommand(0x88);
break;
case 3:
LcdSendCommand(0x98);
break;
default:
break;
}
tmp = data;
len = strlen(LcdSBuff);
ch1 = ' ';
ch2 = ' ' ;
ch3 = ' ' ;
if(tmp >= 100)
{
i = tmp/100;
ch1 = '0' + i;
tmp = tmp - i*100;
}
if(tmp >= 10)
{
i = tmp/10;
ch2 = '0' + i;
tmp = tmp - i*10;
}
ch3 = '0'+tmp;
for(i=0;i<len;i++)
LcdSendData(LcdSBuff[i]);
for(;i<13;i++)
LcdSendData(' ');
LcdSendData(ch1);
LcdSendData(ch2);
LcdSendData(ch3);
}
//-------------------------------------------------------------------------*
//函数名: LcdShowString *
//功 能:在液晶显示屏上显示以LcdSBuff为首地址的16个字符,左对齐 *
// 注意:1个汉字相当于2个英文字符 *
//参 数: row: 行号,取值0-3。若>4则认为4。 *
// pos: 显示的起始位置 *
// LcdSBuff: 待显示的字符串首地址 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdShowString(uint8 row, uint8 pos, uint8 *LcdSBuff)
{
uint8 i,len;
switch (row){
case 0:
LcdSendCommand(0x80+pos);
break;
case 1:
LcdSendCommand(0x90+pos);
break;
case 2:
LcdSendCommand(0x88+pos);
break;
case 3:
LcdSendCommand(0x98+pos);
break;
default:
break;
}
len = strlen(LcdSBuff);
for(i=0;i<len;i++)
{
LcdSendData(LcdSBuff[i]);
}
//余下的位置填补空格,否则显示上一行后面的字符
for(;i<16-pos*2;i++)
{
LcdSendData(' ');
}
}
/*========[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]==============*/
//-------------------------------------------------------------------------*
//函数名: LcdDrawCircle() *
//功 能:在Lcd上的指定位置显示或取消空心圆型 *
//参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
// CR为圆的半径,GrE确定图形是否有效 *
// GrCilMV为显示圆型时的正误差值 *
// 例如:半径为10,误差为4;半径为30,误差为30 *
//返 回:无 *
//-------------------------------------------------------------------------*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -