利用反转法进行矩阵式按键及键值转换详解_第1页
利用反转法进行矩阵式按键及键值转换详解_第2页
利用反转法进行矩阵式按键及键值转换详解_第3页
利用反转法进行矩阵式按键及键值转换详解_第4页
利用反转法进行矩阵式按键及键值转换详解_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用反转法进行矩阵式按键扫描及键值转换详解/*/工 程 名:键盘实验 */工程描述: 在实验板上连接小键盘接口的连线,采用反转法(查询方式)识别小键盘上按下的各键,/ 并将其对应的按键状态用八个发光二极管来显示,并在超级终端上显示。 /注 意:本程序实现的硬件平台为MC9S12XDP512应用开发平台。应用开发平台使用16MHZ的有源晶振 */说 明:程序使用的片上系统时钟频率,总线时钟由锁相环产生,总线时钟为片上系统时钟的/ 一半,其换算的公式为:fpllclk=2 * fosclk *(SYNR+1)/(REFDV+1)/ 其中fosclk为振荡器频率,SYNR为时钟合成寄存器的值,REF

2、DV为时钟分频寄存器的值/*/#include /* common defines and macros */#include /* derivative information */#pragma LINK_INFO DERIVATIVE mc9s12xdp512void SCI_Init(void);void dely(void);unsigned char KeyDecoe(unsigned char i);void put_char(unsigned char c);void MCUInit(void) asm sei SYNR = 0x02; /时钟合成寄存器 REFDV = 0x0

3、1; /时钟分频寄存器 /锁相环产生的时钟频率f=2*foscclk*(SYNR+1)/(REFDV+1) /对于S12XDP512 16MHz外部晶体振荡器,总线时钟为24MHz /片内系统时钟为48MHz /*等待锁相环频率锁定*/ while(CRGFLG & 0x08) !=0x08); CLKSEL |= 0x80; /时钟选择寄存器 asm clivoid main(void) unsigned char x,y,k; unsigned char KB_Value; MCUInit(); /初始化系统时钟 SCI_Init(); DDRB=0XFF; PORTB=0XFF; for

4、(;) DDRA=0xff; /将A口设置为输出状态 PORTA=0x0f;/PA7.PA4输出0,PA3.PA0输出1 /这时按键的电平状态 / | | | | / | 1 |2 |3 |4 / 0 PA4-|-|-|-|- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16 / 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 DDRA=0X0f; /PA7.PA4设置为输入,PA3.PA0设置为输出 asm NOP /空指令 延时用 a

5、sm NOP /空指令 延时用 x=PORTA; /取按键值(行值) /例如: / 下图 A B C D 任意位置有按下下的按键,也就是PA4和PA0或PA1或PA2或PA3接一块了, / 又因为PA7.PA4为输入,那么,这时PA0或PA1或PA2或PA3输出的1就被PA4读入, / 也就是说单片机能够判断出:PA4这一条横线上有按键按下; / | | | | / | 1 |2 |3 |4 / 0 PA4-A-B-C-D- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16

6、/ 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 /这样检测到PA4有按键按下了,即PA4=1; PA5=0;PA6=0;PA7=0; x&=0Xf0;/判断取的按键是否取到值(即是否有键按下) /这时x=0x10; (即二进制的 0001 0000) if(x)/如果行上检测到有按键按下了,再进去检测按下的按键在哪一列上 dely();/经过一个小延时,再进行检测 DDRA=0xff; /将A口设置为输出状态 PORTA=0Xf0;/PA7.PA4输出1,PA3.PA0输出0 /这时按键的电平状态 / | | | | / | 1 |2 |3 |4 /

7、1 PA4-|-|-|-|- / | 5 |6 |7 |8 / 1 PA5-|-|-|-|- / | 9 |10 |11 |12 / 1 PA6-|-|-|-|- / |13 |14 |15 |16 / 1 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 0 0 0 0 DDRA=0Xf0;/PA7.PA4设置为输出,PA3.PA0设置为输入 asm NOP /空指令 延时用 asm NOP /空指令 延时用 asm NOP /空指令 延时用 asm NOP /空指令 延时用 /例如: / 下图 A 位置的按键按下,也就是PA4和PA0接一块了, / 又因为PA3.PA0为输

8、入,那么,这时PA4输出的1就被PA0读入, / 也就是说单片机能够判断出:PA0这一条纵线上有按键按下; / | | | | / | 1 |2 |3 |4 / 0 PA4-A-|-|-|- / | 5 |6 |7 |8 / 0 PA5-|-|-|-|- / | 9 |10 |11 |12 / 0 PA6-|-|-|-|- / |13 |14 |15 |16 / 0 PA7-|-|-|-|- / PA0 PA1 PA2 PA3 / 1 1 1 1 y=PORTA; /取按键值(列值) /这样检测到PA3有按键按下了,即PA0=1; PA1=0;PA2=0;PA3=0; y=y&0x0f; /判

9、断取的按键是否取到值(即是否有键按下) /这时y=0x01; (即二进制的 0000 0001) if(y) KB_Value=y|x; /(列行合成的值) /x与y相或之后,得到的 KB_Value=0x10 | 0x01 = 0x11;(即 0001 0001)/ PORTB=KB_Value; /对应灯亮 k=KeyDecoe(KB_Value);/键值转换 /运行完上面这个函数,回来的值就是 k=1;即判断到A处的1号按键按下。 /OK,其他案件同理可得。 /自己分析下吧。 PORTB=k; /对应灯亮 put_char(k); /键值显示,在超级终端上的显示 put_char( );

10、 else else void SCI_Init(void) unsigned char t; /定义波特率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接收和发送 查询方式void put_char(unsigned char c) /母板键盘上输入while

11、 (SCI0SR1 & 0X80)=0);/当D7=1时,说明要发送的数据已经移入移位寄存器 /数据寄存器为空,可以发送新的数据SCI0DRL=c;void dely(void) /延时 int i,k; for(i=1;i900;i+) for(k=1;k600;k+) unsigned char KeyDecoe(unsigned char KB_Value) /键码转换 unsigned char KeyPress; KeyPress=0x00; switch(KB_Value) case(0X11): KeyPress=0x01;break; case(0X12): KeyPress=

12、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=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论