⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c.zip.txt

📁 用java编写dos平台的源代码程序
💻 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 + -