需求:数码管第0、第1显示SW1按键次数;数码管第2、第3显示SW2按键次数;数码管第4、第5显示SW3按键次数;数码管第6、第7显示SW4按键次数;
方法一:
Int_DigitalTube.h 代码如下:
#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "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();
/**
* @brief 四个按键计数
*
* @param num1 SW1 计数
* @param num2 SW2 计数
* @param num3 SW3 计数
* @param num4 SW4 计数
*/
void Int_DigitalTube_DisplayKey(u8 num1,u8 num2,u8 num3,u8 num4);
#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);
}
}
/**
* @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;
}
void Int_DigitalTube_DisplayKey(u8 num1, u8 num2, u8 num3, u8 num4)
{
u8 i;
// 清空 buffer 里存储的数值
for (i = 0; i < 8; i++) {
s_buffer[i] = 0;
}
i = 7;
// 循环对num1 进行取余和除操作
while (num1 > 0) {
if (num1 <= 9 && num1 >= 0) {
s_buffer[i] = s_digital_codes[0];
}
s_buffer[i] = s_digital_codes[num1 % 10];
num1 /= 10;
i--;
}
i = 5;
// 循环对num2 进行取余和除操作
while (num2 > 0) {
if (num2 <= 9 && num2 >= 0) {
s_buffer[i] = s_digital_codes[0];
}
s_buffer[i] = s_digital_codes[num2 % 10];
num2 /= 10;
i--;
}
i = 3;
// 循环对num3 进行取余和除操作
while (num3 > 0) {
if (num3 <= 9 && num3 >= 0) {
s_buffer[i] = s_digital_codes[0];
}
s_buffer[i] = s_digital_codes[num3 % 10];
num3 /= 10;
i--;
}
i = 1;
// 循环对num4 进行取余和除操作
while (num4 > 0) {
if (num4 <= 9 && num4 >= 0) {
s_buffer[i] = s_digital_codes[0];
}
s_buffer[i] = s_digital_codes[num4 % 10];
num4 /= 10;
i--;
}
}
Int_Keyboard.h 代码如下:
#ifndef __INT_KEYBOARD_H__
#define __INT_KEYBOARD_H__
#include <STC89C5xRC.H>
#include "Util.h"
/**
* @brief 检测SW1按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW1Pressed();
/**
* @brief 检测SW2按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW2Pressed();
/**
* @brief 检测SW3按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW3Pressed();
/**
* @brief 检测SW4按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW4Pressed();
#endif
Int_Keyboard.c 代码如下:
#include "Int_Keyboard.h"
// 当按下按键时 SW1应该是0;当抬起按键时 SW1应该是1
#define SW1 P42
#define SW2 P43
#define SW3 P32
#define SW4 P33
bit Int_Keyboard_IsSW1Pressed()
{
// SW1没有按下,返回0
if (SW1 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW1 为1,是抖动没有按下
if (SW1 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW1 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW1 == 1) {
return 1;
}
}
}
}
bit Int_Keyboard_IsSW2Pressed()
{
// SW2没有按下,返回0
if (SW2 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW2 为1,是抖动没有按下
if (SW2 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW2 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW2 == 1) {
return 1;
}
}
}
}
bit Int_Keyboard_IsSW3Pressed()
{
// SW3没有按下,返回0
if (SW3 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW3 为1,是抖动没有按下
if (SW3 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW3 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW3 == 1) {
return 1;
}
}
}
}
bit Int_Keyboard_IsSW4Pressed()
{
// SW4没有按下,返回0
if (SW4 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW4 为1,是抖动没有按下
if (SW4 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW4 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW4 == 1) {
return 1;
}
}
}
}
main.c 代码如下:
#include <STC89C5XRC.H>
#include "Int_Keyboard.h"
#include "Int_DigitalTube.h"
void main()
{
u8 num1, num2, num3, num4;
num1 = num2 = num3 = num4 = 0;
while (1) {
Int_DigitalTube_RefreshKey();
if (Int_Keyboard_IsSW1Pressed()) {
num1++;
P00 = ~P00;
}
if (Int_Keyboard_IsSW2Pressed()) {
P01 = ~P01;
num2++;
}
if (Int_Keyboard_IsSW3Pressed()) {
P02 = ~P02;
num3++;
}
if (Int_Keyboard_IsSW4Pressed()) {
P03 = ~P03;
num4++;
}
Int_DigitalTube_DisplayKey(num1,num2,num3,num4);
Int_DigitalTube_Refresh();
}
}
方法二:
Int_DigitalTube.h 代码如下:
#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "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();
/**
* @brief 第 n 个数码管显示什么数
*
* @param n 第几个数码管
* @param num 显示数字
*/
void Int_DigitalTube_Key(u8 n,u8 num);
/**
* @brief 刷新显示
*
*/
void Int_DigitalTube_RefreshKey();
#endif
Int_DigitalTube.c 代码如下:
#include <Int_DigitalTube.h>
// 数码管显示缓存
static u8 s_buffer[8];
// 数码管显示按键次数
static u8 buffer[4][2];
static u8 number = 0;
// 数字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);
}
}
/**
* @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;
}
void Int_DigitalTube_Key(u8 n, u8 num)
{
u8 i;
i = 1;
// 循环对num4 进行取余和除操作
while (num > 0) {
if (num <= 9 && num >= 0) {
buffer[n][0] = s_digital_codes[0];
}
buffer[n][i] = s_digital_codes[num % 10];
num /= 10;
i--;
}
}
void Int_DigitalTube_RefreshKey()
{
u8 i, n;
if (number == 0) {
for (n = 0; n < 4; n++) {
for (i = 0; i < 2; i++) {
buffer[n][i] = s_digital_codes[0];
}
}
number++;
}
for (n = 0; n < 4; n++) {
for (i = 0; i < 2; i++) {
Int_DigitalTube_DisplaySingle(n * 2 + i, buffer[n][i]);
Com_Util_Delay1ms(1);
}
}
}
Int_Keyboard.h 代码如下:
#ifndef __INT_KEYBOARD_H__
#define __INT_KEYBOARD_H__
#include <STC89C5xRC.H>
#include "Util.h"
/**
* @brief 检测SW1按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW1Pressed();
/**
* @brief 检测SW2按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW2Pressed();
/**
* @brief 检测SW3按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW3Pressed();
/**
* @brief 检测SW4按键是否按下
*
* @return bit 是或否
*/
bit Int_Keyboard_IsSW4Pressed();
#endif
Int_Keyboard.c 代码如下:
#include "Int_Keyboard.h"
// 当按下按键时 SW1应该是0;当抬起按键时 SW1应该是1
#define SW1 P42
#define SW2 P43
#define SW3 P32
#define SW4 P33
bit Int_Keyboard_IsSW1Pressed()
{
// SW1没有按下,返回0
if (SW1 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW1 为1,是抖动没有按下
if (SW1 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW1 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW1 == 1) {
return 1;
}
}
}
}
bit Int_Keyboard_IsSW2Pressed()
{
// SW2没有按下,返回0
if (SW2 == 1) {
return 0;
}
// 延时消除前抖
Com_Util_Delay1ms(10);
// SW2 为1,是抖动没有按下
if (SW2 == 1) {
return 0;
}
// 已经按下等待抬起
while (1) {
if (SW2 == 1) {
// 延时消除后抖
Com_Util_Delay1ms(10);
if (SW2 == 1) {
return 1;
}
}
}