好了,昨天我们学习了如何得到屏的型号,然后写了初始化代码.
然后............
我们得到了一个很花的屏.里边的颜色什么都有,就象很久很久以前的显像管彩电没信号一样.
别怕,那就对了,初始化完了,我们下来的工作就要抹掉那些乱七八糟的东东,画上一块统一颜色.
我们学到现在,对于显屏,不外呼就是先找到屏里的像素地址,然后输入这一点的的数据.就成了.
OLED输入一个数据决定8个点的情况(要画点或抹掉点),因为OLED的地址X坐标一个是点阵形式,Y坐标是行(页).这是以前LCD屏技术的一个延伸.我们对得这样的屏多了.
反而对新事物就比较难接受了,现在TFT屏XY坐标都是点陈的形式.本来屏就得用点阵的形式来做地址的.但小屏为了写程式员好过一点才分成行的形式(必竟小屏显示的东东不多)
好了,TFT显示还是那两板斧,找到行地址,然后找到列地址,然后写一个16位的数据来决定这一点的颜色.(比OLED好理解决多了)
昨天我们写的读写TFT屏的的寄存器代码:
//写寄存器
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
今天用上了.
看到没有,TFT屏的命令模式都是先 放上寄存器地址,然后再放上要存放在这个寄存器里的数据,比方说你要找一个人办事,得先找到这个人,再将要办的事(数据)交给他.
如下这个代码:
LCD_WriteReg(0x0020,XXXX); //X
(XXXX代表的0至239) 0x0020代表指令R32 指令R32是行地址设置的指令
LCD_WriteReg(0x0021,YYYY); //Y
( YYYY 代表的0至319) 0x0021代表指令R33 指令R33是列地址设置的指令
然后,写入命令 意思是说上边的XY坐标已经给你了,我要写入数据了.
LCD_WR_REG(0x22);
0x22是R34号指令.这个指令是这么多指令中唯一的一个不用后边跟数据的的指令,所以直接写指令函数LCD_WR_REG就得了,不用用函数LCD_WriteReg来表达.
然后用我们自己写的写数据函数丢进数据说明这一点的颜色
LCD_WR_DATA(ZZZZ);
ZZZZ是一个16位的二进制数.底5位是蓝色的值,中间6位是绿色的值,最高5位是红色的值,值越大颜色越深.
好了:
LCD_WriteReg(0x0020,XXXX); //X
LCD_WriteReg(0x0021, YYYY ); //Y
LCD_WR_REG(0x22);
LCD_WR_DATA(ZZZZ);
以上4行就是 在X,Y点 画一个颜色为ZZZZ值的点 的意思. 这样好明白了吧.
好,我们将昨天写的代码中的MAIN()函数改一下,丢进板子试一下.
代码如下:
int main(void)
{
u16 i,j,k,FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800};
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
LCD_IO_Init();
LCD_init();
// LCD_WriteReg(0x0007, 0x0);
// LCD_WriteReg(0x0007, 0x0173); //26万色显示开启
while (1)
{
for (k=0;k<5;k++)
{
for (i=0;i<320;i++)
{
for (j=0;j<240;j++)
{
LCD_WriteReg(0x0020,j); //X
LCD_WriteReg(0x0021,i); //Y
LCD_WR_REG(0x22);
LCD_WR_DATA(FOX[k]);
delay_ms(1);
}
}
}
}
}
FOX[5]={0x001F,0XF81F,0XFFE0,0X07FF,0xF800} <====代表五种颜色的值.
丢进板子,叮叮叮叮~~~~~~~~~~~~~~~~~~~~~
看到没有,先是蓝色(值是0x001F)从屏的上方从左到右,一直画下来,这样,我们就清楚我们的屏子的顶在那里,底的在那里了!!
如要刷快点,将delay_ms(1); 注释掉.那屏就刷得哗哗的.但可能我们还不满意,还是觉得慢了,这个不怕,后几季我们想办法将它刷快点.
PS: 加上delay_ms(1); 主要是给我们看点是怎么样画上去的,从那里开始.画得太快我们没反应过来.
哈哈,我们的TFT就玩进门了.
好,下一季,我们要试一下这几行代码:
#define LCD_CS_SET GPIOC->BSRR=1<<9 //片选端口 PC9
#define LCD_RS_SET GPIOC->BSRR=1<<8 //数据/命令    C8
#define LCD_WR_SET GPIOC->BSRR=1<<7 //写数据 PC7
#define LCD_RD_SET GPIOC->BSRR=1<<6 //读数据 PC6
#define LCD_CS_CLR GPIOC->BRR=1<<9 //片选端口 PC9
#define LCD_RS_CLR GPIOC->BRR=1<<8 //数据/命令    C8
#define LCD_WR_CLR GPIOC->BRR=1<<7 //写数据 PC7
#define LCD_RD_CLR GPIOC->BRR=1<<6 //读数据 PC6
是来搞什么东东的,因为我们上两季都没用到. |