📄 跑马灯.c
字号:
#include<AT89X51.H>
//-----------------------函数声明, 变量定义---------------------
#define KEY P0
//----------------------变量声明----------------------------------
void program_SCANkey(); //程序扫描键盘,供主程序调用
void delay(unsigned int N); //延时子程序,实现(16*N+24)us的延时
bit judge_hitkey(); //判断是否有键按下,有返回1,没有返回0
unsigned char scan_key(); //扫描键盘,返回键值(高4位代表行,低4位代表列)
void key_manage(unsigned char keycode);//键盘散转
void manage_key1(void); //按键1处理程序
void manage_key2(void); //按键2处理程序
void manage_key3(void); //按键3处理程序
void manage_key4(void); //按键4处理程序
void manage_key5(void);
void manage_key6(void);
void manage_key7(void);
void manage_key8(void);
void manage_key9(void);
void manage_key10(void);
void manage_key11(void);
void manage_key12(void);
void manage_key13(void);
void manage_key14(void);
void manage_key15(void);
void manage_key16(void);
//----------每个按键对应一个处理程序-----------------------------
//-----------------------------------------------
//函数名称:judge_hitkey
//函数功能:判断是否有键按下,有返回1,没有返回0
//-----------------------------------------------
bit judge_hitkey() //判断是否有键按下,有返回1,没有返回0
{
unsigned char scancode,keycode;
scancode=0x0f; //p2.0~p2.3输出全为1,全1则无键闭合
KEY=scancode;
keycode=KEY; //读p2.0~p2.3的状态
if(keycode==0x0f)
return(0); //全1则无键闭合
else
return(1); //否则有键闭合
}
//--------------------------------------------------------
//函数名称:scan_key
//函数功能:扫描键盘,返回键值(高4位代表行,低4位代表列)
//--------------------------------------------------------
unsigned char scan_key()
{
unsigned char scancode,keycode;
scancode=0xef; //键盘扫描码,采用逐行扫描的方法
while(scancode!=0xff)
{
KEY=scancode; //输入扫描码,扫描p2.4对应的行
keycode=KEY; //读出数据,看是否在此行上的某列键盘被按下
if((keycode&0x0f)!=0x0f)
break;
scancode=(scancode<<1)|0x0f;//否则更新扫描码继续扫描
}
keycode=~keycode;
return(keycode);
}
//-----------------------------------------------------------
//函数名称:key_manage
//入口参数:keycode 扫描键盘返回的键值(高4位代表行,低4位代表列)
//函数功能:键盘散转
//--------------------------------------------------------------
void key_manage(unsigned char keycode)
{
switch(keycode)
{
case 0x11:manage_key1(); break;
case 0x12:manage_key2(); break;
case 0x14:manage_key3(); break;
case 0x18:manage_key4(); break;
case 0x21:manage_key5(); break;
case 0x22:manage_key6(); break;
case 0x24:manage_key7(); break;
case 0x28:manage_key8(); break;
case 0x41:manage_key9(); break;
case 0x42:manage_key10(); break;
case 0x44:manage_key11(); break;
case 0x48:manage_key12(); break;
case 0x81:manage_key13(); break;
case 0x82:manage_key14(); break;
case 0x84:manage_key15(); break;
case 0x88:manage_key16(); break;
//default:
}
}
//--------------------------------------------------------
//函数名称:manage_key
//函数功能:按键处理程序
//--------------------------------------------------------
void manage_key1( void)
{
P2=0X66;
}
void manage_key2( void)
{
}
void manage_key3( void)
{
}
void manage_key4( void)
{
}
void manage_key5( void)
{
}
void manage_key6( void)
{
}
void manage_key7( void)
{
}
void manage_key8( void)
{
}
void manage_key9( void)
{
}
void manage_key10( void)
{
}
void manage_key11( void)
{
}
void manage_key12( void)
{
}
void manage_key13( void)
{
}
void manage_key14( void)
{
}
void manage_key15( void)
{
}
void manage_key16( void)
{
}
//---------------------------------------------------------------
//函数名称:program_SCANkey
//函数功能:程序扫描键盘
// 有键按下完成按键处理,无键按下直接返回
//----------------------------------------------------------------
void program_SCANkey()
{
unsigned char key_code;
if(judge_hitkey()) //判断是否有键按下
{
delay(10); //延时20us左右,消除抖动干扰
if(judge_hitkey()) //判断是否有效按键
{
key_code=scan_key();
while(judge_hitkey());//等待按键释放
key_manage(key_code); //键盘扫描、键盘散转、按键处理
}
}
}
//-------------------------------------------------------------
//函数名称:delay
//入口参数:N
//函数功能:延时子程序,实现(16*N+24)us的延时
//系统采用11.0592MHz的时钟,延时满足要求,其他情况需要改动
//-------------------------------------------------------------
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++) ;
}
//函数名称:main
//入口参数:
//--------------------------------------------------------------
void main()
{ P2=0X00;
while(1)
{
program_SCANkey();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -