做溫度計的實驗
可以在keil上調試全速運行數碼管有顯示
但是 燒錄到單片機就沒辦法了
/****************************************************************** ** FileName: 溫度測量實驗 ** Copyright (c) 2000-2011 **** The company technology development department ** Creater: ** Date: ** Modifier: ZQS ** Date: 2011-7 ** Comment: QQ群:154270214 ** version: VER 1.0 ********************************************************************/ #include <absacc.h> //包含了絕對地址訪問的宏定義 #include <reg51.h> #define LEDLen 6 #define MODE 0x03 #define CS0809 XBYTE[0xa000] // YC2片選ad0809 定義數組符CS0809的實際含義為XBYTE[0xa000],即實際地址為外部尋址空間中的0xa000 #define CAddr XBYTE[0xe100] // 8155命令控制字地址 #define OUTBIT XBYTE[0xe101] // 位控制口 8155PA口 #define CLK164 XBYTE[0xe102] // 段控制口(接164時鐘位)8155PB口 #define DAT164 XBYTE[0xe102] // 段控制口(接164數據位) #define IN XBYTE[0xe103] // 鍵盤讀入口 8155PB口 unsigned char LEDBuf[LEDLen]; // 顯示緩沖 code unsigned char LEDMAP[] = { // 八段管顯示碼 0-F 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; /***************************************************************** ** Function: Delay ** Input: unsigned char CNT ** Output: ** Description: 延時函數 ****************************************************************/ void Delay(unsigned char CNT) { unsigned char i; //定義一個無符號變量 while (CNT-- !=0) //while判斷語句 for (i=100; i !=0; i--); //for循環 } /***************************************************************** ** Function: DisplayLED() 數碼管顯示函數 ** Input: ** Output: ** Description: 通過164串入并出輸出數碼管段碼,通過Pos移位操作給出位碼 ****************************************************************/ void DisplayLED() { unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; // 從左邊開始顯示 for (i = 0; i < LEDLen; i++) { OUTBIT = 0; // 關所有八段管 LED = LEDBuf; for (j = 0; j < 8; j++) { // 送164 串入并出高位移出操作 if (LED & 0x80) DAT164 = 1; else DAT164 = 0;//如果高位為一則選擇,輸出dat引腳輸出為高否則為1 CLK164 = CLK164|0x02; // PB1=1時鐘傳送 CLK164 = CLK164&0xfd; // PB1=0 LED <<= 1; } OUTBIT = Pos; // 顯示一位八段管 Delay(1); Pos >>= 1; // 顯示下一位 } OUTBIT = 0; // 關所有八段管 } unsigned char Read0809() { unsigned char i; CS0809 = 0; // 起動 A/D for (i=0; i<0x20; i++) ; // 延時 > 100us return(CS0809); // 讀入結果 } /***************************************************************** ** Function: main() ** Input: ** Output: ** Description: ****************************************************************/ void main() { unsigned char j; CAddr= MODE; while(1) { //數碼管初始化“H---00” LEDBuf[0] = 0Xb8; LEDBuf[1] = 0X40; LEDBuf[2] = 0X40; LEDBuf[3] = 0X40; LEDBuf[4] = 0X00; LEDBuf[5] = 0X00; LEDBuf[5] = LEDMAP[Read0809() & 0x0f] ; // 數碼管個位顯示 LEDBuf[4] = LEDMAP[Read0809()>>4 & 0x0f] ; // 數碼管十位顯示 for(j=0; j<5; j++) DisplayLED(); //數碼管顯示函數調用 } }
|