原创 8位数码管动态扫描显示

2008-6-2 12:24 9722 6 6 分类: MCU/ 嵌入式

8F2MHM1.jpg


在这个程序里,让我们来看看如何对8位的数码管进行动态扫描显示。


首先了解下电路原理:


DG100 51单片机系统板中两个高亮的4位数码管是共阳的,位选信号由P2口控制段码信号由P0口控制


写程序时,我的想法是,将显示数码管模块化,只要将显示缓冲里的字节传入函数调用即可。于是,就有如下函数原型:


void DigShowArr(uchar* pucShow, uchar ucMark); // 显示缓冲中的信息
void DigShowBit(uchar ucShow, uchar ucBit); // 在指定的数码位上显示数码


其中,ucMark变量用了如下宏:


#define DIGBIT_MARK_0  0x01
#define DIGBIT_MARK_1  0x02
#define DIGBIT_MARK_2  0x04
#define DIGBIT_MARK_3  0x08
#define DIGBIT_MARK_4  0x10
#define DIGBIT_MARK_5  0x20
#define DIGBIT_MARK_6  0x40
#define DIGBIT_MARK_7  0x80
#define DIGBIT_MARK_ALL  0xff


还有一个供查询的数字对应段码的表,放在如下数组里:


extern uchar code g_ucSegCode[24];


接下来,就是DigShow.c里函数的实现过程了。注意,仔细阅读下面源文件,就可以很容易自己写出头文件了,交给读者自己完成。


DigShow.c内容如下:


/************************************************************
 * DigShow Module
 *   Donald, DONG ELECT. LAB.
 * 2008.5.2 [complete]
 * --------------------------------------------------
 * 数码管显示模块
 *
 * P0: 数码管段码
 * P2: 数码管位选
 ***********************************************************/
#include <reg52.h>
#include "DigShow.h"


uchar code g_ucSegCode[24] = {
 0xC0,  //"0" - 0
 0xF9,  //"1" - 1
 0xA4,  //"2" - 2
 0xB0,  //"3" - 3
 0x99,  //"4" - 4
 0x92,  //"5" - 5
 0x82,  //"6" - 6
 0xF8,  //"7" - 7
 0x80,  //"8" - 8
 0x90,  //"9" - 9
 0x88,  //"A" - 10
 0x83,  //"B" - 11
 0xC6,  //"C" - 12
 0xA1,  //"D" - 13
 0x86,  //"E" - 14
 0x8E,  //"F" - 15
 0x89,  //"H" - 16
 0xC7,  //"L" - 17
 0xC8,  //"n" - 18
 0xC1,  //"u" - 19
 0x8C,  //"P" - 20
 0xA3,  //"o" - 21
 0xBF,  //"-" - 22
 0xFF  //熄灭 - 23
};


/************************************************************
 * Name: DigShowArr
 * Func:
 *  显示缓冲中的信息。
 * Para:
 *  uchar* pucShow: 要显示的缓冲区。如果大于8位,只显示前8位。
 *      高位在前,借位在后。
 *  uchar ucMark: 显示标识。(DIGBIT_MARK_0 - DIGBIT_MARK_7,
 *        DIGBIT_MARK_ALL)
 * Return: None
 ***********************************************************/
void DigShowArr(uchar* pucShow, uchar ucMark)
{
 uchar* pCur;
 char i;


 pCur = pucShow + 7;     // 从低位开始显示
 for(i = 0; i < 8; i++){
  if(ucMark & (0x01 << i)){  // 确认是否为需要显示的数码位
   DIGSEG = g_ucSegCode[*pCur--];
   DIGBIT = ~(0x01 << i);
   DelayMs(2);     // 延时10ms
   DIGBIT = 0xff;
  }
  else{
   DIGBIT = 0xff;
   DelayMs(2);
  }
 }
}


/************************************************************
 * Name: DigShowBit
 * Func:
 *  在指定的数码位上显示数码
 * Para:
 *  uchar ucShow: 要显示的值。(0 - 23)
 *  uchar ucBit:  要显示到的数码位。(0 - 7)
 * Return: None
 ***********************************************************/
void DigShowBit(uchar ucShow, uchar ucBit)
{
 DIGSEG = g_ucSegCode[ucShow];
 DIGBIT = ~(0x01 << ucBit);
 DelayMs(2);
 DIGBIT = 0xff;
}


/************************************************************
 * Name: DelayMs
 * Func:
 *  延时unMs个毫秒
 * Para:
 *  uint unMs: 延时毫秒的个数
 * Return: None
 ***********************************************************/
void DelayMs(uint unMs)
{
 uint i, j;
 for(i = unMs; i > 0; i--){
  for(j = 120; j > 0; j--);
 }
}


这样,显示开头图片的情形就可以用如下的程序实现:


main.c内容如下:


/************************************************************
 * DigShow Test
 *   Donald, DONG ELECT. LAB.
 * 2008.5.2 [complete]
 * --------------------------------------------------
 * 数码管静态显示0到7
 *
 * P0: 数码管段码
 * P2: 数码管位选
 ***********************************************************/
#include <reg52.h>
#include "digshow.h"


void main()
{
 uchar ucShow[8] = {0, 1, 2, 3, 4, 5, 6, 7};
 while(1) {
  DigShowArr(ucShow, DIGBIT_MARK_ALL);
 }
}


至此,8位数码管动态扫描显示程序结束。


原创,转载请注明出处:Author: Donald Email: support.dong[AT]gmail.com


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条