#include
#define key_port P0 //键盘接口定义
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;
/*******************************
STC89C59 单片机一毫秒延时函数
*******************************/
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for( i=0;i
}
/**************************
串口发送一个字符
**************************/
void com_send_dat( unsigned char dat)
{
SBUF=dat;
while (TI== 0);
TI= 0 ;
}
/**************************
串口初始化
**************************/
void init_com( void )
{
SCON=0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr //UART为模式1,8位数据,允许接收
TMOD|=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload //定时器1为模式2,8位自动重装
TH1=0xfa ; //Baud:19200 fosc="22.1184MHz
TL1=0xfa;
PCON|=0x80; //SMOD=1;波特率加倍;
ES=1; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
}
/**************************
键盘扫描函数
**************************/
unsigned char keyscan(void)
{
unsigned char key,i;
unsigned char co
de key_table[16]=
{0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
key_port=0x0f; //确定行列位置
if(key_port==0x0f)return(0);//无键按下返回0
delay_ms(10); //调用延时函数 ,目的是去前沿键抖。
if(key_port==0x0f)return(0);//再次判断。目的是确保检测正确
else
{
for(i=0;i<4;i++) //以下为经典的计算键值(判断闭合键所在的位置)
{
P0=_cror_(0x7f,i);
if(key_port_0==0)break;
if(key_port_1==0)break;
if(key_port_2==0)break;
if(key_port_3==0)break;
}
key=key_port; //取得键值
for(;key_port!=0x0f; key_port=0x0f); //等待键松开,目的是去后沿键抖
for(i=0;key_table[i]!=key && i<16;i++); //查表取key的值0-F
key=i;
return(key); //带键值返回主调函数
}
}
/**************************
键盘扫描测试主函数
**************************/
void main(void)
{
unsigned char key;
init_com(); //串口初始化
while(1)
{
key=keyscan();
if(key!=0)
{
com_send_dat(key);
delay_ms(200);
}
}
}
上一篇:80C51串行扩展技术
下一篇:C51模拟SPI接口
推荐阅读最新更新时间:2024-03-16 15:17