电子科技大学微机实验报告(含思考题)河畔下的哈】实验6_第1页
电子科技大学微机实验报告(含思考题)河畔下的哈】实验6_第2页
电子科技大学微机实验报告(含思考题)河畔下的哈】实验6_第3页
电子科技大学微机实验报告(含思考题)河畔下的哈】实验6_第4页
电子科技大学微机实验报告(含思考题)河畔下的哈】实验6_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 实验六 基于ARM的键盘及数码管驱动实验 1.掌握键盘及数码管驱动原理。 2.掌握ZLG7290芯片的使用方法。 3.掌握I2C总线的协议标准。 4.掌握Linux下键盘驱动的实现方法。 编写测试程序控制键盘和数码管。 1.了解ARM9处理器结构 2.了解i2c协议 硬件:ARM嵌入式开发平台,PC 机Pentium100 以上。 软件:PC机Linux操作系统MINICOM AMRLINUX开发环境 1、ZLG7290寄存器介绍 ZLG7290内部有16个8bits寄存器,访问这些寄存器需要通过I2C 总线接口来实现.访问内部寄存器要通过“I2C总线地址+子地址”的方式来实现。ZLG729

2、0B 的I2C 总线器件地址是70H(写操作)和71H(读操作)。 ? 键值寄存器Key(地址:01H) 如果某个普通键(K1K56)被按下,则微控制器可以从键值寄存器Key中读取相应的键值156。如果微控制器发现ZLG7290 的INT 引脚产生了中断请求,而从Key 中读到的键值是0,则表示按下的可能是功能键。键值寄存器Key 的值在被读走后自动变成0。 ? 显示缓冲区DpRam0DpRam7(地址:10H17H) DpRam0DpRam7 这8 个寄存器的取值直接对应8个数码管的显示内容。每个寄存器的8 个位分别对应数码管的a,b,c,d,e,f,dp 段,MSB 对应a,LSB 对应d

3、p。例如大写字母H 的字型数据为6EH(不带小数点)或6FH(带小数点)。 ? 命令缓冲区CmdBuf0 和CmdBuf1(地址:07H 和08H) 通过向命令缓冲区写入相关的控制命令可以实现段寻址、下载显示数据、控制闪烁等功能。 2、ZLG7290控制命令介绍 寄存器CmdBuf0(地址:07H)和CmdBuf1(地址:08H)共同组成命令缓冲区。通过向命令缓冲区写入相关的控制命令可以实现段寻址、下载显示数据、控制闪烁等功能。 ? 下载数据并译码(Download) 在指令格式中,高4 位的0110 是命令字段;A3A2A1A0 是数码管显示数据的位地址(其中A3 留作以后扩展之用,实际使用

4、时取0 即可),位地址编号依次为0,1,2,3,4,5,6,7,代表8个数码管,dp 控制小数点是否点亮,0点亮,1熄灭;flash 表示是否要闪烁,0正常显示,1闪烁;d4d3d2d1d0 是要显示的数据,包括10 种数字和21 种字母。 ? 闪烁控制(Flash) 在命令格式中,高4 位的0111 是命令字段;xxxx 表示无关位,通常取值0000;第2 字节的Fn(n07)控制数码管相应位的闪烁属性,0正常显示,1闪烁。复位后,所有位都不闪烁。 3、 Linux下i2c驱动接口函数介绍 Linux为我们提供了一系列的接口函数,通过调用这些函数可以很方便的访问到我们的I2C设备,达到对它的

5、操作和控制。在本实验中,就是通过调用这些函数,完成对zlg7290内部寄存器的配置,从而驱动键盘和数码管按照我们需要的方式工作 ? 打开设备: 在linux下编程实现对具体设备的操作,首先要做的就是打开要操作的设备文件,zlg7290设备的设备文件是“/dev/zlg7290/0”。 具体实现函数是: fd=open(“/dev/zlg7290/0”,O_RDWR) ? 向设备写数据: 具体实现过程是先写入要配置的寄存器的地址,然后写入要配置的值,具体实现函数是: unsigned char temp2; /定义一个数组用于存放要发送的数据,包括寄存器地址和要写入该寄存器内的值 temp0=a

6、ddress; /将要配置的寄存器的地址address写入temp0中。 temp1=data; /将要写入该寄存器中 的值data写入/temp1中。 write(fd,temp,2); /用write函数向设备写入数据temp,首先写入地址address,然后写入值data。 配置一般的寄存器都是这个步骤,但是唯一例外的是配置命令寄存器cmdbuf0和cmdbuf1,因为写入命令寄存器中的命令码均为16bit,因此需要通过两步完成对命令码的发送,具体实现代码如下: unsigned char temp3; temp0=address; temp1=cmd1; /要写入的命令码的高八位 te

