STM32学习之ILI9341控制显示屏输出(三)

您所在的位置:网站首页 如何设置屏幕显示区域 STM32学习之ILI9341控制显示屏输出(三)

STM32学习之ILI9341控制显示屏输出(三)

2024-07-16 10:32| 来源: 网络整理| 查看: 265

对于LCD显示屏的控制,简单的讲就是通过向芯片ILI9341发送指定的命令和参数,就可以直接控制。FSMC连接好外部存储器并连接好后,可以直接通过访问地址进行读写数据。使用FSMC外接存储器时,起存储单元是映射到STM32内部存储空间的,在程序中,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。如本实验中:

#define CMD_BASE ((u32)(0x6C000000 | 0x00001FFE)) #define DATA_BASE ((u32)(0x6C000000 | 0x00002000)) #define LCD_CMD (*(u16*)CMD_BASE) #define LCD_DATA (*(u16*)DATA_BASE) /*如果需要发送指令,直接像下面这样发送指令: LCD_CMD = 0xCF //用于控制芯片供电 发送数据可以像下面这样发送: LCD_DATA = 0xFF; */

本实验中会用到如下几个命令(ILI9341专用命令):

0xD3:9341读取ID的命令;

0x2A:设置X坐标;

0x2B:设置Y坐标;

0x2C:存储器写命令;

步骤:

在屏幕上写英语字母的一般步骤为:读取设备ID(确认设备)、初始化、定显示区域、设置更新屏幕方向、设置背景颜色、定鼠标位置、绘制单个像素点、根据库绘制字母。

 

1、读取设备ID:

u16 ILI9341_Read_id(void) { u16 id; LCD_CMD=0xD3; //9341读ID命令 id=LCD_DATA; id=LCD_DATA; //0x00 id=LCD_DATA; //0x93 id8; LCD_DATA=46; LCD_DATA=0; LCD_DATA=0x00; LCD_DATA=0x00; LCD_DATA=0x00; LCD_CMD=0xB6; LCD_DATA=(480+23+22-1)>>8; LCD_DATA=480+23+22-1; LCD_DATA=23>>8; LCD_DATA=23; LCD_DATA=21; LCD_DATA=0x00; LCD_DATA=0x00; LCD_CMD=0xF0; LCD_DATA=0x03; //SSD1963与MCU的接口为16bit LCD_CMD=0x29; //开启显示 LCD_CMD=0xD0; //设置自动白平衡DBC LCD_DATA=0x00; LCD_CMD=0xBE; //PWM输出 LCD_DATA=0x05; //PWM频率 LCD_DATA=0xFE; //PWM占空比 LCD_DATA=0x01; LCD_DATA=0x00; LCD_DATA=0x00; LCD_DATA=0x00; LCD_CMD=0xB8; LCD_DATA=0x03; LCD_DATA=0x01; LCD_CMD=0xBA; LCD_DATA=0X01; //控制LCD方向 Ssd1963_Set_BackLight(255);//背光设置 } Set_Display_Mode(0); //初始化为竖屏 LCD_Clear(WHITE); //清屏白色 }

定显示区域:

void LCD_Open_Window(u16 X0,u16 Y0,u16 width,u16 height) { width=X0+width-1; //算出右下角坐标 height=Y0+height-1; if(dir_flag==0&&lcd_id==0X1963) //1963竖屏处理 { X0=lcd_width-width-X0; height=Y0+height-1; LCD_CMD=setxcmd; LCD_DATA=X0>>8; LCD_DATA=X0&0XFF; LCD_DATA=(X0+width-1)>>8; LCD_DATA=(X0+width-1)&0XFF; LCD_CMD=setycmd; LCD_DATA=Y0>>8; LCD_DATA=Y0&0XFF; LCD_DATA=height>>8; LCD_DATA=height&0XFF; } else { LCD_CMD=setxcmd; LCD_DATA=X0>>8; LCD_DATA=X0&0XFF; LCD_DATA=width>>8; LCD_DATA=width&0XFF; LCD_CMD=setycmd; LCD_DATA=Y0>>8; LCD_DATA=Y0&0XFF; LCD_DATA=height>>8; LCD_DATA=height&0XFF; } }

设置更新屏幕方向:

void Set_Scan_Direction(u8 direction) { u16 skhda=0; u16 diomf=0; //9341横屏和1963竖屏时需要转化下 if( (dir_flag==1&&lcd_id==0X9341)||(dir_flag==0&&lcd_id==0X1963)) { switch(direction)//方向转换 { case 0:direction=6;break; case 1:direction=7;break; case 2:direction=4;break; case 3:direction=5;break; case 4:direction=1;break; case 5:direction=0;break; case 6:direction=3;break; case 7:direction=2;break; } } switch(direction) { case L2R_U2D: //从左到右,从上到下 skhda|=(0


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3