实验一数码管显示_第1页
实验一数码管显示_第2页
实验一数码管显示_第3页
实验一数码管显示_第4页
实验一数码管显示_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式系统实验报告指导教师:学科专业:班级:学号:姓名:2014年6月从20世纪七十年代单片机的出现到各式各样的嵌入式微处理器,微控制器 的大规模应用,嵌入式系统已经有了近 30年的发展历史,并在全世界各行业得 到广泛应用。嵌入式系统产品的研制和应用已经成为我国信息化带动工业化、工业化促进信息化发展的新的国民经济增长点。 经过几十年的发展,嵌入式系统已 经在很大程度改变了人们的生活、工作和娱乐方式,而且这些改变还在加速。嵌 入式系统具有无数的种类,每类都具有自己独特的个性。例如,MP3、数码相机与打印机就有很大的不同。汽车中更是具有多个嵌入式系统,使汽车更轻快、更 干净、更容易驾驶,机顶盒、高

2、清电视、游戏机、智能玩具、交换机、路由器、 数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等等,都 是典型的嵌入式系统。事实上,几乎所有带有一点 智能”的家电(全自动洗衣机、 电脑电饭煲)都是嵌入式系统。嵌入式系统广泛的适应能力和多样性, 使得视 听、工作场所甚至健身设备中到处都有嵌入式系统。高端的嵌入式系统和工业软件的发展,实际上与我们对该行业最先进的科学技术前沿的掌握有关,换言之,与我国该行业的科学技术水平有关。 学习和研 究嵌入式系统,具有重大意义。这学期的嵌入式系统的学习过程中我们在 2410RP这一实验开发平台上进行 了诸多嵌入式的基础实验。在本报告中,将把其中两个具

3、有代表性的实验的原理、 内容、结果以及驱动和测试程序写出来。3 / 22.实验一数码管显示11.1实验目的11.2实验内容11.3实验原理11.3.1 LED的发光原理11.3.2八段LED显示器 11.3.3芯片zlg7289A 的介绍 21.3.4数码管的连接电路 31.4实验步骤31.5实验源代码解释与说明 41.6总结11实验二 LED点阵驱动实验 122.1实验目的122.2实验内容122.3实验原理122.3.1 8X8点阵数码管发光原理 122.3.2数码管的连接电路 122.3.3 I/O 接口 132.4实验步骤132.5实验源代码解释与说明 142.6实验结果192.7总结

4、19实验一数码管显示1.1实验目的学习串并转换的相关知识,并编写驱动程序。1.2实验内容1)了解数码管显示的工作原理;2)掌握数码管驱动的编写及测试过程;3)对zlg7289A的驱动程序进行编写;4)驱动数码管并显示个人学号。1.3实验原理1.3.1 LED的发光原理LED( Light Emitting Diode),即发光二极管。是一种半导体固体发光器件。 它是利用固体半导体置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。发光二极管的核心部分是由p型半导体和n型半导体组成的晶片,如图所 示,在p型半导体和n型半导体之间有一个过渡层,称为 p-

5、n结。在某些半导体 材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的 形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管, 通称LED。当它处于正向工作状态时(即两端加上正向电压),电流从LED阳 极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电 流有关。导带发光图1-1 LED发光原理图1.3.2八段LED显示器八段LED显示器由8个发光二极管组成,如图1-2、图1-3所示。基中7个长条形的发光管排列成日”字形,另一个贺点形的发光管在显示器的右下角作为 显示小数

6、点用,它能显示各种数字及部份英文字母。LED显示器有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器。共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当二极管 导通时,相应的笔划段发亮,由发亮的笔划段组合而显示的各种字符。8个笔划段hgfedcba对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 DO ,于是用8位 二进制码就可以表示欲显示字符的字形代码。例如,对于共阴LED显示器,当共阴极接地(为零电平),而阳极hgfedcba各段为0111011时,显示器显示P 字

