ARM数码管显示

ARM数码管显示

一、  设计内容

1.1实验目的

      掌握 LED 的显示控制方法。

              巩固对存储区进行访问的方法。

      1.2实验设备

硬件:Embest Arm EduKit II 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。

软件:Embest IDE Pro 2004 集成开发环境,Windows 98/2000/NT/XP。

二、  设计原理

2.1 八段数码管

嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。

 

       结构:

八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数用,八段数码管能显示所有数字及部份英文字母。见图

                

     类型:

八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。

 

       工作原理:

以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。

电平信号按照 dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:

字符

dp

g

f

e

d

c

b

a

共阴极

共阳极

0

0  0  1  1  1  1  1  1

3FH

C0H

1

0  0  0  0  0  1  1  0

06H

F9H

2

0  1  0  1  1  0  1  1

5BH

A4H

3

0  1  0  0  1  1  1  1

4FH

B0H

4

0  1  1  0  0  1  1  0

66H

99H

5

0  1  1  0  1  1  0  1

6DH

92H

6

0  1  1  1  1  1  0  1

7DH

82H

7

0  0  0  0  0  1  1  1

07H

F8H

8

0  1  1  1  1  1  1  1

7FH

80H

9

0  1  1  0  1  1  1  1

6FH

90H

A

0  1  1  1  0  1  1  1

77H

88H

B

0  1  1  1  1  1  0  0

7CH

83H

C

0  0  1  1  1  0  0  1

39H

C6H

D

0  1  0  1  1  1  1  0

5EH

A1H

E

0  1  1  1  1  0  0  1

79H

86H

F

0  1  1  1  0  0  0  1

71H

8EH

0  1  0  0  0  0  0  0

40H

BFH

.

1  0  0  0  0  0  0  0

80H

7FH

熄灭

0  0  0  0  0  0  0  0

00H

FFH

 

 

 

 

 

 

 

 

 

 

 

 

显示方式:

八段数码管的显示方式有两种,分别是静态显示和动态显示。

静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。

动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约 1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。

 

       2.2 电路原理

EMBEST ARM EDUKIT II 教学电路中,使用的是共阳极八段数码管,数码管的控制通过芯片 ZLG7290 控制,各段的控制信号是芯片ZLG7290 的 SEGA~SEGG 引脚控制,需要显示的段码通过 IIC 总线传送到该芯片,见图。

 

 

                                                       八段数码管控制电路

 

                                 八段数码管控制电路

 

 

三、   操作步骤

1.     准备实验环境

使用 Embest 仿真器连接目标板,使用 Embest Arm EduKit II 实验板附带的串口线,连接实验板上的 UART0 和 PC 机的串口。

 

2.     串口接收设置

在 PC 机上运行 windows 自带的超级终端串口通信程序(波特率 115200、1 位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。

 

3.     打开实验例程

1) 使用 Embest IDE 通过 Embest JTAG 仿真器连接实验板,打开实验例程目录4.6_8led_test 子目录下的 8led_test.ews 例程,编译链接工程成功;

2) 点击 IDE 的 Debug 菜单,选择 Remote Connect 项或 F8 键,远程连接目标板;

3) 点击 IDE 的 Debug 菜单,选择 Download 下载调试代码到目标系统的 RAM 中;

4) 在“8LED_test ();”设置断点后,点击 Debug 菜单的 Go 或 F5 键运行程序。

 

4.     观察实验结果

1).在 PC 机上观察超级终端程序主窗口,可以看到如下界面:

Embest Arm EduKit II Evaluation Board

 

8-segment Digit LED Test Example (Please lookat LED)

 

 

2). 实验系统八段数码管循环显示 0 ~ F 字符。

 

 

四、   程序代码

Main:

/*********************************************************************************************

* File:     main.c

* Author: embest

* Desc:  cmain entry

* History:

*********************************************************************************************/

#include "44blib.h"

#include "44b.h"

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               externfunction                                                                                               */

/*------------------------------------------------------------------------------------------*/

extern void led8_test();

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               functiondeclare                                                                                              */

/*------------------------------------------------------------------------------------------*/

void Main(void);

 

/*********************************************************************************************

* name:             main

* func:               ccode entry

* para:               none

* ret:                   none

* modify:

* comment:              

*********************************************************************************************/

void Main(void)

{

   sys_init();        /* Initial44B0X's Interrupt,Port and UART */

 

         uart_printf("\n\rEmbest Arm EduKit II Evaluation Board");

         uart_printf("\n\r8-segment Digit LED Test Example (Please look at LED)\n");

 

         led8_test();

 

         while(1);

}

 

Iic:

 

/*********************************************************************************************

* File:     iic.c

* Author: embest

* Desc:  iicsource code

* History:

*********************************************************************************************/

#include "44b.h"

#include "44blib.h"

#include "def.h"

#include "iic.h"

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               globalvariables                                                                                     */

/*------------------------------------------------------------------------------------------*/

int f_nGetACK;

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               functiondeclare                                                                                    */

/*------------------------------------------------------------------------------------------*/

void iic_int(void);

void iic_init(void);

void iic_write(UINT32T unSlaveAddr,UINT32T unAddr, UINT8T ucData);

void iic_read(UINT32T unSlaveAddr, UINT32TunAddr, UINT8T *pData);

 

