原创 串口同步模式接收PS2键盘解码数据

2011-3-24 20:56 3797 11 11 分类: MCU/ 嵌入式

attachment download




PS2协议的介绍,可以看看




看了PS2的资料,发现操作时序图和串口的同步工作模式是一样的,只要在串口同步模式下用CLK的下降沿采集数据即可将PS2键盘发过来的通码放到缓冲寄存器里面,然后通过串口的接收中断,在中断服务程序里面将这个数据读走,最后将通码解码,显示。。。编译环境:ICCAVR 内部晶振:8MHZ 源代码如下:


 #include<iom128v.h>


 #include<macros.h>


 #include"Mydelay.h"


#include"shumaguan.h" //数码管显示头文件


unsigned char dat;


 unsigned int key_data;


 void get_UDR(void) //解码函数


{ switch(dat)


 { case 0x70: key_data=0;break;


case 0x69: key_data=1;break;


 case 0x72: key_data=2;break;


case 0x7a: key_data=3;break;


 case 0x6b: key_data=4;break;


 case 0x73: key_data=5;break;


case 0x74: key_data=6;break;


 case 0x6c: key_data=7;break;


case 0x75: key_data=8;break;


 case 0x7d: key_data=9;break;


 default:break; }


 }


void init_port(void)


{ DDRE &= ~((1<<PE0) | (1<<PE2)); //PE0是RXD0管脚,用于接收PS2发来的通码数据


//PE2是XCK0管脚,在串口同步模式下面使用,作为时钟信号


 //从机模式是接收时序,由PS2发送CLK


}


 void init_uart0(void)


 { UCSR0B = 0x00; //关闭UART00


 // UCSR0A = 0x00; //不使用倍速发送(异步)


UCSR0C |=(1<<UCSZ01)|(1<<UCSZ00); //数据位为8位


UCSR0C |=(1<<UMSEL0); //用同步模式的从机模式


  UCSR0C |=(1<<UCPOL0); //下降沿采集数据


 // UBRR0L=(fosc/16/(baud+1))%256; //异步正常情况下的计算公式


// UBRR0H=(fosc/16/(baud+1))/256;


UCSR0B |=(1<<RXCIE0) | (1<<RXEN0); //接收使能和接收中断使能


 } void main(void)


 {


CLI(); //关闭总中断


init_port(); //端口初始化


HC_595_init(); //数码管显示的初始化


init_uart0(); //串口0初始化


SEI(); //开启总中断


while(1)


 { get_UDR(); //解码函数


Seg7_Led_display(key_data); //数码管显示函数


 }


}


 


 #pragma interrupt_handler USART0_RX:19//串口接收中断


void USART0_RX(void)


 { dat=UDR0; //接收中断产生后将缓冲器的值读出赋给dat }

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条