📄 jianpan.c
字号:
#include<reg51.h>
#define KEYBOARD_PORT P1 //定义键盘接口
unsigned char KeyScan ( void );
void KeyBoardProcess ( unsigned char keyValue );
/**************************定时器0初始化程序************************/
void Init_Timer0 ( void )
{
TMOD |= 0x01; //定时器0工作于方式1,16位定时器
TH0=0xB8; //定时器初始值,11.059MHz晶振下定时20ms
TL0=0x00;
EA=1; //中断使能
ET0=1; //使能定时器0中断
TR0=1; //开启定时器0
}
/*************************定时器0中断服务程序***********************/
void Timer0_isr(void) interrupt 1 using 1
{
static unsigned char count = 0 ;
unsigned char keyValue ;
TH0=0xB8;
TL0=0x00;
if ( 9 < count )
{
count = 0 ;
keyValue = KeyScan() ; //键盘扫描程序
KeyBoardProcess( keyValue ) ; //键盘处理程度
}
else
{
count ++ ;
}
}
/*******************************延时函数****************************/
void delay(unsigned char i)
{
unsigned int j = 1000;
for ( i ; i > 0 ;i -- )
{
while ( j -- ) ;
}
}
/**********************键盘扫描程序,使用行列反转法********************/
unsigned char KeyScan ( void )
{
unsigned char keyValue ;
unsigned char cord_h , cord_l ; //行列值
KEYBOARD_PORT = 0x0F ; //行线输出全为0
cord_h = KEYBOARD_PORT & 0x0F ; //读入列线值
if ( cord_h != 0x0F ) //检测有无键按下
{
delay( 10 ) ; //延时去抖
if ( cord_h != 0x0F ) //确定有键按下
{
KEYBOARD_PORT = 0xF0 ; //列线输出全为0
cord_l = KEYBOARD_PORT & 0xF0 ; //读入行线值
keyValue = cord_h + cord_l ; //按下键的键值
}
else
keyValue = 0xFF ;
}
else
keyValue = 0xFF ;
return keyValue ;
}
/* 按键 符号 键值(P1.7-P1.0) 按键 符号 键值(P1.7-P1.0)
S1 1 0xEE S9 7 0xEB
S2 2 0xDE S10 8 0xDB
S3 3 0xBE S11 9 0xBB
S4 ↑ 0x7E S12 ← 0x7B
S5 4 0xED S13 确定 0xE7
S6 5 0xDD S14 0 0xD7
S7 6 0xBD S15 取消 0xB7
S8 ↓ 0x7D S16 → 0x77 */
/****************************键盘处理程序***************************/
void KeyBoardProcess ( unsigned char keyValue )
{
switch ( keyValue )
{
case 0xEE :
//按键1的处理程序
break ;
case 0xDE :
//按键2的处理程序
break;
case 0xBE :
//按键3的处理程序
break;
case 0x7E :
//按键↑的处理程序
break;
default :
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -