主要問題在於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<
//0000 0000 0000 1111 移位取反 1111 1111 1111 0000
#define gph2_1_intput ~(0xf<
//0000 0000 0000 1111 移位取反 1111 1111 0000 1111
#define gph2_2_intput ~(0xf<
//0000 0000 0000 1111 移位取反 1111 0000 1111 1111
#define gph2_3_intput ~(0xf<
//0000 0000 0000 1111 移位取反 0000 1111 1111 1111
#define gph3_0_intput ~(0xf<
#define gph3_1_intput ~(0xf<
#define gph3_2_intput ~(0xf<
#define gph3_3_intput ~(0xf<
void key_init();
int key_check(int pin);
#endif //_key_h_
key.c
#include"key.h"
/* 按鍵初始化函式 */
void key_init()
int key_check(int pin)
/*pin 等於1的時候 如果tempdat1為1111,&運算後為1,表示沒有被按下*/
return i;//被按下了
}
if語句暫時無法理解,pin是指的1-8個按鍵鍵
tempdat1表示的是1-4號按鍵,tempdat2表示的是5-8號按鍵。
如果pin=1的時候:
如果1號鍵沒有被按下,
tempdat1
低四位為1111 第乙個表示式結果為 1根據短路表示式規則此時不會判斷第二個語句。
所以在檢驗1-4按鍵的時候如果沒有被按下,第二個語句不起作用。
如果1號鍵被按下,
tempdat1
低四位為1110 第乙個表示式結果為0,所以開始判斷第二個語句,代入後裡面包含了1<
所以這樣似乎不妥。 這樣函式有待改進,增強移植性。為了驗證左右移位數為負數的情況,在電腦上實驗:
結果是
符合c和指標書中提到的可能的結果。實際做的是i<
不符合語言的標準,不過通過結果來看,宣告的是乙個無符號字元,本來佔據乙個位元組的空間大小。但是結果卻至少佔據四個位元組。
如果這個變數的位址前面的相鄰的空間已經分配給其他變數,這樣操作似乎會改變這些變數的值,而且是莫名奇妙的沒有提示的情況下改變的。。。
視C 為乙個語言聯邦
c 是個多重泛型程式語言,同時支援以下形式的語言 1 過程形式 2 物件導向形式 3 函式形式 4 泛型形式 5 元程式設計形式。理解c 的方法 將c 視為乙個由相關語言組成的聯邦而非單一語言。在其某個次語言中,各種守則與通例都傾向簡單 直觀易懂 並且容易記住。當從乙個次語言移至另乙個次語言,守則可...
條款01 視C 為乙個語言聯邦
條款01 視c 為乙個語言聯邦 view c as a federation of languages 內容 今天的c 已經是個多重範形程式語言 multiparadigm programming language 乙個同時支援過程形式 procedural 物件導向形式 object orient...
條款1 視C 為乙個語言聯邦
view c as a federation of languages.今天的c 已經是個多重范型程式語言 multiparadigm programming language 乙個同時支援過程形式 procedural 物件導向形式 object oriented 函式形式 functional ...