一个按键检测与C语言的移位数为负的认识

主要问题在于C语言里面的移位操作数为负数的时候,不清楚、
key.h 

/*板上按键GPH2_0-GPH2_3 ,GPH3_0-GPH3_3
其中GPH2_0 标注back GPH2_1 标注home GPH2_2 标注menu*/
#ifndef _KEY_H_
#define _KEY_H_

/*KEY pins*/
#define GPH2CON (*(volatile unsigned long *) 0xE0200C40)
#define GPH2DAT(*(volatile unsigned long *) 0xE0200C44)

#define GPH3CON (*(volatile unsigned long *) 0xE0200C60)
#define GPH3DAT(*(volatile unsigned long *) 0xE0200C64)
/*下面这是对con寄存器的操作*/
#define GPH2_0_INTPUT ~(0xf<<(0*4))
//0000 0000 0000 1111  移位取反 1111 1111 1111 0000
#define GPH2_1_INTPUT ~(0xf<<(1*4))
//0000 0000 0000 1111  移位取反 1111 1111 0000 1111
#define GPH2_2_INTPUT ~(0xf<<(2*4))
//0000 0000 0000 1111  移位取反 1111 0000 1111 1111
#define GPH2_3_INTPUT ~(0xf<<(3*4))
//0000 0000 0000 1111  移位取反 0000 1111 1111 1111
#define GPH3_0_INTPUT ~(0xf<<(0*4))
#define GPH3_1_INTPUT ~(0xf<<(1*4))
#define GPH3_2_INTPUT ~(0xf<<(2*4))
#define GPH3_3_INTPUT ~(0xf<<(3*4))

void key_init();
int key_check(int pin);

#endif //_KEY_H_

key.c
#include"key.h"

/* 按键初始化函数 */
void key_init()
{
/* 设置8个按键引脚为输入状态 */
GPH2CON = GPH2_0_INTPUT&GPH2_1_INTPUT&GPH2_2_INTPUT&GPH2_3_INTPUT;
GPH3CON = GPH3_0_INTPUT&GPH3_1_INTPUT&GPH3_2_INTPUT&GPH3_3_INTPUT;

/*设置按键初始状态为高电平,当按键按下时变为低电平 */
GPH2DAT = 0xF;//设置第四位
GPH3DAT = 0xF;//设置第四位
}

int key_check(int pin)
{
volatile unsigned long tempDat1,tempDat2;//使用unsigned long 是为了防止移位造成的越界
int i = 0;
/*虽然对GPH2DAT和GPH3DAT操作*但是设置读的位是低四位,其他位无影响*/
tempDat1 = GPH2DAT;  // 读取K1~K4的状态,0表示按下
tempDat2 = GPH3DAT;  // 读取K5~K8的状态,0表示按下
if((tempDat1 & (1 << (pin-1)*1))||(tempDat2 & (1 << (pin-5)*1)))//没有被按下
{
i = 1;
return i;
}
/*pin 等于1的时候 如果tempDat1为1111,&运算后为1,表示没有被按下*/
return i;//被按下了
}


if语句暂时无法理解,pin是指的1-8个按键键
一个按键检测与C语言的移位数为负的认识_第1张图片

tempDat1表示的是1-4号按键,tempDat2表示的是5-8号按键。
如果pin=1的时候:
    如果1号键没有被按下, tempDat1 低四位为1111 第一个表达式结果为 1根据短路表达式规则此时不会判断第二个语句。 所以在检验1-4按键的时候如果没有被按下,第二个语句不起作用。
    如果1号键被按下,
tempDat1 低四位为1110 第一个表达式结果为0,所以开始判断第二个语句,代入后里面包含了1<<-4,这个不知道结果是什么。根据C和指针第二版
一个按键检测与C语言的移位数为负的认识_第2张图片 
所以这样似乎不妥。 这样函数有待改进,增强移植性。为了验证左右移位数为负数的情况,在电脑上实验:
 


一个按键检测与C语言的移位数为负的认识_第3张图片
结果是
一个按键检测与C语言的移位数为负的认识_第4张图片
 一个按键检测与C语言的移位数为负的认识_第5张图片
符合C和指针书中提到的可能的结果。实际做的是i<<(32-k);这是编译器决定的,没有什么标准可以推理。
不符合语言的标准,不过通过结果来看,声明的是一个无符号字符,本来占据一个字节的空间大小。但是结果却至少占据四个字节。
如果这个变量的地址前面的相邻的空间已经分配给其他变量,这样操作似乎会改变这些变量的值,而且是莫名奇妙的没有提示的情况下改变的。。。
 

你可能感兴趣的:(嵌入式)