独立按键:按下K0,数码管显示0,….,按下 K7,数码管显示 7,这个程序怎么写。

独立按键:按下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);   // 数码管动态显示计数器变量
    }
}


  • 以下回答由chatgpt基于相关博客总结生成:

    嵌入式设备的型号: 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;
    }
    

    注:以上代码仅供参考,具体实现方式可以根据自己的需求进行调整。