在这个程序里,让我们来看看如何对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)
文章评论(0条评论)
登录后参与讨论