7、符,即对于共阴极LED显示器,“P字符的字形码是73H。如果是共阳LED 显示器,共阳极接高电平,显示 “P”符的字形代码应为10001100( 8CH)。这里 必须注意的是:很多产品为方便接线,常不按规则的方法去对应字段与位的关系, 这时字形码就必须根据接线来自行设计了。CUM图1-2 LED数码管组成图W 呻 学 邮11 砂图1-3 LED数码管原理图1.3.3芯片zlg7289A的介绍zlg7289A是一片具有串行接口的可同时驱动 8位共阴式数码管或64只独立 LED的智能显示驱动芯片该芯片同时还可连接多达64键的键盘矩阵单片即可完成LED显示、键盘接口的全部功能。zlg7289A内部含

8、有译码器可直接接受 BCD码或16进制码并同时具有2种译码方式参看后文此外还具有多种控制指令 如消隐、闪烁、左移、右移、段寻址等zlg7289A具有片选信号可方便地实现多于8位的显示或多于64键的键盘接口。芯片zlg7289A的典型应用:仪器仪表、工业控制器、条形显示器、控制面板。芯片zlg7289A的特点:1)串行接口无需外围元件可直接驱动 LED ;2)各位独立控制译码/不译码及消隐和闪烁属性;3)循环左移/循环右移指令;4)具有段寻址指令方便控制独立LED ;5)64键键盘控制器内含去抖动电路。1.3.4数码管的连接电路图1-4数码管连接电路31:丘雹1肛1.4实验步骤1)连接号宿主PC

9、机与一台S3C2410-RP目标板;2)编写数码管驱动程序spi_led.c文件;3)启动系统终端设置S3C2410-RP目标板的地址;4)将宿主PC机的根目录挂载到S3C2410-RP目标板的mnt目录下;5)加载驱动程序;6)执行并测试程序。1.5实验源代码解释与说明A.头文件 keypad.h#ifndef _KEYPAD_H_#defi ne _KEYPAD_H_/Keypad扫描码#defi ne KEYPADNUMLK0x33#defi ne KEYPADDIV0x34#defi ne KEYPADMUL0x35#defi ne KEYPADSUB0x3d#defi ne KEYP

10、ADADD0x2e#defi ne KEYPADENTER0x1e#defi ne KEYPADDOT0x15/DEL#defi ne KEYPAD00x14/INS#defi ne KEYPAD10x1b/END#defi ne KEYPAD20x1c/DOWN#defi ne KEYPAD30x1d/PDN#defi ne KEYPAD40x23/LEFT#defi ne KEYPAD50x24#defi ne KEYPAD60x25/RIGHT#defi ne KEYPAD70x2b/HOME#defi ne KEYPAD80x2c/UP#defi ne KEYPAD90x2d/PUP#

11、en dif头文件定义了嵌入式开发板上输入键盘各个按键的逻辑地址。/config.h内核配置头文件/kernel.h定义了经常用到的函数原型及宏定义/module.h定义了内核模块相关的函数、变量及宏 /sched.h为调度程序头文件,定义了任务结构 /interrupt.h中包含了与操作系统中断相关的大/init.h中定义了驱动的初始化和退出相关的函数B.驱动程序源文件spi_led.c#include #i nclude #i nclude #in clude #in clude 部分宏及struct结构的定义#i nclude #i nclude #in clude #i nclude

12、#i nclude 本检查#in clude /version.h里定义了 Linux内核的版本,用于版/I/O头文件,定义对I/O端口操作的函数#i nclude #i nclude /访问系统硬件的头文件/#include #in clude #in clude #in clude #i nclude #in clude #include #i nclude #in clude #in clude #i nclude 自旋锁,防止多处理器并发/miscdevice结构体成员变量设备#in clude #i nclude #include #in clude #i nclude #in cl

