📄 按键设置数码管.c
字号:
//=======================================================================================
// 工程名称: 按键设置数码管
// 功能描述: 通过按键设置数码显示的值
// 涉及的库: reg51.h
// 硬件连接:见电路图
// 维护记录: 2008-12-14 v1.0
//========================================================================================
//====================================================================================
// 文件名: main.c
// 功能描述: 通过按键设置数码显示的值
// 维护记录: 2008-12-14 v1.0
//====================================================================================
#include "reg51.h"
#define SEG_NUM P2 //段码接口
#define KEY_IO P0 //4*4矩阵键盘的接口
sbit SEL_GE =P1^0; //个位数码管位选
sbit SEL_SHI=P1^2; //十位数码管位选
sbit SEL_BAI=P1^4; //百位数码管位选
unsigned int N; //片选数码管的位数个位为0,百位为2
unsigned int REG_NUM[3]; //显示缓存:存3个数码管对应段码,依次为个十百位
unsigned int CODE_NUM[10] = {
0xbb, /*0*/
0x88, /*1*/
0xd3, /*2*/
0xda, /*3*/
0xe8, /*4*/
0x7a, /*5*/
0x7b, /*6*/
0x98, /*7*/
0xfb, /*8*/
0xfa /*9*/
};
void delay(int i); //延时
int MatrixKey() ; //按键扫描
void Scan_disp(void); //显示扫描函数
void Convert(unsigned int NUM_SHOW); //缓存区处理函数
int num=0;
unsigned char pf;
//=============================================================
// 语法格式: int main();
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//=============================================================
int main(void)
{
unsigned char key=0;
TMOD=0x20;
TH1=0xe6;
TL1=0xe6;
PCON=0x00;
TR1=1;
SCON=0x50;
Convert(key);
while(1)
{
key=MatrixKey();
if(key!=0)
{
SBUF=key;
while(TI==0)
{
Convert(key);
Scan_disp();
delay(6);
}
TI=0;
}
Scan_disp();
delay(6);
}
}
void delay(int i)
{
int j;
for(;i>0;i--)
for(j=110;j>0;j--);
}
//=============================================================
// 语法格式: void Scan_disp(void);
// 实现功能: 扫描显示器件
// 参数: 无
// 返回值: 无
//=============================================================
void Scan_disp(void)
{
SEG_NUM = 0x0000; //清段码输出
SEL_GE = 0;
SEL_SHI = 0;
SEL_BAI = 0;
switch(N)
{
case 0: SEL_GE = 1;SEG_NUM = REG_NUM[0]; break; //片选个位数码管并输出对应缓存
case 1: SEL_SHI = 1;SEG_NUM = REG_NUM[1]; break; //片选十位数码管并输出对应缓存
case 2: SEL_BAI = 1;;SEG_NUM = REG_NUM[2]; break; //片选百位数码管并输出对应缓存
default:break;
}
N++;
if(N >= 3) N = 0; //使始终在0~4循环
}
//=============================================================
// 语法格式: void Convert(unsigned int);
// 实现功能: 更新显示缓存,提取整数的个、十、百位并转换为数码管段码,更新到缓存REG_NUM[]
// 参数: NUM_SHOW:需要提取并转换的整数
// 返回值: 无
//=============================================================
void Convert(unsigned int NUM_SHOW)
{
REG_NUM[0] = CODE_NUM[NUM_SHOW%10]; //提取个位
REG_NUM[1] = CODE_NUM[NUM_SHOW/10%10]; //提取十位
REG_NUM[2] = CODE_NUM[NUM_SHOW/100%10]; //提取百位
}
int MatrixKey()
{
unsigned int data_A=0,data_B=0,KEY_NUM;
unsigned char data_key=0;
KEY_IO=0x0f;
KEY_NUM= KEY_IO;
if(KEY_NUM!=0x0f) //检查行是否有按键按下
{
delay(2); //////////
if(KEY_NUM!=0x0f)
{
data_A=KEY_NUM;
KEY_IO=0xf0;
KEY_NUM= KEY_IO;
data_B=KEY_NUM;
if(data_A==0x0e&&data_B==0xe0){data_key= 1;}
else if(data_A==0x0e&&data_B==0xd0){data_key= 2;}
else if(data_A==0x0e&&data_B==0xb0){data_key= 3;}
else if(data_A==0x0e&&data_B==0x70){data_key= 4;}
else if(data_A==0x0d&&data_B==0xe0){data_key= 5;}
else if(data_A==0x0d&&data_B==0xd0){data_key= 6;}
else if(data_A==0x0d&&data_B==0xb0){data_key= 7;}
else if(data_A==0x0d&&data_B==0x70){data_key= 8;}
else if(data_A==0x0b&&data_B==0xe0){data_key= 9;}
else if(data_A==0x0b&&data_B==0xd0){data_key= 10;}
else if(data_A==0x0b&&data_B==0xb0){data_key= 11;}
else if(data_A==0x0b&&data_B==0x70){data_key= 12;}
else if(data_A==0x07&&data_B==0xe0){data_key= 13;}
else if(data_A==0x07&&data_B==0xd0){data_key= 14;}
else if(data_A==0x07&&data_B==0xb0){data_key= 15;}
else if(data_A==0x07&&data_B==0x70){data_key= 16;}
while(KEY_IO!=0xf0)
{
Scan_disp();
delay(6);
}
}
}
return data_key;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -