Estoy haciendo un teclado 16 * 16 (en PORTB y PORTD) con ATMega32 usando proteus 6.9 y AVRstudio5.
Mi problema es que PB7 y PD7 no funcionarán cuando las extensiones en esos pines estén habilitados. Aquí sale la PD7, así que no hay problema aquí. Pero PB7 debe estar activado para la matriz. por lo que esta parte del código no funcionará como se esperaba:
if (!(keyportpin1&(1<<col8)))
{
while (!(keyportpin1&(1<<col8))){}
key+=7;
return key;
}
Problema siguiente: PC6 y PC7 tampoco dan salida en ningún caso. Intenté cambiar SFR y tampoco conseguí ninguna solución.
El código completo que estoy usando es:
/*
* keyboard.c
*
* Created: 10/15/2011 10:54:24 AM
* Author: CMANI
*/
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#define keyportpin1 PINB
#define keyportpin2 PIND
#define keyport1 PORTB
#define keyport2 PORTD
#define keyportdirection1 DDRB
#define keyportdirection2 DDRD
//#define bit_clear(bit) (!(keyportpin&(1<<bit)))
#define col1 PB0
#define col2 PB1
#define col3 PB2
#define col4 PB3
#define col5 PB4
#define col6 PB5
#define col7 PB6
#define col8 PB7
int keyboard(void)
{
keyportdirection1=0x00;
keyportdirection2=0xFF;
keyport1=0xFF;
int key=1;
for(int i=0;i<8;i++)
{
keyport2=0xFF;
keyport2&=~(0x01<<i);
if (!(keyportpin1&(1<<col1)))
{
while (!(keyportpin1&(1<<col1)))
{}
return key;
}
if (!(keyportpin1&(1<<col2)))
{
while (!(keyportpin1&(1<<col2)))
{}
key+=1;
return key;
}
if (!(keyportpin1&(1<<col3)))
{
while (!(keyportpin1&(1<<col3)))
{}
key+=2;
return key;
}
if (!(keyportpin1&(1<<col4)))
{
while (!(keyportpin1&(1<<col4)))
{}
key+=3;
return key;
}
if (!(keyportpin1&(1<<col5)))
{
while (!(keyportpin1&(1<<col5)))
{}
key+=4;
return key;
}
if (!(keyportpin1&(1<<col6)))
{
while (!(keyportpin1&(1<<col6)))
{}
key+=5;
return key;
}
if (!(keyportpin1&(1<<col7)))
{
while (!(keyportpin1&(1<<col7)))
{}
key+=6;
return key;
}
if (!(keyportpin1&(1<<col8)))
{
while (!(keyportpin1&(1<<col8)))
{}
key+=7;
return key;
}
key+=8;
}
return 0;
}