矩阵键盘在数码管上显示1-16

#include <reg52.h>

#include "./delay/delay.h"

#define PORTLEN P0
#define KEYPORT P1

sbit bit_select = P2^0;
sbit seg_select = P2^1;

unsigned char duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char qrc[2] = {0x3f,0x3f};

void timer0_init(void)
{
    EA = 1;
    TMOD |= 0x01;
    TH0 = (65536 - 2000) / 256;
    TL0 = (65536 - 2000) % 256;
    ET0 = 1;
    TR0 = 1;
}

void display()
{  
    static unsigned char i = 0;
    PORTLEN = 0x0;
    seg_select = 1;
    seg_select = 0; 
			
    PORTLEN = 0xff;
    bit_select = 1;
    bit_select = 0;
			
    PORTLEN = qrc[i];
    seg_select = 1;
    seg_select = 0;
					
    PORTLEN = weima[i];
    bit_select = 1;
    bit_select = 0;
	  
    i++;
    if(2 == i)
    {
	i = 0;
    }
}

u
### 实现方案 为了实现按下16矩阵键盘按键后在数码管显示对应键位编号的平方值的功能,可以按照以下方法构建程序。 #### 1. 扫描矩阵键盘并获取按键编号 通过调用专门设计来处理这一任务的函数,该函数负责遍历整个键盘结构以识别被触发的具体按钮位置,并将其转换成预定义范围内的唯一数值表示。这一步骤确保了每一个物理按键都能映射至一个确切的数字标签[^1]。 ```c uint8_t scan_keyboard() { uint8_t key_pressed; // 假设此部分代码实现了具体的扫描逻辑, // 并最终得到按下的按键编号存储于key_pressed变量中 return key_pressed; // 返回0-15之间的整数代表不同按键 } ``` #### 2. 计算所选按键编号的平方值 一旦获得了来自上述过程的有效输入,则立即执行简单的数学运算——即求取给定索引号的二次幂结果作为下一步操作的基础数据准备阶段的一部分工作流程。 ```c int calculate_square(uint8_t index) { int square_value = (index + 1) * (index + 1); // 将索引转为实际按键编号(1-16),再计算其平方 return square_value; } ``` #### 3. 显示平方后的数值到7段数码管 最后一步涉及将之前获得的结果可视化呈现出来;这里假设已经存在一套成熟的API接口允许直接向指定地址写入特定格式的数据流从而控制LED显示器的内容更新动作。需要注意的是,在某些情况下可能还需要考虑进制转换等问题以便更好地适配目标硬件平台特性需求。 ```c void display_on_seven_segment(int value) { char buffer[5]; sprintf(buffer, "%d", value); // 调用底层驱动函数发送字符串'buffer'中的字符序列至七段码寄存器完成数据显示 send_to_7segment_display((unsigned char*)buffer); } // 主循环体内部逻辑示意如下: while(true){ uint8_t pressed_key = scan_keyboard(); if(pressed_key != NO_KEY){ // 定义NO_KEY常量指示无任何有效按键事件发生的情形 int squared_result = calculate_square(pressed_key); display_on_seven_segment(squared_result); delay_ms(KEY_DEBOUNCE_TIME); // 防抖动延时等待一段时间后再继续监听新的按键活动 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值