




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 6 6 人机交互接口设计人机交互接口设计 158 6 1 键盘输入接口 158 6 1 1 键盘工作原理 158 6 1 2 常用键盘接口 159 6 1 3 键盘驱动程序实例 161 6 2 LCD 显示接口 162 6 2 1 LCD 简介 163 6 2 2 在嵌入式 Linux 中驱动 LCD 164 6 2 3 LCD 接口电路 167 1 S3C4510B LCD 显示接口电路 167 2 S3C44B0X 与 LCD 显示模块的接口 168 6 2 4 uClinux 下开发 LCD 应用程序 169 6 3 触摸屏交互接口 171 6 3 1 触摸屏的基本原理 171 6 3 2 触摸屏的输入系统 173 6 3 3 S3C44B0X 触摸屏应用程序举例 173 158 6 6 人机交互接口人机交互接口设计设计 人机交互接口 是计算机和人机交互设备之间的交接界面 通过接口可以实现计算机与外设之间 的信息交换 人机交互设备是计算机系统中最基本的设备之一 是人和计算机之间建立联系 交换信 息的外部设备 常见的人机交互设备可分为输入设备和输出设备两类 人机接口是计算机同人机交互设备之间实现信息传输的控制电路 接口中要分别传送数据信息 命令信息和状态信息 数据信息 命令信息和状态信息都通过数据总线来传送 大多数计算机都把外 设的状态信息视为输入数据 而把命令信息看成输出数据 并在接口中分设各自相应的寄存器 赋以 不同的端口地址 各种信息分时地使用数据总线传送到各自的寄存器中去 在嵌入式系统中 目前常 见的人机接口设备有键盘 LCD 触摸屏等 6 1 键盘输入接口 在 ARM 嵌入式系统应用中 键盘是人机交互对话最通用的方法之一 操作者通过键盘向系统发送 各种指令或置入必要的数据信息 键盘模块设计的好坏 直接关系到系统的可靠性和稳定性 在 ARM 应用系统中 键盘扫描只是 ARM 的工作内容之一 ARM 在忙于各项工作任务的同时 如何 兼顾键盘的输入 则取决于键盘的工作方式 键盘工作方式的选取原则是既要保证能及时响应按键操 作 又要不过多占用 ARM 的工作时间 6 1 16 1 1 键盘工作原理键盘工作原理 通常的标准键盘是由许多按键开关组成的 按键开关电路是指通过外力使电路瞬时接通的开关 在许多场合都有应用 比如大多数处理器的 RESET 电路都用到了按键开关 它通过按键产生一个瞬时 的低电压 CPU 感知这个低电压后重启 在有些系统中也用按键开关切换工作模式 它通过按键开关 生成一个低压脉冲 产生一次中断 在中断处理程序中改变工作模式 并且通过置外部标志的方式告 知用户当前的工作模式 通过切换开关 就可以实现在不同工作模式之间进行切换 按键开关的电路 如图 6 1 所示 Vcc 至微处理器 图 6 1 按键开关电路示意图 当按键断开时 输出高电压 为逻辑 1 当按键按下时 电平输出点与地相连 输出低电平 为 逻辑 0 如图 6 1 所示的按键开关电路是最简单的 遗憾的是 它并不完善 因为它按下或者被释放时 并不能明确地产生一个逻辑 0 或者逻辑 1 由于按键是机械触点 当机械触点断开 闭合时 会产生 抖动 这种抖动对于用户来说是感觉不到的 但对计算机来说 则是完全可以感应的 计算机处理的速 度是在微秒级 而机械抖动的时间至少是毫秒级 这对计算机而言 已是一个 漫长 的时间了 假 如利用按键开关产生中断可能就会产生一个问题 就是说按键有时灵 有时不灵 其实就是这个原因 有可能只按了一次按键 可是计算机却已执行了多次中断的操作 159 为使 CPU 能正确地读出按键的状态 对每一次按键只作一次响应 就必须考虑如何去除抖动 常 用的去除抖动方法有软件方式和硬件方式两种 对于简单的按键电路 可以采用软件方法去除抖动 软件方法其实很简单 就是在程序获得外接 端口为低的信息后 不是立即认定按键已被按下 而是延时 10 毫秒或者更长一段时间后再次检测外部 端口 如果仍为低 说明按键的确按下了 这实际上是避开了按键按下时的抖动时间 同理 在检测 到按键释放后再延时 5 10 毫秒 消除后沿的抖动 然后再对键值处理 实践证明 不对按键释放的 后沿进行处理 通常也能满足一定的要求 但有时用软件方式并不能很好地解决按键抖动问题 例如按键开关连接的是中断请求线 程序是 不能读取中断请求线的状态的 这时就需要使用硬件方法 硬件方法其实就是一个去除抖动电路 用 于去除按下和释放按键时的波形抖动 这个电路也是比较简单的 读者可以查找相关去抖电路 对于 比较复杂的矩阵键盘而言 通常使用专用芯片去除抖动 例如键盘接口芯片 8279 MAX6816 MAX6817 MAX6818 等 6 1 26 1 2 常用键盘接口常用键盘接口 常用按键接口可分为独立式按键接口 行列式按键接口和专用芯片式按键接口等 具体采用哪种 方式 可根据所设计系统的实际情况而定 下面分别介绍这几种接口方式的优缺点及适用场合 1 独立式按键接口 独立式按键接口设计优点是电路配置灵活 软件实现简单 但缺点也很明显 每个按键需要占用 一根口线 若按键数量较多 资源浪费将比较严重 电路结构也变得复杂 因此本方法主要用于按键 较少或对操作速度要求较高的场合 软件实现时 可以采用中断方式 也可以采用查询方式 如图 6 2 所示 P1 1 P1 2 INT0 P1 0 微控制器 Vcc a 中断式 P1 1 P1 2 INT0 P1 0 微控制器 b 查询式 Vcc 这个函数为键盘中断服务 它读取来自键盘的相关信息 然后安排到当内核认为 bottom half 安全的时候让它运行 void irq handler int irq void dev id struct pt regs regs 这些变量是静态的 因为它们需要对 bottom half 可见 通过指针 static unsigned char scancode static struct tq struct task NULL 0 got char unsigned char status status inb 0 x64 读取键盘状态 scancode inb 0 x60 读取扫描码 if LINUX VERSION CODE KERNEL VERSION 2 2 0 安排 bottom half 运行 queue task else queue task irq endif mark bh IMMEDIATE BH 在这里假设驱动的加载还是采用模块化方式 初始化模块 登记 IRQ 句柄 int init module 由于原来键盘的句柄不能和本驱动程序共存 所以在启动本程序前不得不关闭它 释放它 的 IRQ 同时因为不知道它在哪儿 所以抢占以后没有办法恢复它 因此当本程序运行完后 计 算机将被重新启动 free irq 1 NULL 请求 IRQ 1 键盘的 IRQ 指向我们的 irq handler return request irq 1 PC 上的键盘的 IRQ 号 irq handler 我们的句柄 SA SHIRQ SA SHIRQ 意味着将这个 IRQ 指定为可以共享 SA INTERRUPT 能使句柄为一个快速中断 test keyboard irq handler NULL void cleanup module 清除 这段代码在此只是为了使驱动程序结构完整 它是完全不相关的 因为没有办法恢复被屏蔽 的系统自带键盘中断 因此计算机完全没用了 需要被重新启动 free irq 1 NULL 163 6 2 LCD 显示接口 在 ARM 嵌入式系统中 人机接口不但包括可以输入的键盘 还有用于传送信息给用户的输出设备 液晶显示器 LCD 具有显示信息多 质量高 无电磁辐射 可视面积大 应用范围广 画面效果好 数 字式接口 体积小 功耗低等特点 在基于微处理器的嵌入式系统终端显示 人机接口中受到普遍欢 迎 极大地提高了嵌入式系统的易用性和操作的直观性 本节将主要介绍 LCD 显示原理 LCD 分类及 LCD 驱动程序 6 2 16 2 1 LCDLCD 简介简介 1 显示原理 液晶显示器的显像原理 是将液晶置于两片导电玻璃之间 靠两个电极间电场的驱动 引起液晶 分子扭曲向列的电场效应 以控制光源透射或遮蔽功能 在电源开 关之间产生明暗而将影像显示出来 若加上彩色滤光片 则可显示彩色影像 在两片玻璃基板上装有配向膜 所以液晶会沿着沟槽配向 由于玻璃基板配向膜沟槽偏离 90 所以液晶分子成为扭转型 当玻璃基板没有加入电场时 光线透 过偏光板跟着液晶作 90 扭转 透过下方偏光板 液晶面板显示白色 当玻璃基板加入电场时 液晶 分子产生配列变化 光线通过液晶分子空隙维持原方向 被下方偏光板遮蔽 光线被吸收无法透出 液晶面板显示黑色 液晶显示器便是根据此电压有无 使面板达到显示效果 2 LCD 显示器的分类 按显示功能的强弱分类 LCD 可分为段位式 LCD 字符式 LCD 和点阵式 LCD 其中 段位式 LCD 和 字符式 LCD 只能用于字符和数字的简单显示 不能满足图形 曲线和汉字显示的要求 而点阵式 LCD 不仅可以显示字符 数字 还可以显示各种图形 曲线和汉字 并且可以实现屏幕上下左右滚动 动 画 分区开窗口 反转 闪烁等功能 用途十分广泛 按照液晶显示器的使用场合 其采用的显示模块还可以分为数显液晶模块 点阵式液晶字符模块 点阵图型液晶模块 下面将分别对这 3 类显示模块加以介绍 1 数显液晶模块 数显液晶模块是一种由段式液晶显示器件与专用的集成电路组装成一体的功能部件 只能显示数 字和一些标识符号 段式液晶显示器件大多应用在便携 袖珍设备上 由于这类设备体积小 所以尽 可能不将显示部分设计成单独的部件 即使一些应用领域需要单独的显示组件 也应该使其除具有显 示功能外 还应具有一些信息接收 处理 存储传递等功能 由于它们具有某些通用的 特定的功能 而广受市场的欢迎 常见的数显液晶显示模块具有计数 计时 计量等功能 2 点阵式液晶字符模块 点阵式液晶字符模块是由点阵式液晶显示器件和专用的行 列驱动器 控制器以及必要的连接器 件装配而成的 它可以显示数字和西文字符 这种点阵式字符模块有的本身带有字库 有字符发生器 具有显示容量大 功能丰富的特点 一般这种模块最少也可以显示 8 位 1 行或者 16 位 1 行以上的字符 这种模块的点阵排列是有 8 8 16 8 或 16 16 的一组一组像素点阵排列组成的 每组的像素组成 1 个字 每个字之间有一定的间隔 每行字之间也有一行的间隔 所以不能显示图形 一般在模块控制 驱动器内不仅具有已固化好字符字模的字符库 CGROM 还具有让用户自定义建 立专用字符的随机存储器 CGRAM 它允许用户建立自己的点阵字符 3 点阵式图形液晶模块 点阵图形液晶模块也是点阵模块的一种 其特点是点阵像素连续排列 行和列在排布中均没有空 隔 因此可以显示连续 完整的图形 由于它也是由 X Y 矩阵像素构成的 所以除显示图形外 也可 以显示字符 它又可以分为以下几类 1 行 列驱动型 行 列驱动型是一种必须外接专用控制器的模块 其模块只装配有通用的行 列驱动器 这种驱 动器实际上只有对像素的一般驱动输出端 而输入端一般只有 4 位以下的数据输入端 移位信号输入 164 端 锁存输入端 交流信号输入端等 如 HD44100 IID66100 等 此种模块必须外接控制电路 如 HD61830 SED1330 等才能与计算机连接 该种模块数量最多 应用最普遍 虽然需要采用自配控制器 但它也给客户留下了可以自行选择不同控制器的自由 2 行 列控制型 行列控制型是一种可直接与计算机接口 依靠计算机直接控制驱动器的模块 这类模块所用的列 驱动器具有 I O 总线数据接口 可以将模块直接挂在计算机的总线上 省去了专用控制器 因此对整 机系统降低成本有很大的好处 对于显示系统的像素数量不大 整机功能不是很复杂的系统非常适用 不过它会占用系统的部分资源 3 行列驱动 控制型 行列驱动 控制型是一种内藏控制器的点阵图形模块 也是比较受欢迎的一种类型 这种模块不 仅装有如第一类的行 列驱动器 而且也装配有如 T6963C 等的专用控制器 这种控制器是液晶驱动器 与计算机的接口 它以最简单的方式受控于计算机 接收并反馈计算机的各种信息 经过自己独立的 信息处理实现对显示缓冲区的管理 并向驱动器提供所需要的各种信号 脉冲 操纵驱动器实现模块 的显示功能 这种控制器具有自己的一套专用指令 并具有自己的字符发生器 CGROM 这就要求用户 必须熟悉这种控制器的详细说明书 才能进行操作 这种模块使用户摆脱了对控制器的设计 加工 制作等一系列工作 又使计算机避免了对显示器的繁琐控制 节约了主机系统的内部资源 3 显示汉字 一般西文为 8 8 点阵 因而显示一个西文字符只需要 8 个字节 而每一个汉字要占 4 个西文字体 因此显示一个汉字需要 32 个字节 汉字字库表为一张数据表 每个汉字在数据表中通常由 32 个字节 组成一个点阵图形 在应用时 连续取 32 个字节送到 LCD 的相应位置 就能正确显示汉字后的图形符 号 在嵌入式系统中 如果需要显示的汉字是固定的 并且字数较少 可以直接在软件的头文件中定 义汉字的显示点阵表格 要显示时 直接从表格变量数组中连续取出 32 个汉字送往 LCD 显示器即可 但是如果要显示的汉字字数很多 或者又不能确定要显示哪些汉字时 使用上述办法就相当麻烦了 这时应当使用汉字字库 有些 LCD 驱动器自带汉字字库 如果没有带 可以自己使用 ROM 扩展 通过 把汉字机内码送往字库文件 得到对应的显示点阵 6 2 26 2 2 在嵌入式在嵌入式 LinuxLinux 中驱动中驱动 LCDLCD 随着应用需求的推动 嵌入式 Linux 操作系统下也出现了许多图形界面软件包 如 MiniGUI Trolletech 公司的 Embedded QT 等 这些图形界面开发包与 WinCE 相似 在图形软件包的 开发和移植工作中都牵涉到底层 LCD 驱动的问题 在本节中将介绍有关在嵌入式 Linux 下实现 LCD 驱 动的相关知识 Linux 的设备管理是和文件系统紧密相关的 各种设备都以文件的形式存储在 dev 目录下 称为 设备文件 应用程序可以打开 关闭 读写这些设备文件 完成对设备的操作 就像对普通数据文件 操作一样 另外 Linux 把它所管理的设备分为字符设备和块设备 它们的区别在于系统为块设备提 供了缓冲机制 由于设计缓冲区的管理 调度和同步等问题 块设备的驱动要比字符设备复杂 Linux 把显示驱动也看作字符设备 把要显示的数据一个字节一个字节地送往 LCD 驱动器 Linux 为所有的设备文件都提供了统一的操作函数接口 方法是使用数据结构 struct file operations 这个数据结构中包括许多操作函数的指针 如 open close read write 等 但是 由于外设的种类繁多 操作方式也不一样 如声音设备驱动要使用 DMA 通道 显示设备要提供 对显存的操作 硬盘驱动要处理复杂的缓冲区结构等 如果 file operations 中的函数都是用驱动开 发人员来编写实现 其工作量相当大 而且对于每一类设备 它的许多操作也是相似的 许多数据结 构也是可以公用的 为了解决这个问题 Linux 采用了更高一层的封装方法 为同一类设备定义好了文件层次的 file operations 结构中的接口函数 在其中处理了大多数设备相关的操作 如各种缓冲区的申请和 释放等 而具体操作底层硬件的一小部分则留给驱动开发人员去实现 这样就大大减少了驱动程序开 165 发的难度 所以 Linux 提供了另外一个文件层到底层驱动的接口 通常为一个结构体 其中包含成员 变量和函数指针等 不同的设备驱动有着不同的数据结构 这样 一方面保证了文件层 I O 接口 file operations 的一致性 另一方面 驱动程序的开发人员也不用了解设备驱动太多的细节 只需 专注于硬件相关的 I O 操作即可 例如 一个具有代表性的声音设备 其文件层的 file operations 定义如下 struct file operations oss sound fops owner THIS MODULE llseek sound lseek read sound read write sound write poll sound poll ioctl sound ioctl mmap sound mmap open sound open release sound release 其中 sound read sound write 等句柄指向的函数 Linux 都已提供 处理了许多与声音设备相 关的操作 如 DMA 的申请 释放和操作等 而文件层到驱动程序的接口为 audio driver 结构 其中包 含底层操作函数 文件层的 sound read sound write 会在需要时调用 audio driver 中的函数 开发 人员只需要编写 audio driver 中的函数即可 这样就最大程度地减少了开发人员的工作量 Linux 为显示设备提供的帧缓冲驱动也采用这种 文件层 文件层 的方式 下面首先对帧缓冲 进行相应介绍 FrameBuffer 是出现在 Linux2 2 xx 及其以后版本内核当中的一种驱动程序接口 这种接口将显 示设备抽象为帧缓冲区 用户可以将它看成是显示内存的一个映像 将其映射到进程地址空间之后 就可以直接进行读写操作 而写操作可以立即地反映在屏幕上 帧缓冲设备对应的设备文件是 dev fb 如果系统有多个显卡 Linux 还支持多个帧缓冲设备 最多可以有 32 个 分别为 dev fb0 dev fb1 dev fb31 而 dev fb 则指向当前的帧缓冲设备 一般为 dev fb0 当然在嵌入式系统中一般只有一个帧缓冲设备 帧缓冲设备也属于字符设备 与声音设备一样 也采用 文件层 驱动层 的接口方式 在文件 层为之定义了数据结构 static struct file operations fb fops owner THIS MODULE read fb read 读操作 write fb write 写操作 ioctl fb ioctl I O 控制 mmap fb mmap 映射操作 open fb open 打开操作 release fb release 关闭操作 其成员函数都在 linux drivers vedio fbmem c 中定义 其中的函数对具体的硬件进行操作 对 寄存器进行设置 对显示缓冲进行映射 由于显示设备的特殊性 在驱动层的接口中不但要包括底层函数 还要有一些记录设备状态的数 据 Linux 为帧缓冲设备定义的驱动层接口为 struct fb info 结构 在 include linux fb h 中定义 166 这个数据结构记录了帧缓冲设备的全部信息 包括设备的设置参数 状态以及操作函数的指针等 每 个帧缓冲设备都必须对应一个 fb info 结构 其成员变量 modename 为设备名称 fontname 为显示字 体 fbops 为指向底层操作函数的指针 这些函数需要驱动开发人员根据硬件设备的具体特性编写 另外还有两个记录设备状态的数据结构 struct fb var screeninfo 和 struct fb fix screeninfo 它们分别记录可设置信息和不可设置的设备信息 如果要编写一个帧缓冲设备的驱动程序 所要做的主要工作包括 1 编写初始化函数 初始化函数首先初始化 LCD 控制器 通过写寄存器设置显示模式和显示颜色数 然后分配 LCD 显 示缓冲区 在 Linux 中可以用 kmalloc 函数分配一段连续的空间 缓冲区的大小为 点阵行数 点阵列数 用于表示一个像素的比特数 8 缓冲区通常分配在大容量的片外 SDRAM 中 起始地址保存在 LCD 控制寄存器中 然后 初始化一个 fb info 结构 填充其成员变量 并调用 register framebuffer int fb get var struct fb var screeninfo var int con struct fb info info int fb set fix struct fb var screeninfo var int con struct fb info info struct fb ops 在 include linux fb h 中定义 这些函数都是用来设置 获取 fb info 中的成员 变量的 当应用程序调用 ioctl 操作时会调用它们 通过 dev fb 对显示设备的操作主要有以下几种 1 读写 read write dev fb 相当于读写屏幕缓冲区 例如 cp dev fb temp 相当于把屏幕中的内容复制到一个 temp 文件中 而 cp temp dev fb 则把 temp 文件中的内容在屏幕上显示出来 2 映射 map 操作 由于 Linux 工作于保护模式 每个应用进程都有自己的虚拟地址空间 在应用程序中是不能直接 访问物理缓冲地址的 为此 Linux 在文件操作接口 file operations 中提供了 mmap 操作 可以将文 件的内容映射到用户空间 对于帧缓冲设备 则可通过映射操作 将屏幕缓冲区的物理地址映射到用 户空间的一段虚拟地址中 在 Clinux 中 没有 MMU 不存在虚拟地址 直接映射到实地址 之后用 户就可以通过读写这段地址访问屏幕缓冲区 在屏幕上绘图了 3 I O 控制 对于帧缓冲设备 通过对设备文件的 ioctl 调用可以读取 设置显示设备或者屏幕的参数 如分 辨率 显示颜色数 屏幕大小等 ioctl 的实现由底层驱动来完成 在应用程序中 操作 dev fb 的一般步骤如下 1 打开 dev fb 设备文件 2 用 ioctl 取得当前显示屏幕的参数 如屏幕的分辨率 每个像素的比特数等 根据屏幕参 数可以计算出屏幕缓冲区的大小 用于存储显示信息的有两个数据结构即 struct fb var screeninfo 和 struct fb fix screeninfo 其中第一个存储可以设置的显示信息 如显示深度 分辨率等 第二 个数据结构用于存储一些不可设置的显示信息 如屏幕缓冲区的物理地址 大小等信息 167 3 将屏幕缓冲区映射到用户空间 映射之后就可以直接对屏幕缓冲区进行读写 绘图和显示图 片了 典型应用程序如下 include main int fbfd 0 struct fb var screeninfo vinfo struct fb fix screeninfo finfo long int screensize 0 unsigned char fbp fbfd open dev fb0 O RDWR 打开设备文件 ioctl fbfd FBIOGET FSCREENINFO 取得屏幕相关参数 ioctl fbfd FBIOGET VSCREENINFO screensize vinfo xres vinfo yres vinfo bits per pixel 8 计算屏幕缓冲区的大小 映射屏幕缓冲区到用户地址空间 fbp unsigned char mmap 0 screensize PORT READ PORT WRITE MAP SHARED FBFD 0 下面可以通过 fbp 访问缓冲区 进行图形绘制 6 2 36 2 3 LCDLCD 接口电路接口电路 1 S3C4510B LCD 显示接口电路 LCD 显示模块选用北京精电蓬远 MDLS40466 显示模块 该显示模块的控制芯片为日立公司的 HD44780 模块接口信号定义如表 6 1 所示 表 6 1 MDLS40466 引脚信号定义 引脚号符号状态功能 1Vss电源地 2Vdd 5V 逻辑电源 3V0液晶驱动电源 4RS输入寄存器选择 1 数据 0 指令 5R W输入读 写操作选择 1 读 0 写 6E输入 使能信号 MDLS40466 未用 符号 NC 7DB0三态数据总线 LSB 8DB1三态数据总线 9DB2三态数据总线 10DB3三态数据总线 11DB4三态数据总线 12DB5三态数据总线 13DB6三态数据总线 14DB7三态数据总线 MSB 15E1输入MDLS40466 上两行使能信号 168 16E2输入MDLS40466 下两行使能信号 注 15 16 两管脚仅用于 MDLS40466 其余型号不用或为 LED 背光电源输入 关于该模块的具体工作原理与控制方法等更详细的内容 请参考相关用户手册 本系统中 LCD 模块与 S3C4510B 连接如图 6 4 所示 XDATA 0 7 DA 0 7 ADDR 0 1 AD 0 1 nRCS0CS 4510B LCD 图 6 4 LCD 模块与 S3C4510B 连接图 由于 S3C4510B 没有内置 LCD 控制器 当需要 LCD 显示的时候必须外接控制及驱动芯片 步骤繁琐 因此再介绍目前主流应用的 S3C44B0 这款芯片内置了 LCD 控制器 在外接 LCD 模块方面更为方便简 单 2 S3C44B0X 与 LCD 显示模块的接口 S3C44B0X 中有内置的 LCD 控制器 它的功能就是把显示缓存中的图像数据传输到外部 LCD 驱动电 路中 S3C44B0X 中内置的 LCD 控制器可支持灰度 LCD 和彩色 LCD 使用基于时间的抖动算法和帧速率控 制方法 可以支持单色 4 级灰度和 16 级灰度模式的灰度 LCD 在彩色 LCD 上 可以支持 256 级彩色 对于不同尺寸的 LCD 它们有不同数量的垂直和水平像素 数据接口的数据宽度 接口时间及刷新率 而 LCD 控制器可以通过编程来控制相应的寄存器值 以适应不同的 LCD 显示板 寄存器控制 DMA传送控制 信号产生电路 数据控制 VCLK VLINE VFRAME VM VD 3 0 VD 7 4 32 32 32 图 6 5 S3C44B0X 的 LCD 控制器逻辑图 图 6 5 为 S3C44B0X 中内置的 LCD 控制器逻辑框图 它用于传输显示数据并产生必要的控制信号 如 VFRAME VLINE VCLK 和 VM 以及显示数据的数据端口 VD 7 4 和 VD 3 0 LCD 控制器包含 REGBANK LCDCDMA VIDPRCS 和 TIMEGEN REGBANK 具有 18 个可编程寄存器 用 于配置 LCD 控制器 LCDCDMA 为专用 DMA 可以自动地将显示数据从帧内存传送到 LCD 驱动器中 通过 专用 DMA 可以在不需要 CPU 介入的情况下显示数据 VIDPRCS 从 LCDCDMA 接收不同格式的数据 以支 持常见的 LCD 驱动器所需要的不同接口时间和速率的要求 TIMEGEN 包含可编程的逻辑 产生 VFRAME VLINE VCLK 和 VM 等信号 表 6 2 给出了 LCD 控制器外部接口信号的含义 表 6 2 LCD 控制器外部接口信号 信号描述 169 VFRAME LCD 控制器和 LCD 驱动器之间的帧同步信号 它通知 LCD 新的一帧的显示 LCD 控制器在一个 完整帧显示后发出 VFRAME 信号 VLINE LCD 控制器和 LCD 驱动器之间的同步脉冲信号 LCD 取东西通过它来将水平线移位寄存器中的内 容显示到 LCD 屏上 LCD 控制器在一整行数据全部传输到 LCD 驱动器后发出 VLINE 信号 VCLK 此信号为 LCD 控制器和 LCD 驱动器之间的像素时钟信号 LCD 控制器在 VCLK 的上升沿发送数 据 LCD 驱动器在 VCLK 的下降沿采样数据 VM LCD 驱动器所使用的交流信号 LCD 驱动器使用 VM 信号通过交替翻转的行和列电压的极性来把 像素打开或关闭 VM 信号可以与每个帧同步 也可以与可变数量的 VLINE 信号同步 VD 3 0 LCD 像素数据输出端口 VD 7 4 LCD 像素数据输出端口 LCDCDMA 对应于先入先出 FIFO First Input First Output 寄存器 当 FIFO 变空或部分空的 时候 LCDCDMA 请求从帧内存中用突发传输模式预取数据 这种传输请求被内存控制器的总线仲裁器 接收时 就把 4 个连续的字从系统内存传输到内部 FIFO FIFO 由分别为 12 个字的 FIFOL 和 FIFOH 组 成 总长度为 24 个字 S3C44B0X 因为需要支持双扫描显示模式 所以有两个这样的 FIFO 但是在单 扫描模式下只用其中的一个 S3C44B0X 中内置的 LCD 控制器可通过一系列的寄存器进行控制 6 2 46 2 4 uClinuxuClinux 下开发下开发 LCDLCD 应用程序应用程序 uClinux 系统提供了 系列的图形界面接口函数 API 它们仿照 Win32API 的接口 使用户能够以 最短的时间熟悉并使用它们 API 的原型可以参考 HHARM44B0 EDU R1 uClinux appsrc gui graphic c 文件 在该文件中 对各个 API 给出了详细的定义和使用方法 可以调用 graphic c 中的函数 也可以有选择地将函数中的代码加到所需要的应用中 下面分析这些 API 是如何通过 LCD 驱动程序操作 LCD 的 1 打开 LCD 设备 LCD 设备的打开由 short initgraph void 函数完成 变量声明 unsigned char screen ptr static int screen fd 打开 LCD 函数 首先调用函数 screen fd open dev fb0 O RDWR 打开 fb0 设备 然后通过 ioctl 发送 FBIOGET VSCREENINFO 取得设备的相关参数 其中主要参数是屏的长 宽像素数 都是 160 每个像素用 1bit 表示 紧接着调用函数 mmap 取得指向 LCD 帧缓存内存的指针 screen ptr 以 后对 LCD 的操作就是对这个指针的操作 与对内存操作完全相同 例如清屏操作 memset screen ptr 0 160 160 8 Linux 中提供内存映像文件的机制来加速 I O 操作 普通的设备操作 read write 会通过内核缓存 读入或读出数据 内存映像文件的机制跳过内核缓存 加快了对 fb0 设备的访问 而且帧缓存被映射 到进程地址空间后 进程可以像访问普通内存一样对文件进行访问 不必再调用 read write 等 操作 mmap 系统调用形式如下 void mmap void addr size t len int port int flags int fd off t offset 参数 addr 指定文件应被映射到进程空间的起始地址 一般被指定一个空指针 此时选择起始地址 的任务留给内核来完成 函数的返回值为最后文件映射到进程空间的地址 进程可直接操作起始地址 为该值的有效地址 参数 1en 是映射到调用进程地址空间的字节数 它从被映射文件开头 offset 个字 节开始算起 参数 prot 指定共享内存的访问权限 可对以下几个值进行或运算 PROT READ 可读 170 PR0T WRITE 可写 PROT EXEC 可执行 PROT NONE 不可访问 参数 flags 由以下几个常值指定 MAP SHARED MAP PRIVATE MAP FIXED 其中 MAP SHARED 和 MAP PRIVATE 必选其一 而 MAP FIXED 则不推荐使用 参数 fd 为即将映射到进程空间的文件描述符 参数 offset 一般设为 0 表示从文件 头开始映射 关于 mmap 参数的进一步信息 读者可参考 mmap 手册 本程序中可以这样调用 mmap 取得指向 LCD 帧缓存内存的指针 screen ptr screen ptr mmap 0 screen height screen width 3 PORT READ PORT WRITE 0 screen fd 0 LCD 帧缓存的大小就是全屏显示所有像素所需字节数 由于每个像素由 1bit 表示 因此帧缓存的 大小等于像素数除以 8 2 关闭 LCD 设备 这一功能通过如下方法完成 void closegraph if screen fd 1 close screen fd 3 点的绘制 描点 setpixe 函数就是将二维 x y 坐标对应的帧缓存中某一位置 0 或置 1 函数代码如下 static short masktab 0 x80 0 x40 0 x20 0 x10 0 x08 0 x04 0 x02 0 x01 inline void setpixel short x short y short color if x screen width y screen height 参数有效性检测 return 操作系统的内存操作都是基于字节的 所以要计算 x y 对应的位首先要计算出 x y 对应的 字 节 还要根据 x 的后 3 位计算出要修改对应字节中的哪一位 short mask masktab x 计算出要描的点在帧缓存里对应的字节 将二维坐标映射到一维线性的内存中 unsigned char loc screen ptr y screen width x 3 根据 color 将帧缓存里 x y 对应的位置 0 或置 if co or loc mask else loc 4 图形 图片的显示 显示图形就是按照具体线 圆的函数计算出点 x y 的序列 再调用描点函数 setpixel 完成图形 的显示 显示图片的原理就是从图片文件中读取数据块到程序缓冲区中 然后用一个双重循环将程序 缓冲区中的数据逐行逐点调用 setpixel 函数写入帧缓存的相应位置 图片就会出现在 LCD 的相应区域 内 xbm 格式和 bmp 格式的文件中存放的都是描述一个长方形区域内像素颜色的数据 图形实现的函数可以参照函数 draw xish line line ellipse 等 复杂的图形函数调用简单的 图形函数来实现 图片实现的函数可以参照函数 draw xbm 和 draw bmp 等 5 文字的显示 本质上 字符 文字显示与图片是一样的 显示字符串的功能是由 void textout short x short y unsigned char buf 函数实现的 该函数逐个显示 buf 中的字符 一个英文字符对应屏 幕上一个 8 16 的像素点阵 一个汉字对应屏幕上一个 16 16 的像素点阵 这些描述字符点阵的数据 存放在 usr gui hanzi 字库文件中 约占 260KB 程序在初始化时打开该文件 textout 函数先判断 171 是中文还是英文字符 然后由字节的 ASCII 码作为字库文件的索引取出相应点阵 最后调用 draw bmp 函数显示这个点阵 如果连续两个字节的 ASCII 码都大于 160 即判断为双字节码中文字符 程序通 过语句 buf i 161 94 buf i 1 161 5 计算中文字符在字库中的位置 通过语句 buf i 4 计算英文字符在字库中的位置 textout 函数还对回车做了处理 具体实现参考 textout 函数 6 屏幕移动效果 屏幕的移动效果实际上就是对 LCD 帧缓存整块数据用 memmove 搬移的结果 V scroll screen 函 数实现了垂直移动 H scroll screen 函数实现了水平移动 垂直移动的函数实现如下 void V scroll screen short height short dir height 0 取得移动的方向 if dir height height 取得移动像素的绝对值 if height 3 height nCount screen width 3 screen height height if dir 屏幕向下移动 memmove screen ptr nBytes screen ptr nCount memset screen ptr 0 nBytes else 屏幕向上移动 memmove screen ptr screen ptr nBytes nCount memset screen ptr nCount 0 nBytes else clearscreen 水平移动与垂直移动原理类似 但是由于帧缓存字节排列与移动的方向正交 所以要逐行调用 memmove 移动 而且由于 height 可能不是 8 位的整倍数 要拆分字节 所以水平移动要比垂直移动复 杂 具体实现可以参照 H scroll screen 函数 6 3 触摸屏交互接口 触摸屏提供了一种简单 方便的人机交互方式 赋予了多媒体以崭新的面貌 在计算机和嵌入式 系统中都有非常广泛的应用 本节将首先讨论触摸屏的工作原理和特点 接着阐述触摸屏和液晶屏的 配合方法 并对 SIO 接口进行简要说明 然后通过一个实验来说明触摸屏在嵌入式系统的应用 在实 验中 详细介绍如何在 uClinux 下编写触摸屏应用程序 通过对手写输入程序的源代码进行分析和具 体实验来掌握对其工作原理和在嵌入式系统中的使用方法 6 3 16 3 1 触摸屏的基本原理触摸屏的基本原理 为了操作方便 人们用触摸屏来代替鼠标或键盘 使用时用手指或其他物体触摸安装在显示器前 端的触摸屏 然后系统根据手指触摸的图标或菜单位置来定位选择信息输入 触摸屏由触摸检测部件 172 和触摸屏控制器组成 前者安装在显示器屏幕前面 用于检测用户触摸的位置并将其送给后者 从而 将触摸点位置转换成坐标参数送给处理器 同时接收处理器发来的命令并执行 电阻式触摸屏是最常用的触摸屏类型 利用压力感应来进行控制 它的主要部分是一块与显示器 表面非常配合的电阻薄膜屏 这是一种多层的复合薄膜 它以一层玻璃或硬塑料平板作为基层 表面 涂有一层透明氧化金属 透明的导电电阻 导电层 上面再盖有一层外表面硬化处理 光滑防擦的塑料 层 它的内表面也涂有一层涂层 在它们之间有许多细小的 小于 1 1000 英寸 的透明隔离点把两层导 电层隔开绝缘 电阻式触摸屏剖面示意图如图 6 6 所示 可以把电阻式触摸屏看作是一种传感器 它将矩形区域中触摸点 X Y 的物理位置转换为代表 X 坐 标和 Y 坐标的电压 很多 LCD 模块都采用了电阻式触摸屏 这种屏幕可以用四线 五线 七线或八线 来产生屏幕偏置电压 同时读回触摸点的电压 触摸屏包含上下叠合的两个透明层 四线和八线触摸屏由两层具有相向表面电阻的透明阻性材料 构成 五线和七线触摸屏由一个阻性层和一个导电层构成 通常还要用一种弹性材料来将两层隔开 当触摸屏表面受到的压力 如通过笔尖或手指进行按压 足够大时 项层与底层之间会产生接触 所有 的电阻式触摸屏都采用分压器原理来产生代表 X 坐标和 Y 坐标的电压 如图 6 7 所示 分压器是通过 将两个电阻进行串联来实现的 电阻 R1 连接正参考电压 VREF 电阻 R2 接地 两个电阻连接点处的电 压测量值与电阻 R2 的阻值成正比 为了在电阻式触摸屏上的特定方向测量一个坐标 需要对阻性层加一个偏置 也就是将它的一边 接 VREF而另一边接地 同时 将未加偏置的那一层连接到一个模数转换器 ADC Analog to Digital Converter 的高阻抗输入端 当触摸屏上的压力使两层之间发生接触时 电阻性表面被分隔为两个电 阻 它们的阻值与触摸点到偏置边缘的距离成正比 触摸点与接地边之间的电阻相当于分压器中下面 的那个电阻 因此在未加偏置的层上测得的电压与触摸点到接地边之间的距离成正比 触笔或手指 柔软塑料片 绝缘支点 透明隔离点 玻璃罩 金属涂层 R1 R2 REF V MEAS V REFMEAS VV 21 2 RR R 图 6 6 电阻式触摸屏剖面示意图图 6 7 等效电路分压器电路 四线触摸屏包含两个阻性层 其中一层在屏幕的左右边缘各有一条垂直总线 另一层在屏幕的上 下边缘各有一条水平总线 如图 6 8 所示 为了在 X 轴方向进行测量 将左侧总线偏置接到 0V 右侧 总线偏置接到 VREF 将上侧或下侧总线连接到 ADC 当顶层和底层相接触时即可进行一次测量 为了在 Y 轴方向进行测量 将上侧总线偏置接到 VREF 下侧总线偏置接到 0V 将 ADC 输入端接左侧总线或右 侧总线 当上层与下层相接触时即可对电压进行测量 对于四线触摸屏 最理想的连接方法是将偏置 为 VREF的总线接 ADC 的正参考输入端 而将设置为 0V 的总线接 ADC 的负参考输入端 图 6 9 给出了四 线触摸屏的等效电路 173 X X X层Y层 Y Y X Y层 X层 Y X Y Y Y X X VMEAS VREF Y Y VREF X X VMEAS 图 6 8 四线触摸屏 图 6 9 四线触摸屏等效电路 五线触摸屏使用了一个阻性层和一个导电层 导电层有一个触点 通常在其一侧的边缘位置 而 阻性层的 4 个角上各有一个触点 为了在 X 轴方向进行测量 将左上角和左下角偏置接 VREF 右上角 和右下角接地 由于左 右角为同一电压 其效果与连接左 右侧的总线差不多 类似于四线触摸屏 中采用的方法 为了在 Y 轴方向进行测量 将左上角和右上角的偏置接到 VREF 左下角和右下角的偏 置接到 0V 由于上 下角分别为同一电压 其效果与连接顶层和底层边缘的总线大致相同 也类似于 在四线触摸屏中采用的方法 这种测量算法的优点在于它使左上角和右下角的电压保持不变 但如果 采用栅格坐标 X 轴和 Y 轴需要反向 对于五线触摸屏 最佳的连接方法是将左上角 偏置为 VREF 接 ADC 的正参考输入端 而将左下角 偏置为 0V 接 ADC 的负参考输入端 6 3 26 3 2 触摸屏触摸屏的输入系统的输入系统 触摸屏输入系统由触摸屏 触摸屏控制器和微控制器 3 部分组成 图 6 10 给出了一个实际的触摸 屏输入系统的组成 其中 触摸屏采用四线电阻式 控制器采用 ADS7846 芯片 该芯片的主要功能是 分时向 X Y 电极对施加电压 并把测量电极上的电压信号转换为相应触摸点的 X Y 坐标 X Y X Y PENIRO CS DCLK DOUT DIN SS MSCK MISO MOSI INT0 微控制器触摸屏控制器触摸屏 X电极 Y电极 X电极 Y电极 图 6 10 触摸屏输入系统的组成 ADS7846 内部有一个由多个模拟开关组成的供电 测量电路网络和 12 位的 ADC 其功能框图如 图 6 11 所示 ADS7846 根据微控制器发来的不同测量命令导通不同的模拟开关 以便向触摸屏电极对 提供电压 并把相应测量电极上的触点坐标位置所对应的电压
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 子宫内膜异位症多组学分子诊断方法-洞察及研究
- 纳秒级表面检测技术-洞察及研究
- 建筑材料创新-洞察及研究
- 2025年光伏组件效率提升技术在国际光伏市场的应用前景报告
- 战略咨询项目工作方案
- 精准医疗在动静脉瘘中的应用-洞察及研究
- 墙绘工程施工方案
- 铜陵科技展馆施工方案
- 海洋生态系统服务评估-第1篇-洞察及研究
- 安全大培训考试题库及答案解析
- 2025春 新人教版美术小学一年级下册致敬平凡
- 危险废物分析制度
- 换药室工作制度
- 水资源开发与保护联合协议
- 受托代理投标合同
- 《急性心肌梗死急诊》课件
- 2025年保洁员(高级)理论考试题(附答案)
- 中心幼儿园第三季度意识形态分析研判报告-
- 广东省六校2025届高三第二次联考数学试卷含解析
- 2022年199管综真题及答案解析版
- 2025届高考作文素材积累:高中五册课本素材及运用
评论
0/150
提交评论