您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 利用反转法进行矩阵式按键及键值转换详解
利用反转法进行矩阵式按键扫描及键值转换详解/******************************************************************************///工程名:键盘实验*//工程描述:在实验板上连接小键盘接口的连线,采用反转法(查询方式)识别小键盘上按下的各键,//并将其对应的按键状态用八个发光二极管来显示,并在超级终端上显示。//注意:本程序实现的硬件平台为MC9S12XDP512应用开发平台。应用开发平台使用16MHZ的有源晶振*//说明:程序使用的片上系统时钟频率,总线时钟由锁相环产生,总线时钟为片上系统时钟的//一半,其换算的公式为:fpllclk=2*fosclk*(SYNR+1)/(REFDV+1)//其中fosclk为振荡器频率,SYNR为时钟合成寄存器的值,REFDV为时钟分频寄存器的值/******************************************************************************/#includehidef.h/*commondefinesandmacros*/#includemc9s12xdp512.h/*derivativeinformation*/#pragmaLINK_INFODERIVATIVEmc9s12xdp512voidSCI_Init(void);voiddely(void);unsignedcharKeyDecoe(unsignedchari);voidput_char(unsignedcharc);voidMCUInit(void){asmseiSYNR=0x02;//时钟合成寄存器REFDV=0x01;//时钟分频寄存器//锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/(REFDV+1)//对于S12XDP51216MHz外部晶体振荡器,总线时钟为24MHz//片内系统时钟为48MHz/*等待锁相环频率锁定*/while((CRGFLG&0x08)!=0x08);CLKSEL|=0x80;//时钟选择寄存器asmcli}voidmain(void){unsignedcharx,y,k;unsignedcharKB_Value;MCUInit();//初始化系统时钟SCI_Init();DDRB=0XFF;PORTB=0XFF;for(;;){DDRA=0xff;//将A口设置为输出状态PORTA=0x0f;//PA7..PA4输出0,PA3...PA0输出1//这时按键的电平状态//||||//|1|2|3|4//0PA4-----|-----|-----|-----|----//|5|6|7|8//0PA5-----|-----|-----|-----|----//|9|10|11|12//0PA6-----|-----|-----|-----|----//|13|14|15|16//0PA7-----|-----|-----|-----|----//PA0PA1PA2PA3//1111DDRA=0X0f;//PA7..PA4设置为输入,PA3...PA0设置为输出asmNOP//空指令延时用asmNOP//空指令延时用x=PORTA;//取按键值(行值)//例如://下图ABCD任意位置有按下下的按键,也就是PA4和PA0或PA1或PA2或PA3接一块了,//又因为PA7...PA4为输入,那么,这时PA0或PA1或PA2或PA3输出的1就被PA4读入,//也就是说单片机能够判断出:PA4这一条横线上有按键按下;//||||//|1|2|3|4//0PA4-----A-----B-----C-----D----//|5|6|7|8//0PA5-----|-----|-----|-----|----//|9|10|11|12//0PA6-----|-----|-----|-----|----//|13|14|15|16//0PA7-----|-----|-----|-----|----//PA0PA1PA2PA3//1111//这样检测到PA4有按键按下了,即PA4=1;PA5=0;PA6=0;PA7=0;x&=0Xf0;//判断取的按键是否取到值(即是否有键按下)//这时x=0x10;(即二进制的00010000)if(x)//如果行上检测到有按键按下了,再进去检测按下的按键在哪一列上{dely();//经过一个小延时,再进行检测DDRA=0xff;//将A口设置为输出状态PORTA=0Xf0;//PA7..PA4输出1,PA3...PA0输出0//这时按键的电平状态//||||//|1|2|3|4//1PA4-----|-----|-----|-----|----//|5|6|7|8//1PA5-----|-----|-----|-----|----//|9|10|11|12//1PA6-----|-----|-----|-----|----//|13|14|15|16//1PA7-----|-----|-----|-----|----//PA0PA1PA2PA3//0000DDRA=0Xf0;//PA7..PA4设置为输出,PA3...PA0设置为输入asmNOP//空指令延时用asmNOP//空指令延时用asmNOP//空指令延时用asmNOP//空指令延时用//例如://下图A位置的按键按下,也就是PA4和PA0接一块了,//又因为PA3...PA0为输入,那么,这时PA4输出的1就被PA0读入,//也就是说单片机能够判断出:PA0这一条纵线上有按键按下;//||||//|1|2|3|4//0PA4-----A-----|-----|-----|----//|5|6|7|8//0PA5-----|-----|-----|-----|----//|9|10|11|12//0PA6-----|-----|-----|-----|----//|13|14|15|16//0PA7-----|-----|-----|-----|----//PA0PA1PA2PA3//1111y=PORTA;//取按键值(列值)//这样检测到PA3有按键按下了,即PA0=1;PA1=0;PA2=0;PA3=0;y=y&0x0f;//判断取的按键是否取到值(即是否有键按下)//这时y=0x01;(即二进制的00000001)if(y){KB_Value=y|x;//(列行合成的值)//x与y相或之后,得到的KB_Value=0x10|0x01=0x11;(即00010001)//PORTB=KB_Value;//对应灯亮k=KeyDecoe(KB_Value);//键值转换//运行完上面这个函数,回来的值就是k=1;即判断到A处的1号按键按下。//OK,其他案件同理可得。//自己分析下吧。。。。。。PORTB=k;//对应灯亮put_char(k);//键值显示,在超级终端上的显示put_char('');}else{}}else{}}}voidSCI_Init(void){unsignedchart;//定义波特率Bt=9600,SCI0BD=fBUS/(16*Bt)SCI0BDL=0x9c;//须先给低8位赋值SCI0BDH=0x00;//再给高8位赋值SCI0CR1=0x00;//设置允许SCI,正常码输出,8位数据,无校验t=SCI0DRL;//读数据寄存器(清0)t=SCI0SR1;//读状态寄存器(清0)SCI0CR2=0x2C;//允许SCI0接收和发送查询方式}voidput_char(unsignedcharc)//母板键盘上输入{while((SCI0SR1&0X80)==0);//当D7=1时,说明要发送的数据已经移入移位寄存器//数据寄存器为空,可以发送新的数据SCI0DRL=c;}voiddely(void)//延时{inti,k;for(i=1;i900;i++){for(k=1;k600;k++){}}}unsignedcharKeyDecoe(unsignedcharKB_Value)//键码转换{unsignedcharKeyPress;KeyPress=0x00;switch(KB_Value){case(0X11):KeyPress=0x01;break;case(0X12):KeyPress=0x02;break;case(0X14):KeyPress=0x03;break;case(0X18):KeyPress=0x04;break;case(0X21):KeyPress=0x05;break;case(0X22):KeyPress=0x06;break;case(0X24):KeyPress=0x07;break;case(0X28):KeyPress=0x08;break;case(0X41):KeyPress=0x09;break;case(0X42):KeyPress=0x0A;break;case(0X44):KeyPress=0x0B;break;case(0X48):KeyPress=0x0C;break;case(0X81):KeyPress=0x0D;break;case(0X82):KeyPress=0x0E;break;case(0X84):KeyPress=0x0F;break;case(0X88):KeyPress=0x10;break;default:KeyPress=0xff;break;}return(KeyPress);}
本文标题:利用反转法进行矩阵式按键及键值转换详解
链接地址:https://www.777doc.com/doc-2608988 .html