?? h26.c
字號:
#include <reg51.h>
#define LEDLen 6
#define PB1 2
#define PB0 1
#define mode 0x82
xdata unsigned char CTL _at_ 0x8003;
xdata unsigned char PA _at_ 0x8000;
xdata unsigned char OUTBIT _at_ 0x9002; // 位控制地址
xdata unsigned char OUTSEG _at_ 0x9004; // 段控制地址
xdata unsigned char IN _at_ 0x9001;
unsigned char LEDBuf[LEDLen];
code unsigned char LEDMAP[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
void Delay(unsigned char CNT)
{
unsigned char i;
while (CNT-- !=0)
for (i=100; i !=0; i--);
}
void DisplayLED()
{
unsigned char i, j;
unsigned char Pos;
unsigned char LED;
// 初始位置為右邊
Pos = 0x20;
for (i = 0; i < LEDLen; i++) {
// 關閉所顯示位
OUTBIT = 0;
// 取出顯示數據
LED = LEDBuf[i];
OUTSEG = LED;
// 輸出位選通信號,選擇一位LED點亮
OUTBIT = Pos;
// 延時
Delay(1);
// 移位,選擇下一位LED準備點亮
Pos >>= 1;
}
OUTBIT = 0;
}
code unsigned char KeyTable[] = {
0x16, 0x15, 0x14, 0xff,
0x13, 0x12, 0x11, 0x10,
0x0d, 0x0c, 0x0b, 0x0a,
0x0e, 0x03, 0x06, 0x09,
0x0f, 0x02, 0x05, 0x08,
0x00, 0x01, 0x04, 0x07
};
unsigned char TestKey()
{
//輸出列掃描信號
OUTBIT = 0;
//讀入行信號
return (~IN & 0x0f);
}
unsigned char GetKey()
{
unsigned char Pos;
unsigned char i;
unsigned char k;
// 共掃描6列
i = 6;
Pos = 0x20;
do {
// 輸出列掃描信號
OUTBIT = ~ Pos;
// 移位,準備掃描下一列
Pos >>= 1;
// 讀入行值
k = ~IN & 0x0f;
// 當6列掃描完或讀到行值時,退出
} while ((--i != 0) && (k == 0));
//如果有鍵輸入
if (k != 0) {
// 列值x4 + 行值 為鍵值
i *= 4;
if (k & 2)
i += 1;
else if (k & 4)
i += 2;
else if (k & 8)
i += 3;
OUTBIT = 0;
// 等待按鍵松開
do Delay(10); while (TestKey());
// 根據鍵值查表得到鍵碼,并返回鍵碼
return(KeyTable[i]);
} else return(0xff);
}
/* =============================*/
#define UP 0x16
#define DOWN 0x15
#define LowLimit 10
#define HighLimit 30
#define LowTemp (-40) // A/D 0
#define HighTemp 50 // A/D 255
#define Heat 1
#define Cool 2
xdata unsigned char ADPort _at_ 0xa000;
signed char SetTemp, CurTemp;
void DisplayResult()
{
signed char T;
T = CurTemp;
if (T < 0) {
//如果溫度低于零度,顯示'-'號
LEDBuf[0] = 0x40;
T = - T;
} else LEDBuf[0] = 0;
//顯示溫度十位數
LEDBuf[1] = LEDMAP[T / 10];
//顯示溫度個位數
LEDBuf[2] = LEDMAP[T % 10];
LEDBuf[3] = 0;
//后兩位顯示設定溫度
LEDBuf[4] = LEDMAP[SetTemp / 10];
LEDBuf[5] = LEDMAP[SetTemp % 10];
}
unsigned char ReadAD()
{
unsigned int i;
// 啟動A/D變換
ADPort = 0;
//延時100us,
for (i=0; i<20; i++) ;
//得到A/D采樣值
return (ADPort);
}
void ReadTemp()
{
unsigned char i;
signed int Temp;
Temp = 0;
//采樣16次,取平均數
for (i=0; i<16; i++) {
Temp += ReadAD();
};
//AD采樣值轉換為實際溫度
CurTemp = (Temp/16) * (HighTemp-LowTemp) / 256 + LowTemp;
}
void main()
{
unsigned char Key;
CTL = mode;
//初始設定溫度為20
SetTemp = 20;
while (1) {
while (!TestKey()) {
// 當前溫度和設定溫度送顯示緩沖
DisplayResult();
// 顯示當前溫度和設定溫度
DisplayLED();
// 讀入當前溫度
ReadTemp();
// 如果當前溫度低于設定溫度2度
// 則開動加熱電機
if (CurTemp < (SetTemp - 2)) {
PA = Heat ;
} else
// 如果當前溫度高于設定溫度2度
// 則開動致冷電機
if (CurTemp > (SetTemp + 2)) {
PA = Cool;
} else {
// 在設定溫度+/- 2度內
// 無需開動電機
PA = 0;
}
}
// 讀鍵盤
Key = GetKey();
if (Key == DOWN) {
// 設定溫度向下調低
if (SetTemp > LowLimit) SetTemp--;
} else if (Key == UP) {
// 設定溫度向上調高
if (SetTemp < HighLimit) SetTemp++;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -