Калькулятор на основе ATMega8 с использованием AVRstudi

О калькуляторе:

В основном этот калькулятор сделан для расчета сопротивления медных и алюминиевых проводов при температуре окружающей среды по формуле
R2 = R1 * (1 + альфа (Т-25))

Здесь R2 будет выходным значением, R1 будет значением, введенным пользователем с помощью матричной клавиатуры 4×4 (которая будет включать десятичные значения, такие как 12,5 и т. Д.), T является температурой в градусах Цельсия, зарегистрированной датчиком температуры LM35.
альфа для меди = 0,0039
альфа для алюминия = 0,0042

Как это должно работать:

В основном температура будет записываться калькулятором, который будет выдавать вход T. Значение сопротивления при 25 градусах C будет подаваться пользователем с помощью клавиатуры.
Теперь клавиши 0-9 и «.» используются для ввода значения.
После этого, когда пользователь нажимает «+» на клавиатуре, он должен реализовать формулу для меди и отобразить результат на ЖК-дисплее, аналогично, когда пользователь нажимает «-», он должен реализовать формулу для алюминия. Оставим пока кнопки «*», «/» и «=» в качестве запасных.

Прогресс до сих пор:

Используя коды, которые я отправил вам в этом приложении, я могу правильно отображать температуру на экране, я могу видеть значение R1 (то есть значение сопротивления при 25 градусах Цельсия). Теперь я не могу понять, как их использовать. значения, чтобы получить вывод.

Пожалуйста, помогите мне с этим. 🙂

Спасибо & С Уважением,
Мохит Гоял

#define F_CPU 1000000UL
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include "lcd.h"#include "lcd.c"#include <math.h>
#define KB_PORT_OUT PORTB
#define KB_PORT_IN PINB
void port_init(void)
{

DDRB  = 0x0f;       //Key-board port, higer nibble - input, lower nibble -     output
PORTB = 0xff;
}
void init_devices(void)
{
port_init();

MCUCR = 0x00;
TIMSK = 0x00; //timer interrupt sources
}

void InitADC()
{
ADMUX=(1<<REFS0);
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0);

}
uint16_t ReadADC (uint8_t ch)
{
ch=ch&0b00000111;
ADMUX|=ch;
ADCSRA|=(1<<ADSC);
while (! (ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
return (ADC);
}
void Wait ()
{
uint8_t i;
for (i=0;i<1;i++)
_delay_loop_2(0);
}
void main()
{

char Temp[3];
uint16_t adc_result,mV;
int t;
lcd_init (LCD_DISP_ON);
lcd_clrscr();
InitADC();
lcd_gotoxy(0,0);
lcd_puts("R1=");
lcd_gotoxy(9,0);
lcd_puts(",T=");
lcd_gotoxy(15,0);
lcd_puts("C");
lcd_gotoxy(0,1);
lcd_puts("R2=");
while(1)
{
adc_result=ReadADC(0);
mV=(int)(1000.0*5.0*(((float)adc_result)/1023.0));
t=(int)(mV/10);
sprintf(Temp,"%d",t);
lcd_gotoxy(12,0);
lcd_puts(Temp);
Wait();
unsigned char Res, upperNibble, myCharPointer, keyCode, keyPressed, j;
int a=0, b=0, c=0, d=0, display=0;
init_devices();lcd_gotoxy(3,0);
while(1)
{
upperNibble = 0xff;

for(j=0; j<4; j++)
{
_delay_ms(1);
KB_PORT_OUT = ~(0x01 << j);
_delay_ms(1);                        //delay for port o/p settling
upperNibble = KB_PORT_IN | 0x0f;

if (upperNibble != 0xff)
{
_delay_ms(20);                //key debouncing delay
upperNibble = KB_PORT_IN | 0x0f;
if(upperNibble == 0xff) goto OUT;

keyCode = (upperNibble & 0xf0) | (0x0f & ~(0x01 << j));

while (upperNibble != 0xff)
upperNibble = KB_PORT_IN | 0x0f;

_delay_ms(20);                  //key debouncing delay

switch (keyCode)            //generating key characetr to display on LCD
{
case (0xee): keyPressed = "1";
a=1;
b=b*10+1;
break;
case (0xed): keyPressed = "4";
a=4;
b=b*10+4;
break;
case (0xeb): keyPressed = "7";
a=7;
b=b*10+7;
break;
case (0xe7): keyPressed = ".";

break;
case (0xde): keyPressed = "2";
a=2;
b=b*10+2;
break;
case (0xdd): keyPressed = "5";
a=5;
b=b*10+5;
break;
case (0xdb): keyPressed = "8";
a=8;
b=b*10+8;
break;
case (0xd7): keyPressed = "0";
a=0;
b=b*10+0;
break;
case (0xbe): keyPressed = "3";
a=3;
b=b*10+3;
break;
case (0xbd): keyPressed = "6";
a=6;
b=b*10+6;
break;
case (0xbb): keyPressed = "9";
a=9;
b=b*10+9;
break;
case (0xb7): keyPressed = "=";
break;
case (0x7e): keyPressed = "A";
break;
case (0x7d): keyPressed = "B";
break;
case (0x7b): keyPressed = "C";
break;
case (0x77): keyPressed = "D";
break;
default    : keyPressed = "X";
}//end of switch

lcd_puts(keyPressed);

lcd_gotoxy(3,1);
lcd_puts(keyPressed);
OUT:;
}//end of if
}//end of for
}//end of while(1)

return 0;
}

}

-1

Решение

Один из способов чтения ввода — это чтение символов в массиве символов (в вашем блоке переключателей добавьте нажатой клавишу к массиву символов, используя strcat функция). Затем проверьте, в правильном ли формате. А затем преобразовать число в массиве символов в плавающее и использовать его в расчете, как описано в ссылка на вопрос

Способ добавления нажатой клавиши к строке:

char s[25]="";
strcat(s,"1")

Я заметил одну ошибку
+ Изменить

keypressed="1"

в

keypressed='1'

во всех таких случаях. «1» — это константный массив символов. «1» — символ

или измените тип массива символов с нажатой клавишей и используйте strcpy, чтобы присвоить ему любую строку.

strcpy(keypressed,"1")
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector