Moderadores: 51, guest2003, Renie, gpenga
renan-papaco escreveu:ok, vou fazer um fluxograma e upar o link aqui.. ja q num tenho conta em sites de armazenamentos de fotos eu posto a foto no facebook e colo o link aqui.
// a variável global dispara, se 1 indica que novo incremento na contagem
/******* EXECUCAO ********/
If ( dispara ) Varredura() ;
/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
{
//////// ???
}
dispara = 0 ;
}
andre_teprom escreveu:Renan,
Na verdade, não entendi muito além de um determinado ponto pois ainda não ficou claro pra mim, e acabei parando na varredura.
Qual seria exatamente o objetivo disso ?
- Código: Selecionar todos
// a variável global dispara, se 1 indica que novo incremento na contagem
/******* EXECUCAO ********/
If ( dispara ) Varredura() ;//poderia explicar para mim a função desta linha?
/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
coluna=P1;//(não sei se está certo... o objetivo é fazer com q o port P1 controle a varredura, através de um CD4511 contando junto com a variável coluna.)
{
//////// ???(aqui seriam os códigos de soma da coluna e da linha e cada uma delas representa uma tecla... não precisa ser todas as teclas do teclado necessariamente)
}
dispara = 0 ;
}
Mas se serve de consolo, ( respondendo a sua questão inicial ) qualquer lógica pode ser implementada em C.
Vamos entendendo aos poucos e vamos avançando passo-a-passo.
+++
// a variável global dispara, se 1 indica que novo incremento na contagem
/******* EXECUCAO ********/
If ( dispara ) Varredura() ;
/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
{
// filtro para aplicar na porta apenas a parte baixa do contador, sem interferir nos demais pinos
P1 |= ( coluna & 0x0F ) ;
P1 &= ( coluna | 0xF0 ) ;
}
dispara = 0 ;
}
unsigned char linhasTeclado[16];
void amostraTeclado(void){
unsigned char i;
for(i=0;i<16;i++){
habilita_linha(i,1);
linhasTeclado[i] = P0;
habilita_linha(i,0);
}
}
void habilita_linha(unsigned char linha,unsigned char valor){
switch(linha){
case 0: P2_0 = valor; break;
case 1: P2_1 = valor; break;
case 2: P2_2 = valor; break;
// e assim por diante para todas as linhas....
}
}
xdata volatile byte linha_01 _AT_ 0x100;
xdata volatile byte linha_02 _AT_ 0x200;
xdata volatile byte linha_03 _AT_ 0x400;
xdata volatile byte linha_04 _AT_ 0x800; // e assim por diante
// como não estamos utilizando um decodificador de endereços, perdemos uma ampla faixa aqui, mas como a idéia é um hardware minimalista não há problemas....
xdata volatile *byte linhas[4] = { &linha_01,&linha_02,&linha_03,&linha_04};
unsigned char amostraTeclado[4];
void amostragemTeclado(void){
unsigned char i;
for(i=0;i<4;i++)
amostraTeclado[i] = *linhas[i];
}
andre_teprom escreveu:Bom, inclui agora a leitura da porta no código de varredura que fiz anteriormente.
Quanto ás demais funcionalidades, ainda estou quebrando um pouco a cabeça pra entender, mas devagar vai indo...
- Código: Selecionar todos
// a variável global dispara, se 1 indica que novo incremento na contagem
/******* EXECUCAO ********/
If ( dispara ) Varredura() ;
/****** DECLARACAO *******/
void varredura ( void )
{
static int coluna = 0 ;
if ( coluna++ <= 11 )
{
// filtro para aplicar na porta apenas a parte baixa do contador, sem interferir nos demais pinos
P1 |= ( coluna & 0x0F ) ;
P1 &= ( coluna | 0xF0 ) ;
}
dispara = 0 ;
}
+++
#define N_AMOSTRAS 4 // OU A QUANTIDADE QUE VOCÊ QUISER
#define LINHAS 4 // QUANTIDADE DE LINHAS DO TECLADO, VOCÊ DEFINE DE ACORDO COM O TEU HARDWARE
unsigned char amostraTeclas[N_AMOSTRAS][LINHAS];
void amostraTeclado(){
static unsigned char amostra=0;
unsigned char i;
for(i=0;i<LINHAS;i++){
///chama aqui o código que postei anteriormente com a alteração abaixo
amostraTeclas[amostra] = ....
}
amostra = (amotra+1) % N_AMOSTRAS;
}
// PARA SABER SE E QUAL TECLA FOI PRESSIONADA
unsigned char leTecla(void){
unsigned char k,i,j,cont;
unsigned char codigoTec;
for(k=0;k<linhas;k++)
for(i=0;i<8;i++)
for(j=0;j<8;j++){
codigoTec++;
cont=0;
if(amostraTeclas[k][i]&(0x01)<<j)
cont++;
if(cont>N_AMOSTRAS>>1)
return codigoTec;
}
return 0;
}
Aquino escreveu:Ali no código já existe a variável "de entrada". Na verdade o somatório que falas é a amostragem?
Nesse caso, bastaria criar algo do tipo
- Código: Selecionar todos
#define N_AMOSTRAS 4 // OU A QUANTIDADE QUE VOCÊ QUISER
#define LINHAS 4 // QUANTIDADE DE LINHAS DO TECLADO, VOCÊ DEFINE DE ACORDO COM O TEU HARDWARE
unsigned char amostraTeclas[N_AMOSTRAS][LINHAS];
void amostraTeclado(){
static unsigned char amostra=0;
unsigned char i;
for(i=0;i<LINHAS;i++){
///chama aqui o código que postei anteriormente com a alteração abaixo
amostraTeclas[amostra] = ....
}
amostra = (amotra+1) % N_AMOSTRAS;
}
// PARA SABER SE E QUAL TECLA FOI PRESSIONADA
unsigned char leTecla(void){
unsigned char k,i,j,cont;
unsigned char codigoTec;
for(k=0;k<linhas;k++)
for(i=0;i<8;i++)
for(j=0;j<8;j++){
codigoTec++;
cont=0;
if(amostraTeclas[k][i]&(0x01)<<j)
cont++;
if(cont>N_AMOSTRAS>>1)
return codigoTec;
}
return 0;
}
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante