⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.c

📁 S3C2410例子程序
💻 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 + -