在NUCLEO_F767ZI实现RTC实时时钟的帖子中,介绍了一种以OLED屏来实现实时时钟的方法,本贴再介绍一种以串行接口TFT屏来实现带生肖图案的万年历实现方法。 以前受程序存储空间的限制,在不加挂大容量存储器件的情况下要想显示一幅高质量的图片是件困难的事。对于NUCLEO_F767ZI来说这件事容易了许多,因为它的程序存储空间已达2M,显示的图片数据完全可以存放到程序中,这完全有种土豪的有钱就可以这么任性的味道。 在该生肖图案型万年历中,每幅生肖图片的规格为200*200像素,以16位色彩的格式来存储,共12幅。 万年历的计时环节则是使用NUCLEO_F767ZI内部的RTC,其运行效果如图1所示。 图1生肖图案型万年历 q2 y( _5 r4 ?. _, X, }3 B
由于在前帖中对RTC的用法已做过介绍,这里就不再重复,参见该网址即可: https://www.stmcu.org.cn/module/forum/thread-608523-1-1.html 本贴主要介绍以串口TFT屏来实现图片的显示,其整体构成如图2所示。 串口TFT屏与开发板的引脚连接关系为: REST-PB1 DC-PB2 CS-PB3 SCK-PC6 SDI-PC7 相应的高低电平输出语句定义如下: - #define LCD_SCK_High() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);}9 W5 ~5 e0 R. H% G
- #define LCD_SCK_Low() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);}
+ {! H4 o9 L: x$ |8 S. H - #define LCD_SDI_High() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);}
( S4 ^; C9 |: k& \& c- B5 z1 f - #define LCD_SDI_Low() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);}: ?' O" Y0 E5 h4 Z
- #define LCD_CS_High() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);}
$ |$ A/ F+ @% d1 B" F5 T- g - #define LCD_CS_Low() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);}
- [1 [" F1 v5 _ - #define LCD_DC_High() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);}2 i% y1 Z- i# k) n
- #define LCD_DC_Low() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);}
7 ?$ X" u" H7 [" b' x$ O* Y7 ~ - #define LCD_REST_High() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);}
2 L$ L) y. m* L1 S: V @& g - #define LCD_REST_Low() { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);}
复制代码图2 整体构成
6 w E2 Q1 A- S& I4 e
生肖图片的显示函数如下: - void show_image(unsigned int x,unsigned int y,unsigned int n) //200*200
- `% Y1 _* b# f7 K8 v; @ - {
8 B! N! y' n8 G' A2 m0 t' U - unsigned int i,j,k;
5 H7 n! ?" B+ i9 I$ H: T& Y1 ?4 @ y) q - unsigned int da;# a k7 k/ R0 `1 K, t% h A
- k=0;
. K! e4 ~- X/ e( D+ V - for(i=0;i<200;i++)( Z& F# p7 C/ O7 u
- { 6 W! w d4 p3 N
- LCD_SetCursor(x,y+i);7 P9 s3 U: \1 d" F; P) }8 l' w: H
- LCD_WriteRAM_Prepare();
Z7 G" g7 B L - for(j=0;j<200;j++)
' g0 I8 _4 h. X1 k) J6 B - {
* @$ o' z5 F- U2 G; I5 q - if (n==9) da=gImage_sh[k*2];: z& J- v# t5 j1 @' Y
- da<<=8;$ P; Z3 [' [& W' o
- if (n==9) da|=gImage_sh[k*2+1];
: A& J- Z5 ^6 Y ?$ m! u5 E - LCD_WR_DATA(da);
5 p3 h0 H% R9 |& y" y) W7 S - k++;
: f8 {' @# V2 M) {4 g* u - }
/ A% y: |" l/ T& {. |+ Z6 @ - }
9 ~/ u8 A) `6 ?& A& @ - }
复制代码实现生肖图案型万年历的主函数如下: - int main(void)8 L# N# }) O( P& e6 x
- {
8 J$ H1 O9 U |% g - HAL_Init(); //初始化HAL库% r* G6 p, D9 i9 O: x
- Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
9 w# w, }' @ p+ E7 z - delay_init(216); //延时初始化" {; s$ j! B/ A+ H
- GPIO_Configuration();
7 ^( {( b8 M7 w - Lcd_Init(); // 初始化TFT9 L9 Y: T3 L+ c1 Y0 k* B* K
- LCD_Clear(WHITE);; M- m" o/ x* g" X
- BACK_COLOR=WHITE;
5 ^+ |) ?/ g9 ^- v0 B, }; [ - POINT_COLOR=RED;* j5 E D% W3 m' R
- show_image(20,0,9); // 显示生肖图片( O9 V% L! ~% Z$ s. S% B1 K
- while(1)
7 U0 `# W+ v a$ w0 @ - {9 Z, l" h+ l' }. v9 p$ {: H
- // 显示RTC 计时值: E. a5 k. E, b
- }
' t+ [3 t v3 o$ U - }
复制代码
& N! q( _7 c- Z1 e6 ?+ d& `9 x- I7 G. a' f, k1 r1 D) B
|
多谢打赏!!!