需求:初始状态数码管显示1111 1111,按键SW1左移;按键SW2右移;按键SW3加一;按键SW4清零。
Int_DigitalTube.h代码如下:
#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "Util.h"
/**
* @brief 刷新显示
*
*/
void Int_DigitalTube_Refresh();
/**
* @brief 初始值
*
*/
void Int_DigitalTube_InitialValue();
/**
* @brief 左移
*
*/
void Int_DigitalTube_Left();
/**
* @brief 右移
*
*/
void Int_DigitalTube_Right();
/**
* @brief 加一
*
*/
void Int_DigitalTube_PlusOne();
/**
* @brief 清零
*
*/
void Int_DigitalTube_Reset();
/**
* @brief 字码对应数字
*
* @param value 字码
* @return u8 返回对应数字
*/
u8 Int_DigitalTube_ReturnValue(u8 value);
/**
* @brief 判断当前位是0 还是 1
*
* @param howMany 判断哪一位
* @return u8 如果当前位是0 加一返回1;
* 如果当前位是1 加一返回0;
如果当前位是第0位(最高位)返回0;
*/
u8 Int_DigitalTube_Binary(u8 howMany);
#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]);
Com_Util_Delay1ms(1);
}
}
void Int_DigitalTube_InitialValue()
{
u8 i;
// s_buffer 里存储的数值为1
for (i = 0; i < 8; i++) {
s_buffer[i] = s_digital_codes[1];
}
}
void Int_DigitalTube_Left()
{
u8 i;
// 左移
for (i = 0; i < 7; i++) {
s_buffer[i] = s_buffer[i + 1];
}
s_buffer[7] = s_digital_codes[0];
}
void Int_DigitalTube_Right()
{
u8 i;
// 右移
for (i = 7; i > 0; i--) {
s_buffer[i] = s_buffer[i - 1];
}
s_buffer[0] = s_digital_codes[0];
}
void Int_DigitalTube_PlusOne()
{
u8 i;
for (i = 7; i >= 0; i--) {
if (Int_DigitalTube_Binary(i)) {
break;
}
}
}
void Int_DigitalTube_Reset()
{
u8 i;
// 清空 buffer 里存储的数值
for (i = 0; i < 8; i++) {
s_buffer[i] = s_digital_codes[0];
}
}
u8 Int_DigitalTube_ReturnValue(u8 value)
{
switch (value) {
case 0x3F:
return 0;
case 0x06:
return 1;
}
}
u8 Int_DigitalTube_Binary(u8 howMany)
{
u8 i;
i = Int_DigitalTube_ReturnValue(s_buffer[howMany]);
if (i) {
if (howMany == 0) {
return 1;
}
s_buffer[howMany] = s_digital_codes[0];
return 0;
} else {
s_buffer[howMany] = s_digital_codes[1];
return 1;
}
}
main.c代码如下:
#include <STC89C5XRC.H>
#include "Int_Keyboard.h"
#include "Int_DigitalTube.h"
void main()
{
Int_DigitalTube_InitialValue();
while (1) {
Int_DigitalTube_Refresh();
if (Int_Keyboard_IsSW1Pressed()) {
P00 = ~P00;
Int_DigitalTube_Left();
}
if (Int_Keyboard_IsSW2Pressed()) {
P01 = ~P01;
Int_DigitalTube_Right();
}
if (Int_Keyboard_IsSW3Pressed()) {
P02 = ~P02;
Int_DigitalTube_PlusOne();
}
if (Int_Keyboard_IsSW4Pressed()) {
P03 = ~P03;
Int_DigitalTube_Reset();
}
}
}