📄 ps2.c
字号:
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"
#include "2410IIC.h"
/*
* PS/2鼠标:
* TCLK : GPG11
* DATA : GPB3
* PS/2键盘:
* TCLK : GPB4
* DATA : GPB2
*/
/* 键盘 */
#define PS2_KBD_SET_CLK_OUT rGPBCON = rGPBCON & (~ (0x3 << 8)) | (0x01 << 8) /* 设置时钟线为输出 */
#define PS2_KBD_SET_CLK_INPUT rGPBCON &= ~ (0x3 << 8)/* 设置时钟线为输入 */
#define PS2_KBD_SET_DATA_OUT rGPBCON = rGPBCON & (~ (0x3 << 4)) | (0x01 << 4)/* 设置数据线为输出 */
#define PS2_KBD_SET_DATA_INPUT rGPBCON &= ~ (0x3 << 4)/* 设置数据线为输入 */
#define PS2_KBD_CLK_READ() ((rGPBDAT) & (1 << 4)) >> 4 /* 获取时钟信号 */
#define PS2_KBD_CLK_WRITE(CLK) rGPBDAT = rGPBDAT & (~(1 << 4)) | (CLK << 4) /* 输出时钟 */
#define PS2_KBD_DATA_READ() ((rGPBDAT) & (1 << 2)) >> 2 /* 从数据线读数据 */
#define PS2_KBD_DATA_WRITE(DATA) rGPBDAT = rGPGDAT & (~(1 << 2)) | (DATA << 2) /* 往数据线写数据 */
/* 鼠标 */
#define PS2_MOUSE_SET_CLK_OUT /*rGPGUP &= ~(1 << 11);*/ rGPGCON = rGPGCON & (~ (0x3 << 22)) | (0x01 << 22) /* 设置时钟线为输出 */
#define PS2_MOUSE_SET_CLK_INPUT /*rGPGUP &= ~(1 << 11);*/ rGPGCON &= ~ (0x3 << 22)/* 设置时钟线为输入 */
#define PS2_MOUSE_SET_DATA_OUT /*rGPBUP &= ~(1 << 3);*/ rGPBCON = rGPBCON & (~ (0x3 << 6)) | (0x01 << 6)/* 设置数据线为输出 */
#define PS2_MOUSE_SET_DATA_INPUT /*rGPBUP &= ~(1 << 3);*/ rGPBCON &= ~ (0x3 << 6)/* 设置数据线为输入 */
#define PS2_MOUSE_CLK_READ() ((rGPGDAT) & (1 << 11)) >> 11 /* 获取时钟信号 */
#define PS2_MOUSE_CLK_WRITE(CLK) rGPGDAT = rGPGDAT & (~(1 << 11)) | (CLK << 11) /* 输出时钟 */
#define PS2_MOUSE_DATA_READ() ((rGPBDAT) & (1 << 3)) >> 3 /* 从数据线读数据 */
#define PS2_MOUSE_DATA_WRITE(DATA) rGPBDAT = rGPGDAT & (~(1 << 3)) | (DATA << 3) /* 往数据线写数据 */
#define PS2_HIGH 1 /* 高电平 */
#define PS2_LOW 0 /* 低电平 */
/********************************************************************
// Function name : PS2_Mouse_Init
// Description : PS/2鼠标设备初始化
// Return type : void
// Argument :
*********************************************************************/
void PS2_Mouse_Init()
{
// 鼠标初始化:
// 设置时钟线为输出并输出低电平
// 设置数据线为输出并输出低电平
PS2_MOUSE_SET_CLK_OUT;
PS2_MOUSE_CLK_WRITE(PS2_LOW);
PS2_MOUSE_SET_DATA_OUT;
PS2_MOUSE_DATA_WRITE(PS2_LOW);
/////////////////////////////////
Delay(100);
PS2_MOUSE_SET_DATA_INPUT;
Delay(1);
PS2_MOUSE_SET_CLK_INPUT;
}
/********************************************************************
// Function name : PS2_Mouse_Get_Bit
// Description : 从PS/2鼠标设备读取一个Bit
// Return type : char
// Argument : void
*********************************************************************/
char PS2_Mouse_Get_Bit(void)
{
char clk, bit;
// // 设置时钟线为输出,并输出高电平以激活设备输出
// PS2_MOUSE_SET_CLK_OUT;
// PS2_MOUSE_CLK_WRITE(PS2_HIGH);
// 释放时钟线
PS2_MOUSE_SET_CLK_INPUT;
// 等待时钟线变为低电平
do
{
clk = PS2_MOUSE_CLK_READ();
}while(clk);
// 读取数据
bit = PS2_MOUSE_DATA_READ();
// 设置时钟线为输出,并输出低电平以抑制设备输出
PS2_MOUSE_SET_CLK_OUT;
PS2_MOUSE_CLK_WRITE(PS2_LOW);
return bit;
}
/********************************************************************
// Function name : PS2_Mouse_Get_Byte
// Description : 从PS/2鼠标读取一个字节
// Return type : char
// Argument : void
*********************************************************************/
char PS2_Mouse_Get_Byte(void)
{
int loopcnt;
char bit, data = 0;
// 设置数据线为输入
PS2_MOUSE_SET_DATA_INPUT;
bit = PS2_Mouse_Get_Bit(); // 开始位
// 数据位
for(loopcnt = 0; loopcnt < 8; loopcnt++)
{
data = (PS2_Mouse_Get_Bit() << loopcnt) | data;
}
bit = PS2_Mouse_Get_Bit(); // 结束位
return data;
}
void Test_PS2_Mouse(void)
{
// PS2_MOUSE_SET_DATA_INPUT;
// PS2_MOUSE_SET_CLK_INPUT;
//
// PS2_MOUSE_SET_DATA_OUT;
// PS2_MOUSE_SET_CLK_OUT;
// while(1)
// {
// PS2_MOUSE_DATA_WRITE(PS2_HIGH);
// PS2_MOUSE_CLK_WRITE(PS2_HIGH);
// Uart_Printf("High\n");
// Delay(100);
// PS2_MOUSE_DATA_WRITE(PS2_LOW);
// PS2_MOUSE_CLK_WRITE(PS2_LOW);
// Uart_Printf("Low\n");
// Delay(100);
// };
//while(1);
PS2_Mouse_Init();
Delay(100);
// PS2_MOUSE_SET_CLK_INPUT;
// while(1);
while(1)
{
char ch;
ch = PS2_Mouse_Get_Byte();
Uart_Printf("From Mouse 0x%x\n", ch);
Delay(100);
}
}
void Test_PS2_Keyboard(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -