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条评论)
登录后参与讨论