完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
/*01010101010101010101010101010101010101010101010101010101010101010101
---------------------------------------------------------------------- 版本更新记录: ---------------------------------------------------------------------- 实验内容: 按PC键盘,观察单片机读到的数据,使用PA/PB口的LED做指示。 ---------------------------------------------------------------------- 硬件连接: 将PA/PB口的LED指示灯使能开关切换到“ON”状态 将PC键盘插入PS2接口,将PD3与PS2.SDA连接,将PD4与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 DDRB #define SHIFT_DATA_PORT PORTB #define SET_SDA ***i(PORTD,4) #define CLR_SDA cbi(PORTD,4) #define GET_SDA gbi(PIND,4) #define OUT_SDA ***i(DDRD,4) #define IN_SDA cbi(DDRD,4) #define SET_SCK ***i(PORTD,3) #define CLR_SCK cbi(PORTD,3) #define GET_SCK gbi(PIND,3) #define OUT_SCK ***i(DDRD,3) #define IN_SCK cbi(DDRD,3) bool rcvF = 0; //是否收到字符标志 uint8 keyVal; //键值 /*-------------------------------------------------------------------- 函数名称:PS/2 函数功能: 注意事项: 提示说明: 输 入: 返 回: --------------------------------------------------------------------*/ #pragma interrupt_handler int1_isr:3 void int1_isr(void) { static uint8 rcvBits = 0; //接收次数,中断次数 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; //标识有字符已经输入 } } /*-------------------------------------------------------------------- 函数名称:PS/2 函数功能: 注意事项: 提示说明: 输 入: 返 回: --------------------------------------------------------------------*/ 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; } } } /*-------------------------------------------------------------------- 函数名称:PS/2 函数功能: 注意事项: 提示说明: 输 入: 返 回: --------------------------------------------------------------------*/ void int1_init() { IN_SCK; // set SCK_DDR (PD3/INT1) as input SET_SCK; // set SCK_PORT as high level,avoid triggering MCUCR |= 0b11110011; // set PD3/INT1 as low level active GICR |= 0b10000000; // enable global interrupt SEI(); // enable external interrupt } /*-------------------------------------------------------------------- 函数名称:PS/2 函数功能: 注意事项: 提示说明: 输 入: 返 回: --------------------------------------------------------------------*/ void main(void) { PRESS_DATA_DDR = 0XFF; SHIFT_DATA_DDR = 0XFF; IN_SDA; int1_init(); while(1) { if(rcvF) keyHandle(keyVal); } } |
|
|
|
只有小组成员才能发言,加入小组>>
683 浏览 1 评论
2113 浏览 5 评论
2420 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2186 浏览 6 评论
2158 浏览 7 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
307浏览 9评论
295浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
431浏览 6评论
295浏览 5评论
344浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-19 03:30 , Processed in 0.811456 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号