level 9
奥巴小鸟free
楼主

void key_task();extern uchar condition;
//È«¾Ö±äÁ¿
char yun_flag='+';//ÔËËã·ûºÅ yun_flag £¨Ä¬ÈÏΪ+ £©
char data c_num1[15]=" ";//c_num1 ×Ö·ûÐ͵ÚÒ»²Ù×÷Êý (Êý×é²»¶¨Òå´óСÓëÆäËû±äÁ¿³åÍ»)
char data c_num2[15]=" ";//c_num2 ×Ö·ûÐ͵ڶþ²Ù×÷Êý
char error;//ÔËËã·¨Ôò´íÎó£»
void refresh();
//=====================================================
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1; /*12MHzƵÂÊ*/
while(--uscnt);
}
/******************************************************************/
/* ºÁÃ뺯ÊýÉùÃ÷ */
/******************************************************************/
void DelayMs(unsigned char ms)
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
double my_num2 = 0;
double my_num1 = 0;
char my_num2_len = 1,my_num1_len = 1;
char num_flag = 0;
unsigned char operation_num = 0;
double point_flag = 0;//СÊýµãÊÇ·ñ±»°´ÏÂ
char point_num = 0;
char double_to_char(double a,char* p)
{
char length,i,j;
for(i=0; i< 15; i++){
p[i] = 0;
}
sprintf(p,"%f",a);
length = strlen (p);
for(i = 0; i < length;i++){
if(p[i] == '.'){
for(j = 6; j > 0;j--){
if(p[i+j] != '0'){
break;
}
}
if(j){
p[i+j+1] = '\0';
}else{
p[i] = '\0';
}
}
}
length = strlen (p);
return length;
}
void show_float(){
char i,length,j;
if((point_num > 1) ){
length = strlen (c_num2);
for(i =0 ; i < length; i++){
if(c_num2[i] == '.'){
break;
}
}
if(i == length ){
LCD_write_str(16-my_num2_len-point_num,2,c_num2);
LCD_write_char(16-point_num,2,'.');
for(i=1; i < point_num; i++){
LCD_write_char(16-i,2,'0');
}
}else{
if((length-i) > 5){
LCD_write_str(16-my_num2_len,2,c_num2);
}else{
LCD_write_str(16-(i+point_num),2,c_num2);
for(j=0; j < point_num - (length-i); j++){
LCD_write_char(15-j,2,'0');
}
}
}
}else{
LCD_write_str(16-my_num2_len,2,c_num2);
}
}
void show_num2(){
if(point_num == 1){
LCD_write_str(16-my_num2_len-1,2,c_num2);
LCD_write_char(15,2,'.');
}else if(point_num == 0){
LCD_write_str(16-my_num2_len,2,c_num2);
}
else{
show_float();
}
}
void refresh(){
//char i;
//LCD_write_str(0,1,"1234567890123456");
LCD_write_str(0,0," ");
LCD_write_str(0,1," ");
my_num2_len = double_to_char(my_num2,c_num2);//num2תΪ×Ö·ûÐÍ
if(error==0)
{
if(num_flag == 0){//shu ru zuo zhi
show_num2();
}else if(num_flag == 1){//shu ru you zhi
my_num1_len = double_to_char(my_num1,c_num1);//num1תΪ×Ö·ûÐÍ
LCD_write_str(16-my_num1_len ,0,c_num1);
show_num2();
LCD_write_char(1,15,yun_flag);
}else{//deng yu hao
my_num2_len = double_to_char(my_num2,c_num2);//num1תΪ×Ö·ûÐÍ
LCD_write_str(16-my_num2_len ,1,c_num2);
LCD_write_char(1,15,yun_flag);
}
}else
{
LCD_write_str(0,0,"error!!!");
}
}
void point_init(){
point_flag = 0;
point_num = 0;
}
void my_operation2(char keynum)//ÊäÈëÊý×Ö
{
unsigned char Data1;
if(keynum==1)Data1=1;//·ÖÎöÊäÈëÊý×Ö
if(keynum==2)Data1=2;
if(keynum==3)Data1=3;
if(keynum==5)Data1=4;
if(keynum==6)Data1=5;
if(keynum==7)Data1=6;
if(keynum==9)Data1=7;
if(keynum==10)Data1=8;
if(keynum==11)Data1=9;
if(keynum==14)Data1=0;
if(point_num){
point_num++;
if(point_num > 7){
point_num = 7;
}
point_flag = point_flag *0.1;
my_num2 = my_num2+Data1*point_flag;
}else{
my_num2=my_num2*10+Data1;
}
refresh();
}
void my_operation_point(){
point_flag = 1;
point_num = 1;
refresh();
}
void my_operation(char keynum)//°´Ï ¡¯+¡¢-¡¢*¡¢/´¦Àí
{
if(operation_num > 1)//Éϴΰ´¼üΪ Êý×Ö¡¢Ð¡Êýµã¡¢+/-¡¢sqrt
{
if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯
if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯
if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯
if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯
{
if(my_num2!=0){
my_num2=my_num1/my_num2;
}
else{
error=1;
}
}
}
if(keynum==4)yun_flag='+';//yun_flag¸üÐÂ
if(keynum==8)yun_flag='-';
if(keynum==12)yun_flag='*';
if(keynum==16)yun_flag='/';
my_num1 = my_num2;
my_num2=0;
refresh();
}
void operation_for_equal()//ÊäÈë'='
{
if(yun_flag=='+')my_num2=my_num1+my_num2; //°´ÏµÄÊÇ¡®+¡¯
if(yun_flag=='-')my_num2=my_num1-my_num2;//°´ÏµÄÊÇ¡®-¡¯
if(yun_flag=='*')my_num2=my_num1*my_num2;//°´ÏµÄÊÇ¡®*¡¯
if(yun_flag=='/')//°´ÏµÄÊÇ¡®/¡¯
{
if(my_num2!=0){
my_num2=my_num1/my_num2;
}
else{
error=1;
}
}
yun_flag='=';//yun_flag¸üÐÂ
operation_num = 0;
refresh();
}
void xiaoshucong_key_task(unsigned char key){
switch(key){
case 4 :
case 8 :
case 12:
case 16://+¡¢-¡¢*¡¢/
if(error==0){
num_flag = 1;
point_init();
operation_num++;
my_operation(key);
}
break;
case 1 : //Êý×Ö1
case 2 : //Êý×Ö2
case 3 : //Êý×Ö3
case 5 : //Êý×Ö4
case 6 : //Êý×Ö5
case 7 : //Êý×Ö6
case 9 : //Êý×Ö7
case 10 : //Êý×Ö8
case 11 : //Êý×Ö9
case 14 : //Êý×Ö0
if(error==0){
if(yun_flag == '='){
yun_flag = ' ';
my_num2 =0;
num_flag = 0;
}
my_operation2(key);
}
break;
case 13 :// .
my_operation_point();
break;
case 15 :// '='
if(error==0){
//operation4();
num_flag = 2;
point_init();
operation_for_equal();
}
break;
}
}
void main()
{
char key_num = 0;
LCD_init();
refresh();
while(1)
{
key_num = KeyDriver();
if(key_num){
xiaoshucong_key_task(key_num);
}
}
}