|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*=============================程序说明===============================
项目名称:
作 者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include <reg52.h>
//===========================端口声明================================
#define keyIO P1
//声明4×4的矩阵键盘接在单片机的P1端口。
//=========================全局常量声明==============================
//=========================全局变量声明==============================
unsigned charData[]={17,17,17,17,17,17,0,0};//键码是唯一的,键值是可变的,人为约定的
//数码管显示数组。
unsigned char keycodeA=0xff;
//===========================函数声明================================
void display(unsigned char Data[]);
unsigned char keyscan(void);
void keydo(unsigned char keycode);
//============================主函数=================================
void main()//主函数
{
//---------------------------系统初始化--------------------------
keydo(keycodeA);
while(1)//死循环
{
keycodeA=keyscan();
if(keycodeA!=0xff)
{
keydo(keycodeA);
}
display(Data);
}
}
//==========================功能子函数===============================
/*-------------------------------------------------------------------
函数名称:
功 能:
输 入:
输 出:
说 明:
-------------------------------------------------------------------*/
unsigned char keyscan(void)
{
unsignedchar keycode=0xff;
//默认没有按键按下。
keyIO=0xf7;
if((keyIO&0xf0)!=0xf0)
{
display(Data);
display(Data);//去抖延时
if((keyIO&0xf0)!=0xf0)
{
keycode=keyIO;
while((keyIO&0xf0)!=0xf0)
{
display(Data);
}
}
}
keyIO=0xfb;
if((keyIO&0xf0)!=0xf0)
{
display(Data);
display(Data);//去抖延时
if((keyIO&0xf0)!=0xf0)
{
keycode=keyIO;
while((keyIO&0xf0)!=0xf0)
{
display(Data);
}
}
}
returnkeycode;
}
void keydo(unsigned char keycode)
{
Data[0]=keycode>>4;
Data[1]=keycode&0x0f;
switch(keycode)
{
case0x77: //S1
Data[6]=0;
Data[7]=1;
break;
case0xb7:
Data[6]=0;
Data[7]=2;
break;
case0xd7:
Data[6]=0;
Data[7]=3;
break;
case0xe7:
Data[6]=0;
Data[7]=4;
break;
case0x7b:
Data[6]=0;
Data[7]=5;
break;
case0xbb:
Data[6]=0;
Data[7]=6;
break;
case0xdb:
Data[6]=0;
Data[7]=7;
break;
case0xeb:
Data[6]=0;
Data[7]=8;
break;
default:
break;
}
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功 能:在数码管上显示8位数据(0~F)。
输 入:Data[]//8位数码管要显示的数据。
输 出:无
说 明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsignedchar code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0xbf,0xff};
unsignedchar code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsignedchar i=0;//记录显在哪位上。
unsignedchar Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data];//送段选码。
WR=0;//开
WR=1;//关
//---------位选------------
P2=0xf8;
P0=Bit;
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
} |
|