#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
// ???????(P3.0-P3.2)
sbit WEI1 = P3^0; // ?1?
sbit WEI2 = P3^1; // ?2?
sbit WEI3 = P3^2; // ?3?
// ????????(0-9)
uchar code seg_table[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, // 0-4
0x6D, 0x7D, 0x07, 0x7F, 0x6F // 5-9
};
uint key, key_num; // ?????
/*********************** ??????? ************************/
void delay_1ms(uint x)
{
TMOD = 0x01; // ???0??1
TR0 = 1; // ?????
while(x--)
{
TH0 = 0xFC; // 1ms????
TL0 = 0x18;
while(!TF0); // ????
TF0 = 0;
}
TR0 = 0; // ?????
}
/*********************** ????????? ********************/
void display(uint num)
{
static uchar pos = 0; // ??????
uchar digits[3]; // ?????????
// ?????
digits[0] = num / 100; // ??
digits[1] = (num / 10) % 10; // ??
digits[2] = num % 10; // ??
// ??????
WEI1 = WEI2 = WEI3 = 1;
// ??????
switch(pos)
{
case 0:
P2 = seg_table[digits[0]];
WEI1 = 0;
break;
case 1:
P2 = seg_table[digits[1]];
WEI2 = 0;
break;
case 2:
P2 = seg_table[digits[2]];
WEI3 = 0;
break;
}
pos = (pos+1) % 3; // ????
delay_1ms(2); // ?????2ms
}
/*********************** ?????? *************************/
uchar keyscan()
{
uchar i, j, key_value = 0xFF;
P1 = 0xF0; // ?4???0,?4???1
if(P1 != 0xF0) { // ?????????
delay_1ms(10); // ??
if(P1 != 0xF0) {
// ???
for(i = 0; i < 4; i++) {
P1 = ~(0x01 << i); // ???????
for(j = 0; j < 4; j++) {
if(!(P1 & (0x10 << j))) { // ???
key_value = i * 4 + j; // ????
while(P1 != 0xF0); // ??????
return key_value;
}
}
}
}
}
return key_value;
}
/*********************** ?????? *************************/
void keynum()
{
uchar i, j;
uchar code tab[4][4] = {
{'7', '8', '9', '/'},
{'4', '5', '6', '*'},
{'1', '2', '3', '-'},
{'C', '0', '=', '+'}
};
key = keyscan();
if(key != 0xFF)
{
i = key / 4; // ??
j = key % 4; // ??
key_num = tab[i][j] - '0'; // ???????0-9
}
}
/************************ ??? ****************************/
void main()
{
uint square_value = 0;
P3 = 0xFF; // ?????
while(1)
{
keynum(); // ????
if(key != 0xFF)
{
if(key_num >= 0 && key_num <= 9) {
square_value = key_num * key_num; // ?????
}
}
display(square_value); // ??????
}
}
|