MC 404C - Arquitetura e Programação de microcontroladores - 1o semestre de 2011


Dicas para a Atividade 2

Escreva dois programas independentes P1 e P2 com o seguinte objetivo:
P1 - use o template lcdkeypad.asm
  1. leia uma tecla do keypad, apague a 2a linha do lcd, armazene o caracter num buffer e ecoe para o começo da 2a linha do display lcd.
  2. leia sucessivamente teclas do keypad, ecoando para o lcd e armazenando no mesmo buffer
  3. quando a tecla 'E' for pressionada volte ao passo 1 (laço infinito)

P2
Escreva um programa para :

  1. analisar (parse) um comando com caracteres ASCII colocado num buffer de memória (porexemplo: '123+456',0) extraindo o 1o operando, o operador e o 2o operando.
  2. escreva uma subrotina asciitobin para converter uma cadeia ascii decimal (com até 5 dígitos) para um número binário de 16 bits.
  3. teste-a com os operandos acima descritos
  4. escreva uma subrotina bintoascii para converter um valor binário de 16 bits numa cadeia ascii decimal contendo a representação decimal do valor binário. Teste-a com um valor qualquer, por exemplo o da soma acima.

Dicas para a Atividade 3 - Calculadora em C

1. Modifique as rotinas básicas em C do lcd e do keypad (exemplos/lcdkeypad_c. de forma a ficarem compativeis com as do arquivo /exemplos/lcdkeypad.asm.

2. Como o bit de CY não está disponível em C para verificar overflow nas operações aritméticas, use o seguinte truque derivado de uma desigualdade simples:

Se a e b são inteiros de 16 bits sem sinal, então:
 a + b > INT16_MAX => a > INT16_MAX - b
  (INT16_MAX é uma constante pré-definida e igual a 0xffff)
  Portanto o teste a seguir vai funcionar sempre, se feito antes de somar a com b:
  	if ( a > INT16_MAX - b ){
  		... ocorrerá overflow na soma a+b ..
  	}
  	esle{
  		... podemos somar a com b sem problemas
  	}
  Observe que subtração e divisão (se divisor > 0) nunca darão problemas.
  O mesmo truque pode ser usado para a multiplicação a*b:
  
  Se b>0 e a * b > INT16_MAX => a > INT16-MAX / b
  if (b > 0 && a > INT16_MAX/b){
  	... a multiplicação vai dar overflow...
  	}
  	else{
  	... OK multiplicar a*b - o resultado cabe em 16 bits  
  	}