麻烦看下我这那里有问题了,软件驱动屏幕正常,硬件驱动就不行了 | 已解决
用STC8H8K64U驱动2.4寸tft屏,IC是HX8347I,采用16bit模式,初始化的命令和数据均低8位有效,P0接低八位,P2接高八位,不需要LCM中断,我用io模拟能驱动,说明接线,初始化都没有问题。下面是改的硬件LCM驱动屏,最后的效果就是红色和青色正反方向循环刷屏。#include "STC8H.H"
#include "IO_int.H"
#include "uart.H"
//液晶屏IC所需要的信号线的接口定义
sbit CS0=P1^3; //CS
sbit reset=P1^4;//RES
sbit DC0=P4^5; //RS(A0)
sbit WR0=P4^2; //R/W
sbit RD0=P4^4; //E
void Delay(unsigned int xms) //11.0MHz 1ms
{
unsigned char i, j;
while(xms--)
{
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
}
void delay_us(int i)
{
int j,k;
for(j=0;j<i;j++);
for(k=0;k<1;k++);
}
void lcmint()
{
P_SW2 |= 0x80; //扩展寄存器访问使能
LCMIFCFG=0X02;
LCMIFCFG2=0X00;
LCMIFCR=0X80;
LCMIFSTA = 0x00;
}
//void WriteComm(int com1)
//{
// CS0 = 0;
// DC0 = 0;
// RD0 = 1;
// P0=com1;
// WR0 = 0;
// delay_us(1);
// WR0 = 1;
// CS0 = 1;
//}
//void WriteData(int data1)
//{
// CS0 = 0;
// DC0 = 1;
// RD0 = 1;
// P0=data1;
// WR0 = 0;
// WR0 = 1;
// CS0 = 1;
//}
void WriteComm(char com1)
{
LCMIFDATL=com1;
CS0 = 0;
LCMIFCR=0x84;
CS0 = 1;
}
void WriteData(char data1)
{
LCMIFDATL=data1;
CS0 = 0;
LCMIFCR=0X85;
CS0 = 1;
}
//连写2个字节(即16位)数据到LCD模块
//void transfer_data_16(int data_16bit)
//{
// CS0 = 0;
// DC0 = 1;
// RD0 = 1;
// P2=data_16bit>>8; //P2口接高位
// P0=data_16bit; //P0口接低位
// WR0 = 0;
// WR0 = 1;
// CS0 = 1;
//}
void transfer_data_16(int data_16bit)
{
LCMIFDATH=data_16bit>>8; //P2口接高位
LCMIFDATL=data_16bit; //P0口接低位
CS0 = 0;
LCMIFCR=0X85;
CS0 = 1;
}
//void LCD_reg(unsigned char command,unsigned char dat)
//{
// WriteComm(command); //
// WriteData(dat);
//}
//************* 初始化程序HX8347I成功**********//
void lcd_initial()
{
//Delay(200);
//reset=0;
//Delay(200);
//reset=1;
WriteComm(0x01); //软复位
Delay(200); //必须有50ms以上的延时
WriteComm(0xB9);
WriteData(0xFF);
WriteData(0x83);
WriteData(0x47);
Delay(50);
WriteComm(0xB1); // Set BT = 4 before sleep out
WriteData(0x00);
WriteData(0x04); // BT = 4
WriteComm(0x11); // Sleep Out
Delay(120);
WriteComm(0x3A); //SET COLOR
WriteData(0x05); // 06 262k//05 65k
WriteComm(0xBF); //
WriteData(0x00);
WriteData(0x26);
WriteComm(0xCC);
WriteData(0x09); // BGR
WriteComm(0xB0); //
WriteData(0x88); //
WriteComm(0xB1); //
WriteData(0x00);
WriteData(0x01); //
WriteData(0x1C); // VREG1OUT
WriteComm(0xB4); //
WriteData(0x11);
WriteData(0xFF);
WriteData(0x00);
WriteData(0x02);
WriteData(0X02);
WriteData(0x04);
WriteData(0x80);
WriteComm(0xB5); //
WriteData(0x0b); // Vref
WriteComm(0xB6); //
WriteData(0x23); // vcomh
WriteData(0x63); // vcoml
WriteComm(0xFD); //
WriteData(0x6A); // VCOM_Offset
WriteComm(0xE3); // EQ
WriteData(0x20);
WriteData(0x10);
WriteData(0x10);
WriteData(0x20);
WriteData(0x20);
WriteData(0x20);
WriteComm(0xE0); // Gamma
WriteData(0x00);
WriteData(0x00);
WriteData(0x04);
WriteData(0x11);
WriteData(0x0F);
WriteData(0x28);
WriteData(0x0E);
WriteData(0x53);
WriteData(0x09);
WriteData(0x13);
WriteData(0x17);
WriteData(0x18);
WriteData(0x1A);
WriteData(0x17);
WriteData(0x30);
WriteData(0x2E);
WriteData(0x3B);
WriteData(0x3F);
WriteData(0x3F);
WriteData(0x2C);
WriteData(0x71);
WriteData(0x05);
WriteData(0x07);
WriteData(0x08);
WriteData(0x0C);
WriteData(0x16);
WriteData(0x88);
WriteComm(0x29); // Display On
Delay(5);
//WriteComm(0x2C); // Write Ram
}
//定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
void lcd_address(unsigned int XS,unsigned int YS,unsigned int x_total,unsigned int y_total)
{ // 0 0 240 320
int XE,YE;
XE=XS+x_total-1;
YE=YS+y_total-1;
WriteComm(0x2a);
// 设置X开始及结束的地址
transfer_data_16(XS); // X 开始地址(16 位)
transfer_data_16(XE); // X 结束地址(16 位)
WriteComm(0x2b);
// 设置Y开始及结束的地址
transfer_data_16(YS); // Y 开始地址(16 位)
transfer_data_16(YE); // Y 结束地址(16 位)
WriteComm(0x2c);
}
// 写数据开始
void mono_transfer_data_16(int mono_data,int font_color,int back_color)
{
int i;
for(i=0;i<8;i++)
{
if(mono_data&0x80)
{
transfer_data_16(font_color);
//当数据是1时,显示字体颜色
}
else
{
transfer_data_16(back_color); //当数据是0时,显示底色
}
mono_data<<=1;
}
}
//全屏显示一种颜色
void display_color(int color_data)
{
int i,j;
lcd_address(0,0,240,320);
for(i=0;i<240;i++)
{
for(j=0;j<320;j++)
{
transfer_data_16(color_data);
}
}
}
void main(void)
{
<blockquote> P0M0 = 0x00; P0M1 = 0x00;
void main(void)
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
UartInit();
lcmint();
lcd_initial();
while(1)
{
WriteComm(0x36); // 扫描方式命令
WriteData(0x80); // 从左到右 从下到上
display_color(0xf800); //红
WriteComm(0x36); //
WriteData(0x00); //默认值0x00 从左到右 从上到下
display_color(0x07ff); //青色
}
} 可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有现象才好判断问题,单纯通过查看代码并不容易看出问题来 王昱顺 发表于 2025-1-25 11:49
可以尝试使用lcm只发送单一数据,然后和io模拟发送单一数据进行对比。
用示波器测量看看波形是否正确。
有 ...
没有示波器{:cahan:} 参考了一下官方例程,官方都是8位格式的,怀疑我写的发送16位数据有问题。 mtt661 发表于 2025-1-25 11:43
16位数据写入?
因为无实物实验, 仅看代码, 可能不太好说...
建议把写命令和写数据两个函数改写一下,试试看如何?
例如:
void WriteComm(char com1)
{
CS0 = 0;
LCMIFDATL=com1;
LCMIFCR=0x84;
while(!(LCMIFSTA & 0x01)); //等待状态标志置1
LCMIFSTA = 0x00; //软件清零
CS0 = 1;
}
void WriteData(unsigned int data1)
{
CS0 = 0;
LCMIFDATH=data1>>8;
LCMIFDATL=data1;
LCMIFCR=0x85;
while(!(LCMIFSTA & 0x01)); //等待状态标志置1
LCMIFSTA = 0x00; //软件清零
CS0 = 1;
}
浦江一水 发表于 2025-1-25 12:26
16位数据写入?
因为无实物实验, 仅看代码, 可能不太好说...
非常感谢,按照您的修改 ,可以了 我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏幕是不是坏了,请问可以提供一下这个屏幕的16bit通信的接口原理图么? yxyy3604 发表于 2025-2-5 13:11
我这边也有个8347I的2.4寸屏幕,测试H8bit,spi通信都只有背光亮。屏幕毫无反应。想用你的程序测试下看看屏 ...
我的屏是这个样子的
mtt661 发表于 2025-2-5 14:18
我的屏是这个样子的
还想请问下 “FMARK 同步脉冲”引脚需要接到单片机么?
yxyy3604 发表于 2025-2-5 17:02
还想请问下 “FMARK 同步脉冲”引脚需要接到单片机么?
不用 空着就行 下面是我自己画的,可以用。
页:
[1]
2