参考:普中 51 单片机开发攻略
main.c
#include <reg52.h>
#include <intrins.h>
#include "delayms.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_KEY P1
#define GPIO_DIS P0
u8 KeyValue = 0; //保存键值(记录按下的是哪一个键)
// 显 示 0~F 的值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//确定哪个按键按下
void KeyDown(void)
{
GPIO_KEY = 0x0F;
if(GPIO_KEY != 0x0F)
{
delayms(100); //消抖
if(GPIO_KEY != 0x0F)
{
//扫描列
switch(GPIO_KEY)
{
case(0x07):
KeyValue = 0;break;
case(0x0B):
KeyValue = 1;break;
case(0x0d):
KeyValue = 2;break;
case(0x0e):
KeyValue = 3;break;
}
//扫描行
GPIO_KEY = 0xF0;
switch(GPIO_KEY)
{
case(0x70):
KeyValue = KeyValue + 0; break;
case(0xb0):
KeyValue = KeyValue + 4;break;
case(0xd0):
KeyValue = KeyValue + 8;break;
case(0xe0):
KeyValue = KeyValue + 12;break;
}
}
}
}
/************ * 函 数 名 : main * 函数功能 : 主函数 *输 入 :无 *输 出 :无*********************/
void main()
{
while(1)
{
KeyDown();
GPIO_DIS = smgduan[KeyValue];
}
}
只有第一个数码管量,并且按第几个键,就显示第几(0-F)。