/*********************************************************************************************

* name:             iic_init

* func:               initializeiic

* para:               none

* ret:                   none

* modify:

* comment:              

********************************************************************************************/

void iic_init(void)

{

         f_nGetACK= 0;

 

   // Enable interrupt

         rINTMOD= 0x0;

         rINTCON= 0x1;

         rINTMSK= rINTMSK & (~(BIT_GLOBAL|BIT_IIC));

   pISR_IIC= (unsigned)iic_int;

 

         //Initialize iic

         rIICADD= 0x10;                                                    //S3C44B0X slave address

   rIICCON = 0xe5;                                                     //Enable ACK, interrupt, IICCLK=MCLK/512, Enable ACK//64Mhz/512/(15+1) = 8Khz

   rIICSTAT= 0x10;                                                     //Enable TX/RX

}

 

/*********************************************************************************************

* name:             iic_write

* func:               writedata to iic

* para:               unSlaveAddr--- input, chip slave address

*                          unAddr              --- input, data address

*                          ucData           ---input, data value

* ret:                   none

* modify:

* comment:              

********************************************************************************************/

void iic_write(UINT32T unSlaveAddr,UINT32TunAddr,UINT8T ucData)

{

         f_nGetACK= 0;

   

   // Send control byte

   rIICDS = unSlaveAddr;                        //0xa0

   rIICSTAT = 0xf0;                                 //Master Tx,Start

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

   

   // Send address

   rIICDS = unAddr;

   rIICCON = 0xe5;                                // Resumes IICoperation.

         while(f_nGetACK== 0);                     // Wait ACK

   f_nGetACK = 0;

   

   // Send data

   rIICDS = ucData;

   rIICCON = 0xe5;                                // Resumes IICoperation.

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

   

   // End send

   rIICSTAT = 0xd0;                                 //Stop Master Tx condition

   rIICCON = 0xe5;                                             //Resumes IIC operation.

         while(rIICSTAT& 0x20 == 1); // Wait until stopcondtion is in effect.

}

        

/*********************************************************************************************

* name:             iic_read

* func:               readdata from iic

* para:               unSlaveAddr--- input, chip slave address

*                          unAddr              --- input, data address

*                          pData             ---output, data pointer

* ret:                   none

* modify:

* comment:              

********************************************************************************************/

void iic_read(UINT32T unSlaveAddr,UINT32TunAddr,UINT8T *pData)

{

         charcRecvByte;

        

         f_nGetACK= 0;

 

   // Send control byte

   rIICDS = unSlaveAddr;                        //Write slave address to IICDS

   rIICSTAT = 0xf0;                                 //Master Tx,Start

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

 

   // Send address

   rIICDS = unAddr;

   rIICCON = 0xe5;                                // Resumes IICoperation.

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

 

   // Send control byte

   rIICDS = unSlaveAddr;                        //0xa0

   rIICSTAT = 0xb0;                                //Master Rx,Start

         rIICCON= 0xe5;                                //Resumes IIC operation.  

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

   

   // Get data

   rIICCON = 0x65;

   while(f_nGetACK == 0);                      //Wait ACK

   f_nGetACK = 0;

   cRecvByte = rIICDS;

   

   /* End receive */

   rIICSTAT = 0x90;                               // Stop Master Rxcondition

         rIICCON= 0xe5;                                        // Resumes IIC operation.

         while(rIICSTAT& 0x20 == 1); // Wait until stopcondtion is in effect.

        

   *pData = cRecvByte;

}

 

/*********************************************************************************************

* name:             iic_int

* func:               IICinterrupt handler

* para:               none

* ret:                   none

* modify:

* comment:              

********************************************************************************************/

void iic_int(void)

{

   rI_ISPC=BIT_IIC;

         f_nGetACK= 1;

}

 

8led:

 

/*********************************************************************************************

* File:     8led.c

* Author: embest     

* Desc:  8-segmentdigit LED control functions

* History:

*********************************************************************************************/

#include "44b.h"

#include "44blib.h"

#include "def.h"

#include "iic.h"

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               globalvariables                                                                                               */

/*------------------------------------------------------------------------------------------*/

unsigned char f_szDigital[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};         // 0 ~ 9              

 

/*------------------------------------------------------------------------------------------*/

/*                                                                               functiondeclare                                                                                              */

/*------------------------------------------------------------------------------------------*/

void led8_test(void);

 

/*********************************************************************************************

* name:             led8_test

* func:               test8led

* para:               none

* ret:                   none

* modify:

* comment:              

********************************************************************************************/

void led8_test(void)

{

         inti, j, k;

        

         iic_init();

        

         for(;;)

         {

                   for(j=0;j<10; j++)

                   {

                            for(i=0;i<8; i++)

                            {

                                     k= 9-(i+j)%10;

                                     iic_write(0x70,0x10+i, f_szDigital[k]);

                            }

                            delay(1000);

                   }

         }

}

 

 

 

 

 

五、  心得体会

回顾此次课程设计,让我感慨颇多,从理论到实践,我学到了很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。通过这次课程设计使我懂得了理论与实际结合是很重要的,只有理论知识远远不够,只有把所学的理论知识同实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考能力。在设计的过程中遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解的不够深刻,掌握的不够牢固,通过这次课程设计,把以前所学多的知识重新温故,巩固了所学到的知识。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值