LCD编程_简单测试

首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c。我们是看不到led_controller.c的。比如说,在led_test.c中,需要使用led_controller.c中的函数,需要在led.c中对led_controller.c中的函数进行封装。

怎样去使用lcd呢,框图如下:

秉承上述的思想,于是就有了下面的代码。

led_test.c

 1 void lcd_test(void)
 2 {
 3     unsigned int fb_base;
 4     int xres, yres, bpp;
 5     int x, y;
 6     unsigned short *p;
 7     unsigned int *p2;
 8
 9     /* 初始化LCD */
10     lcd_init();
11
12     /* 使能LCD */
13     lcd_enable();
14
15     /* 获得LCD的参数: fb_base, xres, yres, bpp */
16     get_lcd_params(&fb_base, &xres, &yres, &bpp);
17
18     /* 往framebuffer中写数据 */
19     if (bpp == 16)
20     {
21         /* 让LCD输出整屏的红色 */
22
23         /* 565: 0xf800 */
24
25         p = (unsigned short *)fb_base;
26         for (x = 0; x < xres; x++)
27             for (y = 0; y < yres; y++)
28                 *p++ = 0xf800;
29
30         /* green */
31         p = (unsigned short *)fb_base;
32         for (x = 0; x < xres; x++)
33             for (y = 0; y < yres; y++)
34                 *p++ = 0x7e0;
35
36         /* blue */
37         p = (unsigned short *)fb_base;
38         for (x = 0; x < xres; x++)
39             for (y = 0; y < yres; y++)
40                 *p++ = 0x1f;
41
42     }66 }

led.c

 1 #include "lcd.h"
 2 #include "lcd_controller.h"
 3
 4 #define LCD_NUM 10
 5
 6 static p_lcd_params p_array_lcd[LCD_NUM];
 7 static p_lcd_params g_p_lcd_selected;
 8
 9 int register_lcd(p_lcd_params plcd)
10 {
11     int i;
12     for (i = 0; i < LCD_NUM; i++)
13     {
14         if (!p_array_lcd[i])
15         {
16             p_array_lcd[i] = plcd;
17             return i;
18         }
19     }
20     return -1;
21 }
22
23 int select_lcd(char *name)
24 {
25     int i;
26     for (i = 0; i < LCD_NUM; i++)
27     {
28         if (p_array_lcd[i] && !strcmp(p_array_lcd[i]->name, name))
29         {
30             g_p_lcd_selected = p_array_lcd[i];
31             return i;
32         }
33     }
34     return -1;
35 }
36
37 void get_lcd_params(unsigned int *fb_base, int *xres, int *yres, int *bpp)
38 {
39     *fb_base = g_p_lcd_selected->fb_base;
40     *xres = g_p_lcd_selected->xres;
41     *yres = g_p_lcd_selected->yres;
42     *bpp = g_p_lcd_selected->bpp;
43 }
44
45 void lcd_enable(void)
46 {
47     lcd_controller_enable();
48 }
49
50 void lcd_disable(void)
51 {
52     lcd_controller_disable();
53 }
54
55 int lcd_init(void)
56 {
57     /* 注册LCD */
58     lcd_4_3_add();
59
60     /* 注册LCD控制器 */
61     lcd_contoller_add();
62
63     /* 选择某款LCD */
64     select_lcd("lcd_4.3");
65
66     /* 选择某款LCD控制器 */
67     select_lcd_controller("s3c2440");
68
69     /* 使用LCD的参数, 初始化LCD控制器 */
70     lcd_controller_init(g_p_lcd_selected);
71 }

