摩尔芯闻 > 行业新闻 > 半导体 > AVR PS/2 软件查询控制程序

AVR PS/2 软件查询控制程序

eefocus ·2020-06-27 00:00·电子工程世界
阅读:1934

/*********************************************************************

目    的:   建立PS/2的SimpleSoft测试程序(软件查询读取PS/2接收到的数据)

目标系统:   基于AVR单片机

应用软件:   ICCAVR

版    本:   Version 1.0

*********************************************************************/


/*01010101010101010101010101010101010101010101010101010101010101010101

----------------------------------------------------------------------

版本更新记录:


----------------------------------------------------------------------

实验内容:

按PC键盘,观察单片机读到的数据,使用PA/PB口的LED做指示。

----------------------------------------------------------------------

硬件连接:

将PA/PB口的LED指示灯使用短路帽短接;

将PC键盘插入PS2接口,

使用短路帽短接PB0与PS2.SDA,

使用短路帽短接PB1与PS2.SCK

----------------------------------------------------------------------

注意事项:

(1)若有加载库函数,请将光盘根目录下的“库函数”下的“ICC_H”文件夹拷到D盘

(2)请详细阅读“使用必读”及相关资料。

----------------------------------------------------------------------

10101010101010101010101010101010101010101010101010101010101010101010*/


#include

#include "D:ICC_HCmmICC.H"

#include "D:ICC_HPS2.H"


#define PRESS_DATA_DDR DDRA

#define PRESS_DATA_PORT PORTA

#define SHIFT_DATA_DDR DDRD

#define SHIFT_DATA_PORT PORTD


#define SET_SDA sbi(PORTB,0)

#define CLR_SDA cbi(PORTB,0)

#define GET_SDA gbi(PINB,0)

#define OUT_SDA sbi(DDRB,0)

#define IN_SDA cbi(DDRB,0)


#define SET_SCK sbi(PORTB,1)

#define CLR_SCK cbi(PORTB,1)

#define GET_SCK gbi(PINB,1)

#define OUT_SCK sbi(DDRB,1)

#define IN_SCK cbi(DDRB,1)


#define DELAY() {NOP();NOP();NOP();NOP();}


bool rcvF = 0; //是否收到字符标志

uint8 keyVal; //键值


/*--------------------------------------------------------------------

函数名称:PS2

函数功能:

注意事项:

提示说明:

输 入:

返 回:

--------------------------------------------------------------------*/

void check(void)

{

static uint8 rcvBits = 0; //接收次数,中断次数


OUT_SCK; //设置"SCK_DDR"为输出

DELAY();

SET_SCK; //"SCK_PORT"输出"1"

DELAY();


IN_SCK; //设置"SCK_DDR"为输入

DELAY();

if(!GET_SCK)

{

if((rcvBits>0) && (rcvBits<9))

{

keyVal=keyVal>>1; //数据是LSB格式

//IN_SDA; //当有对键盘有属性设置时,注意输入输出切换

//DELAY();

if(GET_SDA)

keyVal=keyVal|0x80;

}

rcvBits++;

while(!GET_SCK); //等待PS/2CLK拉高


if(rcvBits>10)

{

rcvBits=0; //接收11次表示接收完一帧数据

rcvF=1; //标识有字符已经输入

}

}

}

/*--------------------------------------------------------------------

函数名称:PS2

函数功能:

注意事项:

提示说明:

输 入:

返 回:

--------------------------------------------------------------------*/

void keyHandle(uint8 val)

{

uint8 i;

static bool isUp=0; //按键释放动作标志

static bool shift=0; //shift键按下标志

rcvF = 0;

PRESS_DATA_PORT = val; //状态指示

if(!isUp)

{

switch(val)

{

case 0xF0 : // a relase action

isUp = 1;

break;

case 0x12 : // Left shift

shift = 1;

break;

case 0x59 : // Right shift

shift = 1;

break;

default:

if(!shift) // If shift not pressed

{

/*

for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)

;

上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法

*/

for(i=0; unshifted[i][0]!=val && i<59; i++)

;

if(unshifted[i][0] == val)

; //状态指示


}

else // If shift pressed

{

/*

for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)

;

上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法

*/

for(i=0; shifted[i][0]!=val && i<59; i++)

;

if(shifted[i][0] == val)

SHIFT_DATA_PORT = val;//状态指示

}

}

}

else

{

isUp=0;

switch(val)

{

case 0x12 : // Left SHIFT

shift = 0;

break;

case 0x59 : // Right SHIFT

shift = 0;

break;

}

}

}

/*--------------------------------------------------------------------

函数名称:PS2

函数功能:

注意事项:

提示说明:

输 入:

返 回:

--------------------------------------------------------------------*/

void main(void)

{

PRESS_DATA_DDR = 0XFF;

SHIFT_DATA_DDR = 0XFF;

IN_SDA;

while(1)

{

check();

if(rcvF)

keyHandle(keyVal);

}

}


关键字: AVR PS 2 软件查询 控制程序 编辑:什么鱼 引用地址: http://news.eeworld.com.cn/mcu/ic501236.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
分享到:
微信 新浪微博 QQ空间 LinkedIn

上一篇:PS/2子程序

下一篇:AVR PS/2 硬件中断控制程序

打开摩尔直播,更多新闻内容
半导体大咖直播分享高清观看
立即下载