需求:数码管显示100 - 0,到0停止;
Int_DigitalTube.h 代码如下:
#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "Com_Util.h"
/**
* @brief 第 n 个数码管 显示 num
*
* @param n 第几位
* @param num 显示数字
*/
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num);
/**
* @brief 缓存中存入数码管显示的值
*
* @param num 数值
*/
void Int_DigitalTube_DisplayNum(unsigned long num);
/**
* @brief 刷新显示
*
*/
void Int_DigitalTube_Refresh();
#endif
Int_DigitalTube.c 代码如下:
#include <Int_DigitalTube.h>
// 数码管显示缓存
static u8 s_buffer[8];
// 数字0-9的编码
static char s_digital_codes[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//刷新显示
void Int_DigitalTube_Refresh(){
u8 i;
for(i = 0; i < 8; i++){
Int_DigitalTube_DisplaySingle(i, s_buffer[i]);
}
}
/**
* @brief 缓存中存入数码管显示的值
*
* @param num 数值
*/
void Int_DigitalTube_DisplayNum(unsigned long num){
u8 i ;
//清空 buffer 里存储的数值
for(i = 0; i < 8; i ++){
s_buffer[i] = 0;
}
i = 7;
//判断 num 是否为大于等于 0 并小于等于 9
if(num>= 0 && num <= 9){
s_buffer[i] = s_digital_codes[num];
}
//循环对num 进行取余和除操作
while(num > 0){
s_buffer[i] = s_digital_codes[num % 10];
num /= 10;
i--;
}
}
/**
* @brief 第 n 个数码管 显示 num
*
* @param n 第几位
* @param num 显示数字
*/
static void Int_DigitalTube_DisplaySingle(u8 n, u8 num)
{
//关掉数码管
P0 = 0;
//清除片选位
P1 &= 0xC7;
//将显示变量左移3位
n <<= 3;
//选中 片选位
P1 |= n;
//显示
P0 = num;
}
main.c 代码如下:
#include <STC89C5XRC.H>
#include "Int_DigitalTube.h"
void main()
{
char i = 100;
u16 j = 0;
while (1) {
if (j == 2500) {
j = 0;
if (i >= 0) {
Int_DigitalTube_DisplayNum(i);
i--;
}
}
j++;
Int_DigitalTube_Refresh();
}
}