自己已经做了很多项目了,但是很少总结,这样的学习效果不是很好,自己总结能够让自己更加充分的去理解源代码。今天趁放假时间来把电子书项目总结一下。设计思路:LCD作为电子书显示器,触摸屏或者终端stdin作为按键输入设备,控制翻页。


整个项目源码下载地址:点击这里!

做这个项目首先得让自己开发板能够跑起Linux操作系统,然后写LCD驱动和触摸屏驱动。这个可以参考我写的驱动代码,基本上符合所以得LCD和触摸屏,变化最多也只是电路的接线不一样。

LCD驱动程序参考:http://blog.csdn.net/qq_21792169/article/details/50427961

触摸屏驱动程序参考:http://blog.csdn.net/qq_21792169/article/details/48750695

多文件夹编写Makefile参考:http://blog.csdn.net/qq_21792169/article/details/50448639


和硬件相关的代码也只有LCD和触摸屏了,其他代码适合所有的开发板。


下面开始从零讲解代码:

我们已面对象思想来编写程序,模块化编程方便我们查找代码,修改代码,可移植性强,我们把各个模块都放进自己相似类型的链表中,方便统一管理。下面我们开始讲解代码,从显示LCD开始讲解代码。


先看下工程目录结构:



include头文件目录:



display         /* LCD显示部分的代码 */

draw           /* 文本在LCD上显示操作函数 */

encoding     /* 解码,支持utf-8  utf-16be  utf-16le  ascii.c */  

fonts           /* 对字体的操作,矢量字体,ascii   gbk字体 */

input          /* 输入操作,触摸屏,标准输入stdin */

include     /* 所用到的头文件目录 */

si              /* sourceInsight工程目录 */

主函数是main.c   

编译用到的是Makefile和Makefile.build     /* 多文件夹编写Makefile:点击这里! ,根据Makefile可以清楚看待各个目录下的文件,所用到的库,*/


Makefile文件如下:

<span style="font-size:18px;">CROSS_COMPILE = arm-linux-
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm

STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump

export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP

CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/include

LDFLAGS := -lm -lfreetype -lts -lpthread

export CFLAGS LDFLAGS

TOPDIR := $(shell pwd)
export TOPDIR

TARGET := show_file


obj-y += main.o
obj-y += display/
obj-y += draw/
obj-y += encoding/
obj-y += fonts/
obj-y += input/

all : 
	make -C ./ -f $(TOPDIR)/Makefile.build
	$(CC) $(LDFLAGS) -o $(TARGET) built-in.o


clean:
	rm -f $(shell find -name "*.o")
	rm -f $(TARGET)

distclean:
	rm -f $(shell find -name "*.o")
	rm -f $(shell find -name "*.d")
	rm -f $(TARGET)
	</span>


Makefile.build

<span style="font-size:18px;">PHONY := __build
__build:


obj-y :=
subdir-y :=

include Makefile

# obj-y := a.o b.o c/ d/
# $(filter %/, $(obj-y))   : c/ d/
# __subdir-y  : c d
# subdir-y    : c d
__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y	+= $(__subdir-y)

# c/built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)

# a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
  include $(dep_files)
endif


PHONY += $(subdir-y)


__build : $(subdir-y) built-in.o

$(subdir-y):
	make -C $@ -f $(TOPDIR)/Makefile.build

built-in.o : $(cur_objs) $(subdir_objs)
	$(LD) -r -o $@ $^

dep_file = .$@.d

%.o : %.c
	$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<
	
.PHONY : $(PHONY)</span>


config.h   /* 配置文件,整个工程所用到的配置文件,我们放在include目录下 */

<span style="font-size:18px;">#ifndef _CONFIG_H
#define _CONFIG_H

#include <stdio.h>

#define FB_DEVICE_NAME "/dev/fb0"

#define COLOR_BACKGROUND   0xE7DBB5  /* 泛黄的纸 */
#define COLOR_FOREGROUND   0x514438  /* 褐色字体 */

#define DBG_PRINTF(...)  
//#define DBG_PRINTF printf

#endif /* _CONFIG_H */
</span>


框架结构就讲解完毕,下篇文章重点讲解各个模块,框架是固定的,记住模板就行。


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