سلام خدمت اساتید.
من برنامه ی ماشین حساب مهندسی رو که داخل کتاب مهندس الوندی هست عینا" توی کدویژن نوشتم.برنامه به این صورته که برنامه ی اسکن صفحه کلید به نام keypad.c به صورت فایل الحاقی به برنامه ی اصلی به نام calculator.c اضافه میشه و توی برنامه، keypad.h فراخوانی میشه
اما بعد از فراخوانی،وقتی کامپایل میکنم حدود 15 تا خطا دارم که بیشتر اینطوری هستن:
undifined PORTD
undifined PIND
undifined DDRDD
undifined PORTC
undifined PINC
undifined DDRC
و یکی دوتا خطای دیگه.توی نسخه های دیگه از کدویژن هم انجام دادم و خطا گرفتم.کد برنامه رو میذارم.لطفا اگر تونستید،کامپایلش کنید و مشکلو بهم بگید.مثل همیشه روی کمکتون حساب میکنم.ممنون
کد برنامه اصلی calculator.c:
کد:
# define pp 3.14159327
# define SIN PINC.0
# define COS PINC.1
# define TAN PINC.2
# define LOG PINC.3
# define SHIFT PINC.4
#include <mega16a.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#asm
.equ _lcd_port=0x1B
#endasm
#include <lcd.h>
#include "keypad.h"
float number1 =0;
float number2 =0;
float result=0.0;
static char last_key;
unsigned char mmz=0,count=0,num_dis=0;
char *save_str="";
void display(){
char lcd_buf[32];
sprintf(lcd_buf,"%f",number1);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(lcd_buf);
delay_ms(500);
}
void config_number(float f_number){
static float division[]={1,10,100,1000,10000,100000,1000000};
f_number=(f_number/division[mmz]);
result=f_number;
}
void sin_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=(number1*pp)/180;
number1=sin(number1);
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(SHIFT==1 && SIN==0) {};
}
void arcsin_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=asin(number1);
number1=(number1*180)/pp;
display();
num_dis=1;
count=0;
mmz=0;
last_key='+';
while(SHIFT==0 && SIN==0) {};
}
void cos_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=(number1*pp)/180;
number1=cos(number1);
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(SHIFT==1 && COS==0) {};
}
void arccos_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=acos(number1);
number1=(number1*180)/pp;
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(SHIFT==0 && COS==0) {};
}
//
void tan_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=(number1*pp)/180;
number1=tan(number1);
number1=number1+0.0001;
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(SHIFT==1 && TAN==0) {};
}
//
void arctan_DRG(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=atan(number1);
number1=(number1*180)/pp;
number1=number1+0.0001;
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(SHIFT==1 && TAN==0) {};
}
//
void log_10(){
number1 = atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
number1=log10(number1);
num_dis=1;
count=0;
mmz=0;
last_key='+';
display();
while(LOG==0) {};
}
signed char test_key (char key){
if ((key == '.')|| ((key >= '0') && (key <= '9')))return 1;
else return 0;
}
//
void ack_opretion(char opretion){
signed char res = 0;
switch (opretion){
case '+' : number1 += number2;break;
case '-' : number1 -= number2;break;
case '*' : number1 *= number2;break;
case '%' :
if (number2 != 0) number1 /= number2;
else {res = 2;break;}
}if (res == 0){
if ((number1>=-999999999)&&(number1<=999999999)) display();
else {
lcd_gotoxy(0,0);
lcd_putsf("error number");
delay_ms(1000);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putchar('0');
lcd_gotoxy(0,0);
}
}
if (res == 2){
lcd_clear();
lcd_putsf("*ERROR*");
}
}
//
void calculator(){
unsigned char key=0;
char *helper="";
signed char data_in;
number1=0;
number2=0;
last_key=0;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("0");
data_in=0;
lcd_gotoxy(0,0);
for (;;){
start:
key = keypad();
if (test_key(key)){
if(num_dis==1){
lcd_clear();
num_dis=0;
}
if (data_in != 9){
data_in++;
if((key=='.')&&(count!=1)){
count=1;
data_in--;
lcd_putchar(key);
goto start;
}
if(key=='.'){
data_in--;
goto start;
}
lcd_putchar(key);
if(count==1) mmz++;
helper=0;
key&=0x0f;
itoa(key,helper);
strcat(save_str,helper);
}
}
else{
if(data_in != 0){
if (last_key == 0){
number1=atof(save_str);
*save_str=NULL;
config_number(number1);
number1=result;
count=0;
mmz=0;
num_dis=1;
}
else{
number2=atof(save_str);
*save_str=NULL;
config_number(number2);
number2=result;
count=0;
mmz=0;
num_dis=1;
}
}
data_in=0;
if (last_key != 0) ack_opration(last_key);
if (key != '=') last_key = key;
else last_key = 0;
}
}
}
void main(){
setting();
calculator();
}
کد keypad.h:
کد:
unsigned char keypad();
void setting();
کد keypad.c:
کد:
#define c1 PIND.4
#define c2 PIND.5
#define c3 PIND.6
#define c4 PIND.7
#define SIN PINC.0
#define COS PINC.1
#define TAN PINC.2
#define LOG PINC.3
#define SHIFT PINC.4
flash char row[]={~1,~2,~4,~8};
flash char data_key[]={
'7','8','9','%',
'4','5','6','*',
'1','2','3','-',
'.','0','=','+'};
unsigned char ac,table;
unsigned int r;
//
unsigned char keypad(){
while (1){
for (r=0;r<4;r++){
ac=4;
PORTD =row[r];
DDRD=0x0f;
if (c1==0) ac=0;
if (c2==0) ac=1;
if (c3==0) ac=2;
if (c4==0) ac=3;
//
if (LOG==0) log_10();
if (SHIFT==1 && SIN==0) sin_DRG();
if (SHIFT==1 && COS==0) cos_DRG();
if (SHIFT==1 && TAN==0) tan_DRG();
if (SHIFT==0 && SIN==0) arcsin_DRG();
if (SHIFT==0 && COS==0) arccos_DRG();
if (SHIFT==0 && TAN==0) arctan_DRG();
if (!(ac==4)){
table=data_key[(r*4)+ac];
while (c1==0){}
while (c2==0){}
while (c3==0){}
while (c4==0){}
delay_ms(20);
while (c1==0){}
while (c2==0){}
while (c3==0){}
while (c4==0){}
delay_ms(20);
return table;
}
}
};
}
//
void setting(){
PORTD=0xff;
DDRD=0x0f;
PORTC=0xFF;
DDRC=0x00;
lcd_init(16);
}