lcd_controller.c

 1 #include "lcd_controller.h"
 2
 3 #define LCD_CONTROLLER_NUM 10
 4
 5 static p_lcd_controller p_array_lcd_controller[LCD_CONTROLLER_NUM];
 6 static p_lcd_controller g_p_lcd_controller_selected;
 7
 8 int register_lcd_controller(p_lcd_controller plcdcon)
 9 {
10     int i;
11     for (i = 0; i < LCD_CONTROLLER_NUM; i++)
12     {
13         if (!p_array_lcd_controller[i])
14         {
15             p_array_lcd_controller[i] = plcdcon;
16             return i;
17         }
18     }
19     return -1;
20 }
21
22 int select_lcd_controller(char *name)
23 {
24     int i;
25     for (i = 0; i < LCD_CONTROLLER_NUM; i++)
26     {
27         if (p_array_lcd_controller[i] && !strcmp(p_array_lcd_controller[i]->name, name))
28         {
29             g_p_lcd_controller_selected = p_array_lcd_controller[i];
30             return i;
31         }
32     }
33     return -1;
34 }
35
36
37 /* 向上: 接收不同LCD的参数
38  * 向下: 使用这些参数设置对应的LCD控制器
39  */
40
41 int lcd_controller_init(p_lcd_params plcdparams)
42 {
43     /* 调用所选择的LCD控制器的初始化函数 */
44     if (g_p_lcd_controller_selected)
45     {
46         g_p_lcd_controller_selected->init(plcdparams);
47         return 0;
48     }
49     return -1;
50 }
51
52 void lcd_controller_enable(void)
53 {
54     if (g_p_lcd_controller_selected)
55     {
56         g_p_lcd_controller_selected->enable();
57     }
58 }
59
60 void lcd_controller_disable(void)
61 {
62     if (g_p_lcd_controller_selected)
63     {
64         g_p_lcd_controller_selected->disable();
65     }
66 }
67
68
69 void lcd_contoller_add(void)
70 {
71     s3c2440_lcd_contoller_add();
72 }

原文地址:https://www.cnblogs.com/-glb/p/11371373.html

时间: 2024-11-10 13:17:09

LCD编程_简单测试的相关文章

LCD编程_使用调色板

在前面的博客中,使用的像素格式都是16bpp,24bpp(24bpp实际实际上就是32bpp)?如果想使用8bpp时,就需要使用调色板. 在以前的博客中,曾经说过,在framebuffer中如果每个像素用8bpp表示,这8bpp怎么转换成lcd需要的16bpp的数据,需要引入一个调色板. 2的8次方,为256.即调色板中有256项,0-255.需要在调色板所对应的内存里面,填入16bpp的数据(这些数据就是真正的颜色值).把lcd控制器设置为8bpp时,它会从framebuffer中取出一个像素

Windows Socket 编程_ 简单的服务器/客户端程序

转载自:http://blog.csdn.net/neicole/article/details/7459021 一.程序运行效果图 二.程序源代码 三.程序设计相关基础知识 1.计算机网络    2.IP地址    3.协议    4.网络体系结构    5.TCP/IP体系结构与特点    6.客户机/服务器模式    7.TCP/IP特点    8.套接字的引入    9.面向 连接/无连接 的套接字的系统调用时序图/流程图 一.程序运行效果图 二.程序源代码 [cpp] view pla

基于树莓派的Linux串口编程_实现自发自收

串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备.在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面.如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2. 树莓派UART端口的位置:见下图的GPIO14(TXD).GPIO 15(RXD) 本文是基于

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能

结对编程_附加题_博客2

1.界面模块,测试模块和核心模块的松耦合 2.改进程序 结对编程_附加题_博客2

socket编程,简单多线程服务端测试程序

socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.accept.recv.send等函数的介绍,今天写了一个CUI界面的测试程序(依赖MFC)作为补充.程序功能简介如下: 1:一个线程做监听用. 2:监听线程收到客户端连接后,创建新线程接收客户端数据.所有对客户端线程将加入容器,以便管理. 3:服务端打印所有客户端发来的信息. 4:服务端CUI界面输入数字

centos7搭建ELK Cluster集群日志分析平台(四):简单测试

续之前安装好的ELK集群 各主机:es-1 ~ es-3 :192.168.1.21/22/23 logstash: 192.168.1.24 kibana: 192.168.1.25 测试机:client: 192.168.1.26 在测试机上安装并启动filebeat 1. 下载filebeat  ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.0-linux-x86_64.tar.gz

【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 二.同步代码存在的问题 对于同步的代码,大家肯定都不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个

Redis安装及简单测试

题目链接:11645 - Bits 题意:给定一个数字n,要求0-n的二进制形式下,连续11的个数. 思路:和 UVA 11038 这题类似,枚举中间,然后处理两边的情况. 不过本题最大的答案会超过longlong,要用高精度,不过借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字,这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include