|
#include <reg52.h>
sbit P0_0 = P0^0; sbit P0_1 = P0^1; sbit P0_2 = P0^2; sbit P0_3 = P0^3;
sbit P0_4 = P0^4; sbit P0_5 = P0^5; sbit P0_6 = P0^6; sbit P0_7 = P0^7;
#define uchar unsigned char
#define uint unsigned int
uchar code SEGMENT[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
sbit ROW1 = P1^0; sbit ROW2 = P1^1; sbit ROW3 = P1^2; sbit ROW4 = P1^3;
sbit COL1 = P1^4; sbit COL2 = P1^5; sbit COL3 = P1^6; sbit COL4 = P1^7;
uchar display_buf[8] = {0,0,0,0,0,0,0,0};
uchar key_value = 0;
uchar flag_key = 0;
uchar op = 0;
uint num1 = 0, num2 = 0;
uint result = 0;
bit flag_op = 0;
sbit BEEP = P3^7;
uchar code KEY_MAP[4][4] = {
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'C','0','=','+'}
};
void delay_ms(uint ms) {
uint i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
void Timer0_Init(void) {
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
ET0 = 1;
EA = 1;
TR0 = 1;
}
uchar seg_cnt = 0;
void Display_Scan(void) {
P0 = SEGMENT[display_buf[seg_cnt]];
P2 = ~(1 << seg_cnt);
seg_cnt++;
if(seg_cnt >= 8) seg_cnt = 0;
}
void Beep(void) {
BEEP = 1;
delay_ms(50);
BEEP = 0;
}
uchar Key_Scan(void) {
uchar row, col;
ROW1 = ROW2 = ROW3 = ROW4 = 0;
COL1 = COL2 = COL3 = COL4 = 1;
if(COL1 == 0 || COL2 == 0 || COL3 == 0 || COL4 == 0) {
delay_ms(20);
if(COL1 == 0 || COL2 == 0 || COL3 == 0 || COL4 == 0) {
ROW1 = 1; ROW2 = ROW3 = ROW4 = 0;
if(COL1 == 0) { col = 0; row = 0; }
else if(COL2 == 0) { col = 1; row = 0; }
else if(COL3 == 0) { col = 2; row = 0; }
else if(COL4 == 0) { col = 3; row = 0; }
ROW2 = 1; ROW1 = ROW3 = ROW4 = 0;
if(COL1 == 0) { col = 0; row = 1; }
else if(COL2 == 0) { col = 1; row = 1; }
else if(COL3 == 0) { col = 2; row = 1; }
else if(COL4 == 0) { col = 3; row = 1; }
ROW3 = 1; ROW1 = ROW2 = ROW4 = 0;
if(COL1 == 0) { col = 0; row = 2; }
else if(COL2 == 0) { col = 1; row = 2; }
else if(COL3 == 0) { col = 2; row = 2; }
else if(COL4 == 0) { col = 3; row = 2; }
ROW4 = 1; ROW1 = ROW2 = ROW3 = 0;
if(COL1 == 0) { col = 0; row = 3; }
else if(COL2 == 0) { col = 1; row = 3; }
else if(COL3 == 0) { col = 2; row = 3; }
else if(COL4 == 0) { col = 3; row = 3; }
return KEY_MAP[row][col];
}
}
return 0;
}
void Calculate(void) {
switch(op) {
case 1: result = num1 + num2; break;
case 2: result = num1 - num2; break;
case 3: result = num1 * num2; break;
case 4:
if(num2 != 0) result = num1 / num2;
else {
display_buf[0] = 14; display_buf[1] = 13;
display_buf[2] = 12; display_buf[3] = 0;
display_buf[4] = 0; display_buf[5] = 0;
display_buf[6] = 0; display_buf[7] = 0;
return;
}
break;
}
display_buf[0] = result / 10000000;
display_buf[1] = (result / 1000000) % 10;
display_buf[2] = (result / 100000) % 10;
display_buf[3] = (result / 10000) % 10;
display_buf[4] = (result / 1000) % 10;
display_buf[5] = (result / 100) % 10;
display_buf[6] = (result / 10) % 10;
display_buf[7] = result % 10;
}
void Update_Display(uchar key) {
uchar i;
if(key >= '0' && key <= '9') {
if(!flag_op) {
num1 = num1 * 10 + (key - '0');
display_buf[7] = num1 % 10; display_buf[6] = (num1 / 10) % 10;
display_buf[5] = (num1 / 100) % 10; display_buf[4] = (num1 / 1000) % 10;
display_buf[3] = (num1 / 10000) % 10; display_buf[2] = (num1 / 100000) % 10;
display_buf[1] = (num1 / 1000000) % 10; display_buf[0] = (num1 / 10000000) % 10;
} else {
num2 = num2 * 10 + (key - '0');
display_buf[7] = num2 % 10; display_buf[6] = (num2 / 10) % 10;
display_buf[5] = (num2 / 100) % 10; display_buf[4] = (num2 / 1000) % 10;
display_buf[3] = (num2 / 10000) % 10; display_buf[2] = (num2 / 100000) % 10;
display_buf[1] = (num2 / 1000000) % 10; display_buf[0] = (num2 / 10000000) % 10;
}
Beep();
} else if(key == '+' || key == '-' || key == '*' || key == '/') {
flag_op = 1;
if(key == '+') op = 1;
else if(key == '-') op = 2;
else if(key == '*') op = 3;
else if(key == '/') op = 4;
Beep();
} else if(key == '=') {
Calculate();
flag_op = 0;
num1 = result;
num2 = 0;
Beep();
} else if(key == 'C') {
num1 = num2 = 0;
op = 0;
flag_op = 0;
for(i=0; i<8; i++) display_buf[i] = 0;
Beep();
}
}
void Timer0_ISR(void) interrupt 1 {
TH0 = 0xFC;
TL0 = 0x18;
Display_Scan();
}
void main(void) {
Timer0_Init();
while(1) {
key_value = Key_Scan();
if(key_value != 0 && !flag_key) {
flag_key = 1;
Update_Display(key_value);
} else if(key_value == 0) {
flag_key = 0;
}
}
}
|
|