【HC32F4A0开发板测评】+LCD屏显示驱动及使用
[复制链接]
本帖最后由 jinglixixi 于 2023-3-18 22:29 编辑
前面曾完成过对单色OLED屏的显示驱动,为了满足色彩显示的需要,这次再对一款0.96寸的彩色LCD屏进行一下驱动尝试。
LCD屏与开发板的连接关系为:
CLK---PE11
DIN ---PE12
RES ---PE13
DC ---PE14
CS ---PE15
对应引脚输出高低电平的定义为:
#define OLED_SCLK_Set() GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_11) //CLK
#define OLED_SCLK_Clr() GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_11)
#define OLED_SDIN_Set() GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_12) //DIN
#define OLED_SDIN_Clr() GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_12)
#define OLED_RST_Set() GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_13) //RES
#define OLED_RST_Clr() GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_13)
#define OLED_DC_Set() GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_14) //DC
#define OLED_DC_Clr() GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_14)
#define OLED_CS_Set() GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_15) //CS
#define OLED_CS_Clr() GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_15)
所用引脚的功能配置函数为:
static void LED_Init(void)
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_11, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_12, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_13, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_14, &stcGpioInit);
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_15, &stcGpioInit);
}
为进行驱动测试所用的色彩清屏函数为:
void LCD_color(u16 Color)
{
u16 i,j;
LCD_Address_Set(110,30,129,49);
for(i=0;i<20;i++)
{
for (j=0;j<20;j++)
{
LCD_WR_DATA(Color);
}
}
}
经测试,可实现基本的显示驱动,为此又添加了图形显示函数,其内容如下:
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2)
{
int i;
LCD_Address_Set(x1,y1,x2,y2);
for(i=0;i<12800;i++)
{
LCD_WR_DATA8(gImage_RW[i*2]);
LCD_WR_DATA8(gImage_RW[i*2+1]);
}
}
相应的测试主程序为:
int32_t main(void)
{
LL_PERIPH_WE(LL_PERIPH_GPIO);
LED_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
Lcd_Init();
LCD_Clear(BLACK);
LCD_ShowPicture(0,0,159,79);
Delay_us(2000000);
LCD_Clear(BLACK);
LCD_ShowString(20,10,"HC2F4A0 ",RED);
LCD_ShowString(20,30,"R: G: B:",YELLOW);
LCD_color(RED);
LCD_box(109,29,130,50);
while(1);
}
所实现的显示效果如图1和图2所示。
图1 图像显示效果
图2 检测界面效果
在图2的基础上,打算再添加一项色彩检测与标识功能,所用的色彩传感器为TCS34725。
该色彩传感器以I2C的方式进行工作,它与开发板的连接关系为:
CLK---PE4
DIN ---PE5
相关引脚输出高低电平及读取引脚状态的语句定义为:
#define TCS_SCL_H GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_04) //CLK
#define TCS_SCL_L GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_04)
#define TCS_SDA_H GPIO_SetPins(GPIO_PORT_E, GPIO_PIN_05) //DIN
#define TCS_SDA_L GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_05)
#define TCS_SDA_READ GPIO_ReadInputPins(GPIO_PORT_E, GPIO_PIN_05)
设置数据引脚为输出模式的函数为:
void TCS_SDA_OUT()
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_OUT;
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_05, &stcGpioInit);
}
设置数据引脚为输如模式的函数为:
void TCS_SDA_IN()
{
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDir = PIN_DIR_IN;
stcGpioInit.u16PullUp = PIN_PU_ON;
(void)GPIO_Init(GPIO_PORT_E, GPIO_PIN_05, &stcGpioInit);
}
模拟I2C发送字节数据的函数为:
void TCS34725_I2C_Send_Byte(u8 byte)
{
u8 i;
TCS_SDA_OUT();
TCS_SCL_L;
for(i = 0; i < 8; i++)
{
if(((byte&0x80)>>7)==1)TCS_SDA_H;
else
TCS_SDA_L;
byte <<= 1;
Delay_us(20);
TCS_SCL_H;
Delay_us(20);
TCS_SCL_L;
Delay_us(20);
}
}
模拟I2C读取字节数据的函数为:
u8 TCS34725_I2C_Read_Byte(u8 ack)
{
u8 i,receive = 0;
TCS_SDA_IN();
for(i = 0; i < 8; i++)
{
TCS_SCL_L;
Delay_us(20); //FL_DelayUs(2);
TCS_SCL_H;
receive <<= 1;
if(TCS_SDA_READ) receive++;
Delay_us(10); //FL_DelayUs(1);
}
if (!ack) TCS34725_I2C_NACK();
else TCS34725_I2C_ACK();
return receive;
}
对TCS34725进行初始化的函数为:
u8 TCS34725_Init(void)
{
u8 id=0;
TCS34725_Read(TCS34725_ID, &id, 1);
if(id==0x4D | id==0x44)
{
TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
TCS34725_SetGain(TCS34725_GAIN_1X);
TCS34725_Enable();
return 1;
}
return 0;
}
获取色彩检测值的函数为:
u8 TCS34725_GetRawData(COLOR_RGBC *rgbc)
{
u8 status = TCS34725_STATUS_AVALID;
TCS34725_Read(TCS34725_STATUS, &status, 1);
if(status & TCS34725_STATUS_AVALID)
{
rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);
rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);
rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);
rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
return 1;
}
return 0;
}
实现色彩检测与标识的主程序为:
int32_t main(void)
{
u16 rv,gv,bv,fv;
LL_PERIPH_WE(LL_PERIPH_GPIO);
LED_Init();
LL_PERIPH_WP(LL_PERIPH_GPIO);
Lcd_Init();
LCD_Clear(BLACK);
LCD_ShowString(20,10,"HC2F4A0 ",RED);
LCD_ShowString(20,30,"R: G: B:",YELLOW);
LCD_color(RED);
LCD_box(109,29,130,50);
TCS34725_Init();
TCS34725_GetRawData(&rgb);
while(1)
{
TCS34725_GetRawData(&rgb);
rv=rgb.r*255/rgb.c;
gv=rgb.g*255/rgb.c;
bv=rgb.b*255/rgb.c;
LCD_ShowNum(0,50,rv,4,YELLOW);
LCD_ShowNum(32,50,gv,4,YELLOW);
LCD_ShowNum(64,50,bv,4,YELLOW);
fv=((rv>>3)<<11)+((gv>>2)<<5)+(bv>>3);
LCD_color(fv);
DDL_DelayMS(DLY_MS);
}
}
但几经尝试该色彩传感器却一直无法检测到色彩值,只好留待后面去解决啦!
|