完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
|
|
相关推荐
1个回答
|
|
|
版本更新记录:
---------------------------------------------------------------------- 实验内容: 按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 ***i(PORTB,0) #define CLR_SDA cbi(PORTB,0) #define GET_SDA gbi(PINB,0) #define OUT_SDA ***i(DDRB,0) #define IN_SDA cbi(DDRB,0) #define SET_SCK ***i(PORTB,1) #define CLR_SCK cbi(PORTB,1) #define GET_SCK gbi(PINB,1) #define OUT_SCK ***i(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[0]!=val && unshifted[0]; i++) ; 上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法 */ for(i=0; unshifted[0]!=val && i《59; i++) ; if(unshifted[0] == val) ; //状态指示 } else // If shift pressed { /* for(i=0; unshifted[0]!=val && unshifted[0]; i++) ; 上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法 */ for(i=0; shifted[0]!=val && i《59; i++) ; if(shifted[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); } } |
|
|
|
|
只有小组成员才能发言,加入小组>>
1018 浏览 1 评论
1849 浏览 0 评论
1830 浏览 1 评论
3254 浏览 5 评论
3581 浏览 9 评论
1020浏览 1评论
1849浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1359浏览 1评论
1851浏览 0评论
1177浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:51 , Processed in 0.640213 second(s), Total 74, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1189