13、ude #in clude 程内存地址的函数定义/包含copy_to_user、copy_from_user等内核访问用户进#i nclude 系统头文件,定义了设置或修改描述符/中断门等的嵌入式汇编宏/ #define HR DEBUG 1/#defi ne IRQ_spi_ledNT IRQ_EINT4#defi ne GPIO_SimplelNT_EINT4| GPIO_F4)#defi ne ONEBIT 0x1#defi ne KEYPADCSDIS#defi ne KEYPADCSEN#defi ne KEYPADDIRMO#defi ne KEYPADDIRMI(GPIO_MOD

14、E_ALTO | GPIO_PULLUP_EN(GPGDAT |=(ONEBIT 3)(GPGDAT &=( ONEBIT 3)(GPBDAT &=( ONEBIT 0)(GPBDAT |=(ONEBIT 0)#define spi_led_MAJOR 104/定义 led_ary_MAJOR 设备的主设备号devfs_handle_t spi_led_handle; /系统支持 devfs 的数据结构 int spi_led_temp_cou nt=O;定义的系统全局变量,防止文件被多重打开static int DELAY_TIME=100;时间延迟为 100int putcToKBCTL(

15、u8 c)u32 i;KEYPADCSEN;KEYPADDIRMO;udelay(60);while(SPSTA1 & ONEBIT)=0);/ wait while busySPTDAT1 = c;/ write left justified datawhile(SPSTA1 & ONEBIT)=0);/ wait while busyKEYPADCSDIS;i = SPRDAT1;return(i);/功能概要:将所给数据写入指定的寄存器中int spi_ledI nit()int t;char dummy = (char)0xff;prin tk(GPGCON=%xn,GPGCON);G

16、PGCON &= (0x3vv6)|(0x310)|(0x3vv12)|(0x3vv14);GPGCON |= (0x1vv6)|(0x37289GPBCON &= (0x3 0);/ 清除 GPB0 端口数据GPBCON |= (ONEBIT 0);/设置端口 GPB0用于_PWR_OK 信号输出/ rGPDDAT &=(ONEBIT 0);/ 将 _PWR_OK t 置 0KEYPADDIRMO;设置SPI (串行外设接口)寄存器/中断模式,可用分频,主模式,高电平时钟,形式B,正常模式/rSPCON1=(ONEBITvv5)|(ONEBITv4)|(ONEBITvv3)|(OxOvv2)

17、|(ONEBITvv1);/查询模式,可用分频,主模式,高电平时钟,形式A,正常模式SPCON1 = (Ov5)|(ONEBITvv4)|(ONEBITvv3)|(OxOvv2)|(Ovv1);/*开发者必须根据PCLK时钟的变化正确地调节分频器的值*/SPPRE1 = 255;/* 99.121K = 203M/4/2/(255+1) PCLK=50.75MhzFCLK=203Mhz SPICLK=99.121Khz*/传送初始化指令显示键盘初始化成功第一个数码管的地址为0xc8设置第一个数码管显示的数值为1第二个数码管的地址为0xc9设置第二个数码管显示的数值为2第三个数码管的地址为Oxc

18、a设置第三个数码管显示的数值为9/第三个数码管的地址为Oxcb设置第三个数码管显示的数值为0putcToKBCTL(Oxbf);prin tk(Key Pad In it complete:n); putcToKBCTL(0xc8); putcToKBCTL(0x01);KEYPADCSDIS;putcToKBCTL(0xc9); putcToKBCTL(0x02); KEYPADCSDIS;putcToKBCTL(Oxca); putcToKBCTL(0x09); KEYPADCSDIS;putcToKBCTL(Oxcb); putcToKBCTL(OxOO);KEYPADCSDIS;ret

19、urn(1); /函数实现LED数码管的初始化,返回值为 u8 readKBValue(void)un sig ned char i;KEYPADCSEN;KEYPADDIRMO;udelay(60);while(SPSTA1 & ONEBIT)=O);1时,则完成系统初始化/ wait while busy/传送读取键值的命令SPTDAT1 = 0x15;/ wait while busy/传送读取键值的命令/ wait while busywhile(SPSTA1 & ONEBIT)=0); udelay(30);/delay 30us KEYPADDIRMI;SPTDAT1 = 0xff

