独立按键:按下K0,数码管显示0,….,按下 K7,数码管显示 7。
你是什么数码管
可参考
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit S1 = P1^0; // 定义按键S1,连接到P1.0口
sbit COM1 = P2^0; // 定义数码管第一位,连接到P2.0口
sbit COM2 = P2^1; // 定义数码管第二位,连接到P2.1口
sbit COM3 = P2^2; // 定义数码管第三位,连接到P2.2口
uchar code table[] = { // 数码管显示表,0~9的编码值
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar cnt = 0; // 计数器变量,初始值为0
uchar i, j; // 循环计数变量
bit flag; // 按键标志位,初始值为0,表示按键未按下
// 数码管动态显示函数
void display(uchar num) {
COM1 = 0; COM2 = 1; COM3 = 1; // 第一位数码管选通,二、三位不选通
P0 = table[num / 100]; // 显示百位数
for (i = 0; i < 2; i++) { // 延时一段时间,使数码管显示更清晰
for (j = 0; j < 100; j++);
}
COM1 = 1; COM2 = 0; COM3 = 1; // 第二位数码管选通,一、三位不选通
P0 = table[(num % 100) / 10]; // 显示十位数
for (i = 0; i < 2; i++) { // 延时一段时间,使数码管显示更清晰
for (j = 0; j < 100; j++);
}
COM1 = 1; COM2 = 1; COM3 = 0; // 第三位数码管选通,一、二位不选通
P0 = table[num % 10]; // 显示个位数
for (i = 0; i < 2; i++) { // 延时一段时间,使数码管显示更清晰
for (j = 0; j < 100; j++);
}
}
// 主函数
void main() {
TMOD = 0x10; // 定时器/计数器T/C1工作在模式1,16位定时器
TH1 = 0x3c; // 定时器初值,每1ms中断一次
TL1 = 0xb0;
TR1 = 1; // 启动定时器/计数器T/C1
while (1) {
if (!S1) { // 如果按键S1被按下
while (!S1); // 等待按键S1松开
flag = !flag; // 按键标志位取反,表示按键状态
}
if (flag == 1) { // 如果按键被按下
cnt++; // 计数器变量加1
if (cnt >= 200) { // 如果计数器变量达到200
cnt = 0; // 计数器变量归0
}
}
display(cnt); // 数码管动态显示计数器变量
}
}
嵌入式设备的型号: K60
代码如下:
#include "MK60_it.h"
#include "common.h"
#include "gpio.h"
#include "pit.h"
uint8_t num = 0;
void Kxx_GPIO_Driver_Init()
{
gpio_init(D5, GPO, 0); // D5是数码管的开启输出使能端,GPO输出,初始输出低电平
gpio_init(D6, GPO, 0); // D6是数据输出端,GPO输出,初始输出低电平
gpio_init(D7, GPO, 0); // D7是显示控制输出端,GPO输出,初始输出低电平
}
void Kxx_GPIO_Driver_Display(uint8_t num)
{
uint8_t i;
uint32_t j;
gpio_set(D7, 1);
gpio_set(D6, 1);
gpio_set(D7, 0);
for ( i = 0; i < 8; i ++ )
{
if ( num & 0x80 )
{
gpio_set(D6, 1);
}
else
{
gpio_set(D6, 0);
}
num <<= 1;
gpio_set(D5, 1);
for ( j = 0; j < 21; j ++ );
gpio_set(D5, 0);
}
gpio_set(D7, 1);
gpio_set(D6, 1);
}
void PIT1_IRQHandler(void)
{
PIT_Flag_Clear(PIT1);
Kxx_GPIO_Driver_Display(num);
if(num == 7)
{
num = 0;
}
else
{
num ++;
}
}
int main()
{
Kxx_GPIO_Driver_Init();
PIT_Init(PIT1);
PIT_Set(PIT1, 4000000);
NVIC_SetPriority(PIT1_IRQn, 1);
NVIC_EnableIRQ(PIT1_IRQn);
while(1);
return 0;
}
注:以上代码仅供参考,具体实现方式可以根据自己的需求进行调整。