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 的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:
|
显示方式:
八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约 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);
}
}
}
五、 心得体会
回顾此次课程设计,让我感慨颇多,从理论到实践,我学到了很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。通过这次课程设计使我懂得了理论与实际结合是很重要的,只有理论知识远远不够,只有把所学的理论知识同实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考能力。在设计的过程中遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解的不够深刻,掌握的不够牢固,通过这次课程设计,把以前所学多的知识重新温故,巩固了所学到的知识。