20、; while(SPSTA1 & ONEBIT)=0); i = SPRDAT1;/ printk(%xn,i);KEYPADCSDIS;KEYPADDIRMO;return(i);/函数实现的主要功能为读取键盘输入的值。ssize_t spi_led_read (struct file * * buf, size_t count, loff_t * f_ops) retur n count;函数返回:读取数据的长度cou nt。/功能概要:对字符性设备进行读操作/*= SimpleDWrite =*/ssize_t spi_led_write (struct file * char * bu

21、f, size_t coun t, loff_t * f_ops) printk(s3c2410: device operation!n);retur n count;函数返回:写入数据的长度cou nt。/功能概要:对字符性设备进行写入操作/*= SimpleD Ioctl =*/ ssize_t spi_led_ioctl (struct inode * inode ,struct file * file,un sig ned int cmd, l ong data)prin tk(s3c2410: device ioctl operatio n!n); /函数可重新定义用来I/O 口的其

22、他控制操作 /*= SimpleD device ope n =*/ ssize_t spi_led_open (struct inode * inode ,struct file * file) return 0; /当用户态调用函数时,对应内核态次函数被调用/*= SimpleD device close =*/ ssize_t spi_led_release (struct inode * inode ,struct file * file) return 0;/定义内核态release函数,当用户态调用close函数时,release函数被调用 struct spi_led_ops =

23、ope n:spi_led_ope n,read:spi_led_read,write:spi_led_write,ioctl:spied_ioctl,release: spi_led_release,;结构体在头文件linux/fs.h中定义,用来存储驱动内核模块提供的对设备进 行各种操作的函数的指针static void IRQ_spi_led_i nterrupt(i nt nr, void *devid, struct pt_regs *regs)u8 ui8Sca nCode;ui8Sca nCode=readKBValue();HR_del_pre_sca ncode(ui8Sca

24、 nCode);定义静态函数IRQ_spiednterrupt,请求中断static int _init HW_spiedn it(void)in t ret = -ENODEV;int delay ;set_external_irq(IRQ_spi_ledN T,EXT_FALLING_EDGE,GPIO_PULLUP_EN);set_gpio_ctrl(GPIO_SimplelNT_EINT4);ret = request_irq(IRQ_spi_ledN T, IRQ_spi_ledn terrupt, SA_INTERRUPT,spi_led, NULL);if (ret) print

25、k(KERN_INFO request SimpleINT IRQ failed (%d)n,IRQ_spi_led_INT);return ret;ret = devfs_register_chrdev(spied_MAJOR, spi_led, &spi_led_ops);if( ret 1:4i ta/:wTeJ罚刃T.I4233 I/O 接口在本开发板上,整个LED显示模块是作为一个I/O进行控制的。如电路原 理图2-2所示,DATA0.7、DATA8.15分别对应系统数据线的低16位,LED_LOCK信号是由系统总线的写信号和地址信号经简单的逻辑组合而得,在 板载的CPLD内完成,控

26、制该显示模块的I/O地址为0x08000000b2.4实验步骤1)连接号宿主PC机与一台S3C2410-RP目标板;2)编写LED点阵驱动程序;3)编写LED点阵显示测试程序test.c,并编译;4)启动Linux系统终端并设置S3C2410-RP目标板的地址;5)将宿主PC机的根目录挂载到S3C2410-RP目标板的mnt目录下;6)加载LED点阵驱动程序;7)执行并测试程序。2.5实验源代码解释与说明A.驱动程序源文件led_ary.c#include /config.h为内核配置头文件,文件里面指向另一个由 make menuconfig自动生成的文件 autoconf.h#i nclu

