当前位置:网站首页>STM32——LCD液晶显示
STM32——LCD液晶显示
2022-08-05 23:28:00 【三只树懒】
LCD结构体
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
}LCD_TypeDef;
//使用NOR/SRAM的Bank1.sector4,地址位HADDR[27,26]=11A10作为数据命令区分线
//注意设置时STM32内部会右移一位对齐
#define LCD_BASE ((u32)(0x6C000000|0x0000007E))
#define LCD ((LCD_TypeDef*)LCD_BASE)LCD_BASE,须根据外部电路的连接来确定
lcddev结构体
//LCD重要参数
typedef struct
{
u16 width;//LCD宽度
u16 height;//LCD高度
u16 id;//LCD ID
u8 dir;//横屏竖屏控制,竖屏0,横屏1;
u16 wramcmd;//开始写gram指令
u16 setxcmd;//设置x坐标指令
u16 setycmd;//设置y坐标指令
}_lcd_dev;
//LCD参数
extern_lcd_dev lcddev;//管理LCD重要参数
lcddev结构体参数的赋值,基本上都是在LCD_Display_Dir函数完成。
底层接口函数:
1)写寄存器值函数:void LCD_WR_REG(vu16 regval)
2)写数据函数:void LCD_WR_DATA(vu16 data)
3)读数据函数:u16 LCD_RD_DATA(void)
4)写寄存器内容函数:void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
5)读寄存器内容函数:u16 LCD_ReadReg(u16 LCD_Reg)
6)开始写GRAM函数:void LCD_WriteRAM_Prepare(void)
7)写GRAM函数:void LCD_WriteRAM(vu16 RGB_Code)
写寄存器内容函数相当于写寄存器值函数与写数据函数的组合。
u16 POINT_COLOR=0x0000;//画笔颜色
u16 BACK_COLOR=0xFFFF;//背景颜色
_lcd_dev lcddev;
void LCD_WR_REG(vu16 ragval) //写寄存器值函数
{
regval=regval;//插入延时防止液晶白屏
LCD->LCD_REG=regval;//写入要写的寄存器序号
}
void LCD_WR_DATA(vu16 data)//写数据函数
{
data=data;
LCD->LCD_RAM=data;
}
u16 LCD_RD_DATA(void)//读数据函数
{
vu16 ram;
ram=LCD->LCD_RAM;
return ram;
}
void LCD_WriteReg(u16 LCD_Reg.u16 LCD_RegValue)//写寄存器内容函数
{
LCD->LCD_REG=LCD_Reg;//写入要写的寄存器序号
LCD->LCD_RAM=LCD_RegValue;//写入数据
}
u16 LCD_ReadReg(u16 LCD_Reg)//读寄存器内容函数
{
LCD_WR_REG(LCD_Reg);//写入要读的寄存器序号
delay_us(5);
return LCD_RD_DATA;//返回读到的值
}
void LCD_WriteRAM_Prepare(void)//开始写GRAM函数
{
LCD->LCD_REG=lcddev.wramcmd;
}
void LCD_WriteRAM(u16 RGB_Code)//写GRAM函数
{
LCD->LCD_RAM=RGB_Code;//写十六位GRAM
}
LCD初始化函数伪代码:
void LCD_Init(void)
{
初始化GPIO;
初始化FSMC;
读取LCD ID;
printf("LCD ID:%x\r\n",lcddev.id);//打印LCD ID,用到串口1,必须初始化串口1
根据不同的ID执行LCD初始化代码:
LCD_Dispaly_Dir(0);//默认为竖屏
LCD_LED=1;//点亮背光
LCD_Clear(WHITE);//清屏
}LCD坐标设置函数:
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos,u16 Ypos)
{
if(lcddev.id=0x9341||lcddev.id=ox5310)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(Xpos>>8);
LCD_WR_DATA(Xpos&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos>>8);
LCD_WR_DATA(Ypos&&0XFF);
}
else if(lcddev.id=XXXX)//不同LCD型号执行不同代码
{
.....
}
}LCD画点函数:
//画点
//x,y坐标
//POINT_COLOR:此点颜色
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y);//设置光标位置
LCD_WriteRAM_Prepare();//开始写入GRAM
LCD->LCD_RAM+POINT_COLOR;
}LCD字符显示函数:
//在指定位置显示一个字符
//x y 起始坐标
//num:要显示的字符:" "->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1) 非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;//保存输入的y的坐标
u8 csize=(size/8+((size%8)?1:0))*(size/2);//得到字体一个字符对应点阵集所占的字节数
num=num-'';//得到偏移后的值
for(t=0;t<csize;t++)
{
if(size==12) temp=asc2_1206[num][t];//调用1206字体
else if(size==16) temp=asc2_1608[num][t];//调用1608字体
else if(size==24) temp=asc2_2412[num][t];//调用2412字体
else return;
for(t1=0;t1<8;t1++)//一个字节八个位,循环八次
{
if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)LCD_FastDrawPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if(y>=lcddev.height) return;//超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width) return;//超区域了
break;
}
}
}
}边栏推荐
- 线性存储
- C#调用 kernel32.dll
- Graphical LeetCode - 623. Add a row to a binary tree (difficulty: medium)
- C#Dictionary不能添加重复键的解决方法
- Why can't the expedited fee of 5,000 yuan guarantee the delivery time?
- 以小窥大:IO 卡顿探寻苹果文件系统
- 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现
- 亿纬锂能首件搭载 46 系列大圆柱电池的系统产品成功下线
- 技术术语积累
- CodeTON Round 2 C. Virus Editorial
猜你喜欢
随机推荐
Trie tree brief
三年软件工程真题
将trivydb转转化为mysql、sqlite的小工具
图解LeetCode——623. 在二叉树中增加一行(难度:中等)
【CocosCreator 3.x】实现场景小地图效果 => 攻略
【CocosCreator 3.x】实现双人同屏效果 => 攻略
技术术语积累
pjudge#21651-[PR #4]猜猜看【交互】
超详细的PMP小白备考攻略
unzip中文解压
What are the current pain points of domestic BLDC motor control solutions?
MySQL数据库约束与表的设计
产品与渠道共振,臭宝和山姆给螺蛳粉品类带来的动力启示
Exploration and practice of Redis fixed-length queue
Nanoprobes丨Nanogold 标记条带的凝胶染色
【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
以小窥大:IO 卡顿探寻苹果文件系统
leetcode:291. 单词规律
阿里软件测试工程师教你如何理解线程同步异步
狄兰·托马斯诗合集▷Do not go gentle into that good night









