📄 h27.c
字号:
#define LEDLen 6
#define PB1 2
#define PB0 1
xdata unsigned char OUTBIT _at_ 0x9002;
xdata unsigned char OUTSEG _at_ 0x9004; // 段控制口
xdata unsigned char IN _at_ 0x9001;
unsigned char LEDBuf[LEDLen];
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; // trun off all LED
LED = LEDBuf[i];
OUTSEG = LED;
OUTBIT = Pos; // trun on one LED
Delay(1);
Pos >>= 1;
}
}
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;
i = 6;
Pos = 0x20;
do {
OUTBIT = ~ Pos;
Pos >>= 1;
k = ~IN & 0x0f;
} while ((--i != 0) && (k == 0));
if (k != 0) {
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 ADD 0x0a
#define SUB 0x0b
#define MUL 0x0c
#define DIV 0x0d
#define EQU 0x0e
#define CLR 0x0f
void DisplayResult(signed int Result)
{
unsigned char i;
if (Result >= 0) { // 数值大于0
// 不显示符号位
LEDBuf[0] = 0;
} else {
// 在符号位显示 ‘-’
LEDBuf[0] = 0x40;
Result = - Result;
}
LEDBuf[1] = 0;
LEDBuf[2] = 0;
LEDBuf[3] = 0;
LEDBuf[4] = 0;
// 数值对10取模,所得结果为最低位
LEDBuf[5] = LEDMAP[Result % 10]; Result = Result / 10;
i = 4;
// 如果数值除以10后不等于0,继续向高位显示
while (Result != 0) {
LEDBuf[i--] = LEDMAP[Result % 10]; Result = Result / 10;
}
}
void main()
{
signed int Last, Result;
unsigned char OP;
unsigned char Key;
Last = 0;
Result = 0;
OP = ADD;
DisplayResult(Result);
while (1) {
while (!TestKey()) DisplayLED();
// 读取键码
Key = GetKey();
if ( (Key >= 0) && (Key <= 9) ) { // 是数字键
// 输入数值
Result = Result*10 + Key;
// 数值送显示缓冲
DisplayResult(Result);
} else if (Key == CLR) { // 是清零键
// 状态清零
Last = 0;
Result = 0;
OP = ADD;
// 数值送显示缓冲
DisplayResult(Result);
} else if ( (Key==ADD) || (Key==SUB) || (Key==MUL) || (Key==DIV) || (Key=EQU) ) {
// 是功能键
switch (OP) { //上一按键是?
case ADD:
Result = Last + Result;
break;
case SUB:
Result = Last - Result;
break;
case MUL:
Result = Last * Result;
break;
case DIV:
Result = Last / Result;
break;
}
if (Key == EQU) { // 功能键是‘=’
// 计算最后结果
Last = 0;
OP = ADD;
} else { // 是其它功能键
// 保存结果, 保存按键功能
Last = Result;
OP = Key;
}
// 计算值送显示缓冲,
DisplayResult(Result);
// 等待下一个数值输入.
Result = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -