📄 c.zip.txt
字号:
——————————————————————————————————————————
#include <at89x52.h>
#include <math.h>
// Golobal const declare: ################################################
unsigned char code ledSegCode[14]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x00,0x79,0x40};
//14 elements: 0~9, ., BLANK, E and a -.
unsigned char code ledBitSlct[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char keyin1, keyin2;
unsigned char keyCode;
double oper1=0,oper2=0,result=0;
unsigned char operation=0; //current operation. 0,1,2,3,4 indicate NULL,+,-,*,/.
unsigned char calingFlg=0; //indicate whether program is under calculating or not.
//unsigned char the2ndoprFlg=0; //indicate whether the 2nd digital has been inputed in.
//this flag is service for this kind of operation:
// 4 + = = = ...
unsigned char oprkeyFlg=0; //indicate whether the key just pressed is a
//operation key(+,-,*,/).
unsigned char equalkeyFlg=0; //indicate a calculating should be contine.
//this var may show the key just pressed is a "=" or not.
unsigned char overFlg = 0; //indicate the program overflow status.
double dispNum;
//########################################################################
// Function @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void delay(unsigned int time){
//Delay time: time * 200 us
//if time==5, delay 1 ms.
unsigned int i;
for(i=0; i<time; i++){
//using Timer 0.
TMOD &= 0xf0;
TMOD |= 0x02; //set Timer 0 at mode 2.
TL0 = -200;
TH0 = -200;
TF0 = 0;
TR0 = 1; //Start timing.
while(TF0 == 0); //wait.
TR0 = 0;
}
}
void display(double number){
unsigned char i,j;
unsigned char data ledbit[8]={11,11,11,11,11,11,11,11}; //is a BLANK default
long intpart;
float decimalpart;
float * intpartP = &decimalpart;
unsigned char intbits, decimalbits;
//break the number to two part: Integer and Decimal:
modf(number, intpartP);
intpart = (long)decimalpart;
decimalpart = modf(number, intpartP);
if(intpart < 0 || decimalpart < 0){
intpart = - intpart;
decimalpart = - decimalpart;
ledbit[0] = 13; //negative, display a "-".
}
/*
* To save memory, I didn't define a variable of type double * named
* intpartP(which point to a double variable maybe, and named intpartD)
* to save the int part of number of type double.
* Instead, I used decimalpart 2 times. 1st time is to save the result
* of modf() which is the int part of number; and the 2nd time is to save
* the true "Decimal Part", which is returned by function modf().
* After all of these above, the variable intpart stored the integer part
* of number, and the variable decimalpart stored the decimal part.
*/
// Range of number int part(intbits) determine:
if(intpart >= 100000)//5
if(intpart < 10000000)//7
if(intpart < 1000000)//6
intbits = 6;
else intbits = 7;
else
intbits = 8;//out of range.
else //intpart<10^5
if(intpart < 100)//2
if(intpart < 10)//1
if(intpart < 1)//0
intbits = 0;//the int part is 0.
else intbits = 1;
else intbits = 2;
else
if(intpart < 1000)//3
intbits = 3;
else
if(intpart < 10000)//4
intbits = 4;
else intbits = 5;
//decimalbits:
if(intbits == 0)
intbits = 1;
decimalbits = 7 - intbits;
//Generate number of each bit:
switch(intbits){
case 8:
overFlg = 1; //announce overflow.
break;
case 7:
ledbit[1] = intpart/1000000;
case 6:
ledbit[2] = intpart%1000000/100000;
case 5:
ledbit[3] = intpart%1000000%100000/10000;
case 4:
ledbit[4] = intpart%1000000%100000%10000/1000;
case 3:
ledbit[5] = intpart%1000000%100000%10000%1000/100;
case 2:
ledbit[6] = intpart%1000000%100000%10000%1000%100/10;
case 1:
ledbit[7] = intpart%1000000%100000%10000%1000%100%10/1;
break;
default:
return;;//ERROR
}
//handle the decimal:
if(overFlg != 1){
for(i=0; i<decimalbits; i++){
for(j=8-intbits-i; j<8; j++)
ledbit[j-1] = ledbit[j];
ledbit[7] = (long)(decimalpart * pow(10,i+1)) % 10;
//Take care! the mandatory type cast must be long!
//int doesn't work, it will result in the right most
//bit cannot be display out!
//this is not correct:
//ledbit[j] = (int)(decimalpart * pow(10,i+1)) % 10;
//Why?
}
}
//if overflow, display a E until the overFlg is cleared by clear():
if(overFlg == 1){
ledbit[0] = 12;
for(i=1; i<8; i++)
ledbit[i] = 11;
}
//display:
for(i=0; i<8; i++){
j = ledbit[i];
P0 = ledSegCode[j];
if(i == intbits && overFlg != 1)
P0 += 0x80; //add a period
P2 = ledBitSlct[i];
delay(5); //5 represent 1ms
}
}
void clear(){
oper1=0, oper2=0, result=0;
operation = 0;
calingFlg = 0;
//the2ndoprFlg = 0;
equalkeyFlg = 0;
oprkeyFlg = 0;
dispNum = 0;
overFlg = 0;
}
void digitalKey(unsigned char key){
if(oprkeyFlg == 1){
oper2 = 0;
oprkeyFlg = 0;
}
if(equalkeyFlg == 1) //the pressed key is =.
clear();
if(calingFlg){ //calculating, current is the 2nd operand.
oper2 *= 10;
oper2 += key;
//the2ndoprFlg = 1;
dispNum = oper2;
}else{
oper1 *= 10;
oper1 += key;
dispNum = oper1;
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// Interrupt Processing @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void X0() interrupt 0{
P3_7 = 1; //clear interrupt
//if overflowed, but a on/ce key pressed, clear, then return.
//else if overflowed, but the key pressed is not a on/ce, do nothing.
if(overFlg == 1 && keyCode == 0xe7){
clear();
return;
}
if(overFlg == 1){
return;
}
switch(keyCode){
case 0xd7: digitalKey(0); break; //[0]
case 0xeb: digitalKey(1); break; //[1]
case 0xdb: digitalKey(2); break; //[2]
case 0xbb: digitalKey(3); break; //[3]
case 0xed: digitalKey(4); break; //[4]
case 0xdd: digitalKey(5); break; //[5]
case 0xbd: digitalKey(6); break; //[6]
case 0xee: digitalKey(7); break; //[7]
case 0xde: digitalKey(8); break; //[8]
case 0xbe: digitalKey(9); break; //[9]
case 0x77: //[+]
operation = 1;
calingFlg = 1;
oprkeyFlg = 1;
equalkeyFlg = 0;
break;
case 0x7b: //[-]
operation = 2;
calingFlg = 1;
oprkeyFlg = 1;
equalkeyFlg = 0;
break;
case 0x7d: //[*]
operation = 3;
calingFlg = 1;
oprkeyFlg = 1;
equalkeyFlg = 0;
break;
case 0x7e: //[/]
operation = 4;
calingFlg = 1;
oprkeyFlg = 1;
equalkeyFlg = 0;
break;
case 0xb7: //[=]
if(oprkeyFlg)
oper2 = oper1;
calingFlg = 0;
oprkeyFlg = 0;
equalkeyFlg = 1;
switch(operation){
case 1:
result = oper1 + oper2;
oper1 = result;
break;
case 2:
result = oper1 - oper2;
oper1 = result;
break;
case 3:
result = oper1 * oper2;
oper1 = result;
break;
case 4:
if(oper2 != 0){
result = oper1 / oper2;
oper1 = result;
}else{
overFlg = 1;
}
default:
break;
}
dispNum = result;
//the2ndoprFlg = 0;
break;
case 0xe7: //[on/ce]
clear();
break;
default:
;//ERROR
}
delay(300); //delay to indicate a key pressed.
}
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void main(){
//interrupt register init:
IT0 = 1;
IE = 0x81;
IP = 0x01;
while(1){
do{
P1 = 0xff;
P1 = 0x0f;
keyin1 = P1;
P1 = 0xff;
P1 = 0xf0;
keyin2 = P1;
keyCode = keyin1 + keyin2;
display(dispNum);
}while(keyCode == 0xff);
//if there's no key press down, loop and wait.
//else:
P3_7 = 0; //call intterrupt manually
display(dispNum);
}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -