📄 lcd_12864.c
字号:
void LcdDrawCircle(uint8 Cy,uint8 Cx,uint8 CR,uint8 GrCilMV,uint8 GrE)
{
uint8 x,y; //坐标的循环控制变量
int32 mistake; //显示时的误差值
LcdSendCommand(0x36); //扩展指令,绘图开
for(y=Cy-CR;y<=Cy+CR;y++)
for(x=Cx-CR;x<=Cx+CR;x++)
{
mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
//误差在范围之内时,显示该点
if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
{
if(GrE==1) LcdDrawDot(y,x);//显示该点
//清除该点
else if(y<=31) LcdDrawDot16(y,(x/16),0);
else LcdDrawDot16(y-32,x/16+8,0);
}
}
LcdSendCommand(0x30);//基本指令
}
//-------------------------------------------------------------------------*
//函数名: LcdDrawRect *
//功 能:在Lcd上指定行上显示或消除矩型边框 *
//参 数:row:行号,取值0-3 *
// visible:1-显示矩形边框;0-消除矩型边框 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdDrawRect(uint8 row,uint8 visible)
{
uint8 Px,y; //行页号坐标,列坐标
uint8 i; //循环变量
int16 LC,RC,TBC; //左,右和上下边框色
//确定row所在行的起始坐标(左上角)
if((row==0)||(row==2))
y=0;
else
y=16;
if(row<=1)
Px=0;
else
Px=8;
//确定有无边框(有visible决定)
if(visible==1) //有表框
{
TBC=65535; //1111111111111111
LC=32768; //1000000000000000
RC=1;
}
else //无边框
{
TBC=0;
LC=0;
RC=0;
}
//LcdSendCommand(0b00110110);//扩展指令,绘图开
LcdSendCommand(0x36);//扩展指令,绘图开
//在Lcd上指定行上显示矩型边框
for(i=0;i<=7;i++,Px++)
{
LcdDrawDot16(y,Px,TBC); //显示上边框
LcdDrawDot16(y+15,Px,TBC); //显示下边框
}
for(i=1,y++,Px--;i<=14;i++,y++)
{
LcdDrawDot16(y,Px,RC); //显示右边框
LcdDrawDot16(y,Px-7,LC); //显示左边框
}
LcdSendCommand(0x30);//基本指令
}
//-------------------------------------------------------------------------*
//函数名: LcdDrawClear() *
//功 能:在Lcd上清图形显示屏(清GDRAM) *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdDrawClear(void)
{
uint8 Px,y; //行页号,列坐标的循环变量
//LcdSendCommand(0b00110110); //扩展指令,绘图开
LcdSendCommand(0x36); //扩展指令,绘图开
//清图形显示屏(清GDRAM)
for(y=0;y<=31;y++)
for(Px=0;Px<=15;Px++)
LcdDrawDot16(y,Px,0); //写入0为清屏
//LcdSendCommand(0b00110000); //基本指令
LcdSendCommand(0x30);//基本指令
}
//-------------------------------------------------------------------------*
//函数名: LcdDrawDot() *
//功 能:在Lcd的指定位置上画一个点 *
//参 数:y为纵坐标(0-63),x为横坐标(0-127) *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdDrawDot(uint8 y,uint8 x)
{
uint16 value=32768; //初始值为0b1000000000000000
if(y>=32) //第三四行必须调整x和y坐标
{y=y-32;x=x+16*8;}
value>>=(x-x/16*16); //写入的16位数据
LcdDrawDot16(y,x/16,value);//显示相应的点
}
//-------------------------------------------------------------------------*
//函数名: LcdDrawDot16 *
//功 能:在Lcd指定位置上设置线型16个点的显示 *
//参 数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据 *
//返 回:无 *
//-------------------------------------------------------------------------*
void LcdDrawDot16(uint8 y,uint8 Px,int16 value)
{//设置4位绘图行地址
LcdSendCommand(y|0x80); //设置6位绘图列地址
LcdSendCommand(Px|0x80); //设置4位绘图行地址
LcdSendData((uint8)(value>>8)); //写入高8个字节
LcdSendData((uint8)value); //写入低8个字节
}
//========================================================================*
//内部函数: *
//(1)写指令:LcdSendCommand *
//(2)写数据:LcdSendData *
//(3)延时:DelayTimes *
//========================================================================*
//-------------------------------------------------------------------------*
//函数名: LcdSendCommand *
//功 能:执行参数中的给定命令 *
//参 数:command为待执行的命令码 *
//返 回:无 *
//说 明:
//LCD串行控制命令字传送共分三个字节完成:
//第一字节:串口控制格式: 1111 1ABC
// A 为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD
// B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令
// C 固定为0
//第二字节:8 位数据的高4 位格式 DDDD0000 D:命令字
//第三字节:8 位数据的低4 位格式 0000DDDD
//-------------------------------------------------------------------------*
void LcdSendCommand(uint8 cCommand)
{
QSPI_WriteToRAM1(QSPI_TX_RAM,0xf8); //A=0 B=0
QSPI_WriteToRAM1(QSPI_TX_RAM+1,cCommand & 0xf0);//命令字高4位
QSPI_WriteToRAM1(QSPI_TX_RAM+2,cCommand << 4 ); //命令字低4位
//每写一个数据配置一次命令字,共配置三次
QSPI_WriteToRAM1(QSPI_COMMAND_RAM,QSPI_COM_CONT);
QSPI_WriteToRAM1(QSPI_COMMAND_RAM+1,QSPI_COM_CONT);
QSPI_WriteToRAM1(QSPI_COMMAND_RAM+2,QSPI_COM_CONT);
QSPI_StartTrans(3); //使用SPI发送3个字节,无效电平为0电平
DelayusTimes(72); //延时,LCD需要时间执行命令
}
//-------------------------------------------------------------------------*
//函数名: LcdSendData *
//功 能:将参数中给定的数据写入液晶控制器 *
//参 数:cCommand为待写入的数据 *
//返 回:无 *
//说 明: *
//LcdSendData与LcdSendCommand命令发送帧格式除了第一个字节不同,其他都一致的 *
//本程序中,LCD模块的LcdSendData的第一个字节为0xFA,而LcdSendCommand为0xF8 *
//-------------------------------------------------------------------------*
void LcdSendData(uint8 cCommand)
{
QSPI_WriteToRAM1(QSPI_TX_RAM,0xFA);
QSPI_WriteToRAM1(QSPI_TX_RAM+1,cCommand & 0xf0);
QSPI_WriteToRAM1(QSPI_TX_RAM+2,cCommand << 4);
QSPI_WriteToRAM1(QSPI_COMMAND_RAM,QSPI_COM_CONT);
QSPI_WriteToRAM1(QSPI_COMMAND_RAM+1,QSPI_COM_CONT);
QSPI_WriteToRAM1(QSPI_COMMAND_RAM+2,QSPI_COM_CONT);
QSPI_StartTrans(3); //发送3字节数据
DelayusTimes(72); //延时,LCD 需要时间来执行命令
}
//-------------------------------------------------------------------------*
//函数名: DelayTimes *
//功 能:延时指定的时间 *
//入 口:tn为延时时间数(0到65535) *
//出 口:无 *
//-------------------------------------------------------------------------*
void DelayusTimes(uint16 tn)
{
uint16 i,j; //循环变量
//32个指令
for(i=0;i<tn;i++)
for(j=0;j<40;j++);//0.5us~32指令
//32个指令
for(i=0;i<tn;i++)
for(j=0;j<40;j++);//0.5us~32指令
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -