实验扩充 LED显示4*4键位值

代码功能概述

  1. 键盘扫描
    • 使用 KeyPort(定义为 P1)作为键盘输入端口。
    • 扫描 4x4 矩阵键盘,检测按键并返回按键编号(0~15)。
  2. 数码管显示
    • 根据按键编号,从 SegCode 数组中获取对应数码管段码,并通过 P2 输出显示。
  3. 延时
    • 使用简单的循环实现按键消抖。
      #include <reg51.h>
      #define uchar unsigned char
      #define uint unsigned int
      
      #define KeyPort P1
      #define INIT_DISPLAY 0x8C  // 初始显示状态
      
      // 数码管段码定义(0~15)
      uchar code SegCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,
      	0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
      // 列扫描码定义
      uchar code ColCode[] = {0xFE, 0xFD, 0xFB, 0xF7};
      
      // 延时函数
      void delay(uchar m) {
      	uchar j;
      	while (m--) {
      		for (j = 120; j > 0; j--);
      	}
      }
      
      // 键盘扫描函数
      uchar keyscan() {
      	uchar temp, row, col, i;
      	KeyPort = 0xF0;  // 设置行高电平,列低电平
      	delay(10); 
      	temp = KeyPort & 0xF0;
      	if (temp != 0xF0) {  // 检测到按键按下
      		delay(10);       // 消抖
      		temp = KeyPort & 0xF0;
      		if (temp != 0xF0) {  // 再次确认按键按下
      			// 确定行号
      			switch (temp) {
      				case 0x70: row = 3; break;  // 第一行
      				case 0xB0: row = 2; break;  // 第二行
      				case 0xD0: row = 1; break;  // 第三行
      				case 0xE0: row = 0; break;  // 第四行
      				default: return 16;          // 错误情况
      			}
      			// 确定列号
      			for (i = 0; i < 4; i++) 
      			{
      				KeyPort = 0xF0 | ColCode[i] & 0x0F;  // 确保高 4 位为 1,低 4 位为列扫描码
      				temp = KeyPort & 0xF0;
      				if (temp != 0xF0) 
      				{    // 检测到按键
      					col = i;
      					break;
      				}
      			} 
                  return (row * 4 + col);  // 返回按键编号	             	
      		}     
      	}return 16;  // 无按键按下
      }
      void main(void) {
      		uchar keyNum;
      		P2 = INIT_DISPLAY;  // 初始状态
      		while (1) {
      			keyNum = keyscan();
      			if (keyNum < 16) {
      				P2 = SegCode[keyNum];  // 显示按键编号对应的数码管段码
      			} else {
      				P2 = INIT_DISPLAY;  // 无按键按下时恢复初始状态
      			}
      		}
      	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值