7、mp2=cmd2; /要写入的命令码的低八位 write(fd,temp,3); ? 关闭设备: close(fd); 1. 在数码管上显示数据有两种方法,一种方法是直接向8个数据缓冲区DpRam0DpRam7写入数据分别控制每个数码管的8个独立led的亮灭,使其显示不同的数据。 2. 在数码管上显示数据的另一种方法是直接向命令寄存器cmdbuf0或cmdbuf1写入“下载数据并译码”命令,直接控制数码管的显示内容,具体译码规则如表一所示。 3. 当某个按键被按下时,可以通过读取“键值寄存器Key(地址:01H)”的值来得到键值,将所按键的键值显示在数码管上。 4. zlg7290提供数码管的

8、闪烁功能,通过向命令寄存器发送闪烁控制命令可以控制某个数码管闪烁。通过按键控制数码管的闪烁,具体功能是当按下键盘1-4时,控制数码管1-4闪烁。 5 打开一个终端1,将四个源文件交叉编译成arm下的可执行文件example1-example4(具体参见实验五一些步骤) 6 重新打开一个终端2,输入命令minicom进入ARM开发板的命令行界面,检查硬件是否连接好后,上电开发板,进入ARM-linux操作系统的命令行。 7 在终端2的ARM-linux操作系统的命令行下依次运行example1-example4可执行程序,观察结果。 步骤1程序: #include <stdio.h>

9、 #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" #define ZLG7290_ADDR_DpRam0 0x10 int fd; void zlg7290_disp(unsigned char *buf, unsigned char num); int main() int ret,i; unsigned char buf8; fd = open("/dev/zlg7290/0", O_RDWR); if(

10、fd = -1) printf("Can't open I2C device!n"); exit(-1); buf7 = 0xe0; buf6 = 0xbe; buf5 = 0xb6; buf4 = 0x66; buf3 = 0xf2; buf2 = 0xda; buf1 = 0x60; buf0 = 0xfc; zlg7290_disp(buf, 8); close(fd); return 0; /* * Function name: zlg7290_disp * Descriptions: control zlg7290 to driver led * * In

11、put: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num) unsigned char i; unsigned char temp2; for(i=0;i<num;i+) temp0 = ZLG7290_ADDR_DpRam0+i; temp1 = *buf; write(fd, temp, 2); buf+; usleep(5000); /* * En

12、d Of File */ 步骤2程序: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" #define ZLG7290_ADDR_cmdbuf0 0x07 int fd; void zlg7290_disp(unsigned char *buf, unsigned char num); int main() int ret,i; unsigned char buf8; fd =

13、open("/dev/zlg7290/0", O_RDWR); if(fd = -1) printf("Can't open I2C device!n"); exit(-1); buf7 = 0x07; buf6 = 0x06; buf5 = 0x05; buf4 = 0x04; buf3 = 0x03; buf2 = 0x02; buf1 = 0x01; buf0 = 0x00; zlg7290_disp(buf, 8); close(fd); return 0; /* * Function name: zlg7290_disp * Descr

14、iptions: control zlg7290 to driver led * * Input: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num) unsigned char i; unsigned char temp2; for(i=0;i<num;i+) temp0 = ZLG7290_ADDR_cmdbuf0; temp1 = 0x60+i; t

15、emp2 = *buf; buf+; write(fd, temp, 3); usleep(5000); /* * End Of File */ 步骤3程序: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> /#include "i2c.h" int fd; int zlg7290_getkey(char *key); void zlg7290_disp(unsigned char *buf, unsigned c

16、har num); int main() int ret,i; unsigned char buf9; char key; fd = open("/dev/zlg7290/0", O_RDWR); if(fd = -1) printf("Can't open I2C device!n"); exit(-1); zlg7290_disp(buf, 8); for (;) if (zlg7290_getkey(&key) != 0) printf("Read key value failn"); exit(-1); buf

17、0=key%10; buf1=key/10; zlg7290_disp(buf, 2); usleep(1000000); close(fd); return 0; /* * Function name: zlg7290_getkey * Descriptions: get the key value from zlg7290 * * Input: unsigned short *key: the gotten key value * Output: 0 : OK -1: fail */ int zlg7290_getkey(char *key) unsigned char temp2; te

18、mp0 = 1; temp1 = 0; if (write(fd, temp, 1) != 1) return -1; if (read(fd, temp, 2) != 2) return -1; *key = temp0 + (temp1 * 256); return 0; /* * Function name: zlg7290_disp * Descriptions: control zlg7290 to driver led * 鎺埗zlg7290椹卞姩led * Input: unsigned char *buf: display buffer unsigned char num: display number * Output: NULL */ void zlg7290_disp(unsigned char *buf, unsigned char num)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论