Vous êtes sur la page 1sur 7

/*

* MtE316L: Microprocessor & Microcontrollers (Lab), Fall 2018


* Dept. of Mechatronics Engg., UET Peshawar
* Date: 10/25/2018
* Author : Mazidi et al.
* Modified by: Dr. Muhammad Tufail
*/
#define F_CPU 16000000UL
#define BAUD_RATE 9600
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#define KEY_PRT PORTB
//keyboard PORT
#define KEY_DDR DDRB
#define KEY_PIN PINB

unsigned char keypad[4][4] =


{ '7','8','9','/',
'4','5','6','x',
'1','2','3','-',
'o','0','=','+'};
void usart_init(void)
{
UCSR0B = (1<<TXEN0);
UCSR0C = (1<< UCSZ01)|(1<<UCSZ00);
UBRR0L = 0x33;
}
void usart_send(unsigned char ch )
{
while (! (UCSR0A & (1<<UDRE0))); //wait until UDR0 is empty

UDR0 = ch; //transmit ch


_delay_ms(20);

}
int main(void)
{
unsigned char number , operator1 , operator2 , result ;
int p = 0; int temp1 , temp2 , temp3 , temp4 , ans1 , ans2 , q , carry1 ,
carry2 ;
unsigned char a,b,c,d;
int i = 0;
unsigned char colloc, rowloc;
KEY_DDR = 0xF0;
KEY_PRT = 0xFF;
usart_init(); //initialize serial communication
while(1)
{
do
{
KEY_PRT &= 0x0F;
asm("NOP");
colloc = (KEY_PIN & 0x0F);
} while(colloc != 0x0F);
do
{
do
{
_delay_ms(20);
colloc =(KEY_PIN&0x0F);
} while(colloc == 0x0F);
_delay_ms(20);
colloc = (KEY_PIN & 0x0F);
}while(colloc == 0x0F);
while(1)
{

KEY_PRT = 0xEF;
asm("NOP");
colloc = (KEY_PIN & 0x0F);
if(colloc != 0x0F)
{
rowloc = 0;
break;
}
KEY_PRT = 0xDF;
asm("NOP");
colloc = (KEY_PIN & 0x0F);
if(colloc != 0x0F)
{
rowloc = 1;
break;
}
KEY_PRT = 0xBF;
asm("NOP");
colloc = (KEY_PIN & 0x0F);
if(colloc != 0x0F)
{
rowloc = 2;
break;
}
KEY_PRT = 0x7F;
asm("NOP");
colloc = (KEY_PIN & 0x0F);
rowloc = 3;
break;
}
loop:

if(colloc == 0x0E){
number = (keypad[rowloc][0]); //transmit letter

}
else if(colloc == 0x0D) {
number = (keypad[rowloc][1] );}

else if(colloc == 0x0B){


number = (keypad[rowloc][2]);}

else {
number = (keypad[rowloc][3]);}

while (i<6){
if (i==0 && number!= '+' && number!= '-' && number!= 'x' &&
number!= '/' && number!= '=' && number!='o'){
_delay_ms(20);
a = number ;
temp1 = a - '0';

usart_send(a);
i=1;
break;
}

if (i==1 && number!= '+' && number!= '-' && number!= 'x' &&
number!= '/' && number!= '=' && number!='o'){

c = number ;
temp2 = c - '0';

usart_send(c);
i=2;
break;
}

if (i==2 && number!='0' && number!= '1' && number!= '2' &&
number!= '3' && number!= '4' && number!= '5' && number!= '6' && number!= '7' &&
number!= '8' && number!= '9' && number!= '=' && number!='o') {
operator1 = number;

usart_send(operator1);
i=3;
break;

}
if (i==3 && number!= '+' && number!= '-' && number!= 'x' &&
number!= '/' && number!= '=' && number!='o') {
b = number;
temp3 = b - '0';

usart_send(b);
i=4;
break;
}
if (number=='o')
{

usart_send('\r');
i=0;
break;

if (i==4 && number!= '+' && number!= '-' && number!= 'x' &&
number!= '/' && number!= '=' && number!='o') {
d = number;
temp4 = d - '0';

usart_send(d);
i=5;
break;
}
if (i==5 && number=='=') {
if (operator1=='+') {
operator2 = number;
usart_send(operator2);
if (temp2+temp4>9)
{
ans1 = temp2 + temp4;
carry1 = ans1/10;
ans1 = ans1-carry1*10;
if (temp1+temp3+carry1>9)
{
ans2 =temp1+temp3+carry1;
carry2 = ans2/10;
ans2 = ans2-carry2*10;
result = carry2 + '0';
usart_send(result);
b = ans2 + '0';
usart_send(b);
a = ans1 + '0';
usart_send(a);

usart_send('\r');
i=0;
break;
}
else {
ans2 = temp1+temp3+carry1;
b = ans2 + '0';
usart_send(b);
a = ans1 + '0';
usart_send(a);

usart_send('\r');
i=0;
break;
}
}

ans2 = temp2 + temp4 ;


if (ans2 >= 10) { ans2 = ans2 - 10; ans1 =
1+temp1+temp3; }
else { ans2 = temp2+temp4; ans1 =
temp1+temp3; }
result = ans1 + '0';
usart_send(result);
result = ans2 + '0';
usart_send(result);
_delay_ms(20);
usart_send('\r');
i=0;
break;
}
if (operator1 == '-') {
operator2 = number;
usart_send(operator2);
if (temp2<temp4) { temp2 = 10+temp2; temp1 = temp1 -1 ;
}
else { temp2 = temp2; temp1 = temp1 ; }
ans1 = temp1 - temp3;
ans2 = temp2 - temp4;
result = ans1 + '0';
usart_send (result);
result = ans2 + '0';
usart_send(result);
_delay_ms(20);
usart_send('\r');
i=0;
break;}

if (operator1 == 'x') {
operator2 = number;
usart_send(operator2);
if (temp1>0 && temp2>0 && temp3>0 && temp4>0 &&
temp2*temp4<10 && temp4*temp1<10)
{
ans1 = temp2*temp4;
ans2 = (temp4*temp1) + (temp3*temp2);
carry1= ans2/10;
ans2 = ans2 - carry1*10;
carry2 = (temp3*temp1) + carry1;
a = carry2 + '0';
usart_send(a);
b = ans2 + '0';
usart_send(b);
result = ans1 + '0';
usart_send(result);
usart_send('\r');
i=0;
break;
}

if (temp3==0 && temp4 == 0 ) {


usart_send('0');
usart_send('\r');
i=0;
break;}
if (temp3==0 && temp2*temp4>9 && temp1*temp4>9)
{
carry1 = (temp2*temp4)/10;
ans1 = (temp2*temp4)-(carry1*10);
carry2 = (temp1*temp4)/10;
ans2 = carry1 + (temp1*temp4) - (carry2*10);
a = carry2 + '0';
usart_send (a);
b = ans2 + '0';
usart_send (b);
result = ans1 +'0';
usart_send(result);
usart_send('\r');
i=0;
break;
}

if (temp4*temp2>9){
p = (temp4*temp2)-10;
ans1 = (temp4*temp1)+1;
ans2 = temp3 * temp2;
q = ans1 + ans2;
}
else {
p = temp4 * temp2;
ans1 = temp4 * temp1;
ans2 = temp3 * temp2;
q = ans1 + ans2;
}

a = q + '0';
usart_send(a);

b = p + '0';
usart_send(b);

_delay_ms(20);
usart_send('\r');
i=0;
break;
}

if (operator1=='/') {
operator2 = number;
usart_send(operator2);

if (temp3!=0 && temp1!=0){


ans1 = (temp3*10)+temp4;
ans2 = (temp1*10)+temp2;
p = ans2/ans1;
result = p + '0';
usart_send(result);
usart_send('\r');
i=0;
break;

if (temp3==0 && temp1==0){


ans1 = temp2/temp4;
result = ans1 + '0';
usart_send(result);
usart_send('\r');
i=0;
break;}
if (temp3==0 && temp1!=0) {
temp1 = (temp1*10)+temp2;
ans1 = temp1/temp4;
if (ans1>9) {
carry1 = ans1/10;
carry2 = ans1 - (carry1*10);
a = carry1 +'0';
usart_send(a);
b = carry2 +'0';
usart_send(b);
usart_send('\r');
i=0;
break;
}
else {
result = ans1 + '0';
usart_send(result);
usart_send('\r');
i=0;
break; }
}
if (temp1==temp3 && temp2==temp4)
{
usart_send('1');
usart_send('\r');
i=0;
break;
}
if (temp1>0 && temp3>0)
{
temp3 = (temp3*10) + temp4;
temp1 = (temp1*10) + temp2;
ans1 = temp1/temp3;
result = ans1 + '0';
usart_send(result);
usart_send('\r');
i=0;
break;
}

return 0;
}

Vous aimerez peut-être aussi