27、de /kernel.h定义了经常用到的函数原型及宏定义#i nclude /module.h模块驱动程序的头文件,定义了内核模块相关的函数、变量及宏#in clude /sched.h为调度程序头文件,定义了任务结构#in clude /interrupt.h中包含了与操作系统中断相关的大部分宏及struct结构的定义#i nclude #i nclude /init.h中定义了驱动的初始化和退出相关的函数#in clude /* for udelay */#i nclude #i nclude /定义了 Linux内核的版本,用于版本检查#in clude #include /I/O头文件

28、,定义对I/O端口操作的函数#include 访问系统硬件用的头文件#in clude #define led_ary_MAJOR 102 /定义了 led_ary_MAJOR 设备的主设备号为 102#defi ne VERSION2410RP-led_ary-V1.00-070820un sig ned long ioremap_addr;void showversi on(v oid) printk(*n);printk(t %s tn, VERSION);printk(*nn);函数用于显示该设备的版本型号devfs_ha ndle_t dev_ha ndle;/系统支持devfs的数

29、据结构,注册han die到存储设备上。int led_ary_temp_cou nt=O;/定义的系统变量,防止文件被多重打开。ssize_t led_ary_read (struct file * * buf, size_t count, loff_t * f_ops)char tmp1;printk(s3c2410: device operation!n);tmp0=i nb(ioremap_addr);copy_to_user(buf,tmp,1);retur n count;函数实现对字符型设备进行读取操作ssize_t led_ary_write (struct file * ch

30、ar * buf, size_t coun t, loff_t * f_ops)outw(co un t,ioremap_addr);printk(s3c2410: device write operation!n);retur n count;函数实现对字符性设备进行写操作上述两个函数实现了用户空间和内核空间的数据交换,而且还可以检查用户空 间指针的有效性ioctl()函数,可实现读写之外的控制。ssize_t led_ary_ioctl (struct inode * inode ,struct file * file,un sig ned int cmd, l ong data)pri

31、ntk(s3c2410: device ioctl operatio n!n); /函数可重新定义用于实现I/O 口的其他控制操作ssize_t led_ary_ope n (struct inode * inode ,struct file * file)return 0;当用户态调用open函数时,对应内核态次函数被调用ssize_t led_ary_release (struct inode * inode ,struct file * file)return 0;/当用户态调用close函数时,此release函数被调用。struct led_ary_ops =ope n:led_ar

32、y_ope n.read:led_ary_read,write:led_ary_write,ioctl:led_ary_ioctl,release: led_ary_release,;/结构体在头文件linux/fs.h中定义,用来存储驱动内核模块提供的对设备进行各种操作的函数的指针,指出设备驱动程序所提供的入口点位置static int _init HW_led_ary_i nit(void) in t ret = -ENODEV;showvers ion();ret = devfs_register_chrdev(led_ary_MAJOR, led_ary, &ed_ary_ops);

33、/* 字 符设备led_ary进行注册*/if( ret 0 )printk ( s3c2410: ini t_module failed with %dn, ret);return ret;elseprintk(KERN_INFO S3c2410 led_ary register success!n);Jdev_ha ndle = devfs_register( NULL, led_ary, DEVFS_FL_DEFAULT, led_ary_MAJOR, 0, S_IFCHR, &ed_ary_ops, NULL);/* 注册 devfs 设备 */ prin tk(GPACON=%xn,

34、GPACON);prin tk(BWSCON=%xn,BWSCON);ioremap_addr=ioremap(0x18000002,0x0f);/* 将一个 IO 地址空间映射到内核 的虚拟地址空间上去*/outw(OxOOff,ioremap_addr);/*从 I/O 读取数据 */return ret;函数用于驱动程序进行硬件设备初始化int _init s3c2410_led_ary_i ni t(void) int ret = -ENODEV;ret = HW_led_ary_i nit();if (ret)return ret;return 0; 模块初始化,程序由此开始执行,此函数被modulenit()调

温馨提示

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

评论

0/150

提交评论