发布时间:2025-10-15 17:54:06    次浏览
#includereg51.h#includeintrins.h#definekey_portP0//键盘接口定义sbitkey_port_0=key_port^0;sbitkey_port_1=key_port^1;sbitkey_port_2=key_port^2;sbitkey_port_3=key_port^3;/*******************************STC89C59 单片机一毫秒延时函数*******************************/void delay_ms(unsigned int ms){unsigned int i,j;for( i=0;ims;i++)for(j=0;j332;j++); //1947是STC89C58在22.1184MHz晶振下,通过软件仿真反复实验得到的数值}/**************************串口发送一个字符**************************/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.1184MHzTL1=0xfa;PCON|=0x80; //SMOD=1;波特率加倍;ES=1; //Enable Serial InterruptTR1 = 1 ; // timer 1 run}/**************************键盘扫描函数**************************/unsigned char keyscan(void){unsigned char key,i;unsigned char code 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);//无键按下返回0delay_ms(10); //调用延时函数 ,目的是去前沿键抖。if(key_port==0x0f)return(0);//再次判断。目的是确保检测正确else{for(i=0;i4;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 i16;i++); //查表取key的值0-Fkey=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);}}}原文链接:http://www.eeworld.com.cn/mcu/article_2016102630867.html