 |
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
- 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.
- leia sucessivamente teclas do keypad, ecoando para o lcd e armazenando no mesmo buffer
- quando a tecla 'E' for pressionada volte ao passo 1 (laço infinito)
P2
Escreva um programa para :
- 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.
- escreva uma subrotina asciitobin para converter uma cadeia ascii decimal (com até 5 dígitos)
para um número binário de 16 bits.
- teste-a com os operandos acima descritos
- 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
}