LCD驅動
筆者最近在研究4412開發闆,為了更好入門Lcd驅動及字符,專程拜訪了華清遠見星創客大牛李老師,如下就是李老師指點彙總,分享給大家,不喜勿噴!
lcd驅動
一、驅動
基于framebuffer,整體代碼參考内核s3c-fb.c
代碼初始化步驟:
1.申請fb_info
2.初始化fb_info
3.管腳設置
4.時鐘設置
我是星創客
四、應用編碼
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <fcntl.h>
5 #include <string.h>
6 #include <linux/fb.h>
7 #include <sys/mman.h>
8 #include <sys/ioctl.h>
9 #include <arpa/inet.h>
10 #include <errno.h>
11
12#define MY_W 320 //圖像寬
13#define MY_H 240 //圖像高
14#define MAX_SIZE 1024*600*4 //lcd屏幕大小,具體要看對應的lcd手冊。我的是1024*600
15
16/*字符矩陣 16*14*/
17#define C_W 40
18#define C_H 35
19
20staticchar *fbp = 0; //映射内存起始地址
21staticint fbfd = 0; //幀緩沖fd
22
23/*存放轉換後的漢字字節*/
24const unsigned char cbuf[1024]=
25 {
26/*-- 文字: 我 --*/
27/*-- 宋體26; 此字體下對應的點陣為:寬x高=35x35 --*/
28/*-- 寬度不是8的倍數,現調整為:寬度x高度=40x35 --*/
290x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x38,0x00,0x00,0x00,
300x0F,0xBE,0x00,0x00,0x00,0x7F,0xFD,0xE0,0x00,0x07,0xF8,0x3C,0x78,0x00,0x3E,0x78,
310x3C,0x7C,0x00,0x00,0x78,0x3C,0x3E,0x00,0x00,0x78,0x3C,0x1C,0x00,0x00,0x78,0x3C,
320x0C,0x00,0x00,0x78,0x3C,0x06,0x00,0x00,0x78,0x3C,0x0F,0x00,0x7F,0xFF,0xFF,0xFF,
330x80,0x00,0x78,0x3C,0x00,0x80,0x00,0x78,0x1C,0x10,0x00,0x00,0x78,0x1C,0x38,0x00,
340x00,0x78,0x1C,0x3C,0x00,0x00,0x78,0x5C,0x7E,0x00,0x00,0x7F,0xDC,0x70,0x00,0x00,
350x7E,0x1C,0xF0,0x00,0x01,0xF8,0x1F,0xE0,0x00,0x1F,0xF8,0x1F,0xC0,0x00,0x7F,0x78,
360x0F,0x80,0x00,0x3C,0x78,0x0F,0x00,0x00,0x30,0x78,0x0F,0x01,0x80,0x00,0x78,0x3F,
370x81,0x80,0x00,0x78,0x7B,0xC1,0x80,0x00,0x78,0xF1,0xE1,0x80,0x00,0x7B,0xC0,0xF3,
380x80,0x00,0x7F,0x00,0x7F,0x80,0x0F,0xFC,0x00,0x3F,0x80,0x01,0xF0,0x00,0x0F,0xC0,
390x00,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
40 };
41
42/*轉換,并顯示*/
43void pch(int *add,const unsigned char* buf)
44 {
45int row = 0;
46int col = 0;
47int i = 0;
48int color = 0x0;
49for(row=0;row<C_H;row )
50 {
51/*一行數據,按位轉換*/
52 unsigned char tmp[C_W];
53int index = 0;
54int j = 0;
55int k = 0;
56for(k=0;k<(C_W/8);k )
57 {
58for(j=0;j<8;j )
59 {
60 tmp[index] = (buf[i] & ((0x1<<7)>>j))>0?1:0 ;
61 index ;
62 }
63 i ;
64 j = 0;
65 }
66
67/*一行數據,按位顯示*/
68for(col=0;col<C_W;col )
69 {
70if(tmp[col]&1)
71 {
72 color = 0xffff0000; //顯示成紅色,這裡需要什麼顔色自己設置(可以自行百度RGB顔色)
73 printf("1");
74 }
75else
76 {
77 color = 0x0; //顯示成黑色,背景色
78 printf("0");
79 }
80 add[row*1024 col] = color;
81 }
82 printf("\n\n");
83 }
84 }
85
86/*清整屏幕,全部置為黑色*/
87void clearfb(void)
88 {
89 memset(fbp,0,MAX_SIZE); //顯示成黑色,背景色
90 }
91
92int main()
93 {
94int i;
95 fbfd = open("/dev/fb0", O_RDWR);
96 fbp = (char *)mmap(0, MAX_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fbfd, 0);
97if (fbp == NULL)
98 {
99 printf("Error: failed to map framebuffer device to memory.\n");
100return -1;
101 }
102
103int *add;
104while(1)
105 {
106 add = (int *)fbp 1024*3 100; /*第三行,偏移100*/
107 clearfb();
108 pch(add,cbuf);
109 sleep(2);
110 }
111
112 munmap((void *)add,1024*600*4);
113return0;
114 }
顯示效果:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!