Sayısal tuş takımı ile alfanümerik değerler üretme (eski 3310 telefonlar)

Başlatan Erhan YILMAZ, 03 Mayıs 2014, 21:28:57

Erhan YILMAZ

Bir uygulama için mikrodenetleyici ile numerik tuştakımı ile alfanümerik değerler yazdırmam gerekiyor. Kafamda birşeyler kurdum ama biarz karışık gibi daha koda dökmedim. Bu iş için hazır bir algoritma var mı? C ile yazmayı düşünüyorum muhtemelen bir tane zamanlayıcı gerekecek. Elinde paylaşmak istediği hazır kod, algoritma v.s. olan var mı? Eski telefonlarda kullanılan sistemi c ile kodlayarak mikrodenetleyicide koşturamayı düşünüyorum.

igolcubasi

Erhan hocam gmail hesabınıza örnek bir çalışma gönderdim,umarım işinize yarar.

kantirici

her tuş için şöyle bir dizi olsa(temsili);

tuslar = {
    '2': 'abc',
    '3': 'def',
    '4': 'ghi',
    '5': 'jkl',
    '6': 'mno',
    '7': 'pqrs',
    '8': 'tuv',
    '9': 'wxyz',
}


öncelikle tuş alğılansa. Mesela 3 tuşuna basılsın. 3 tuşuna atanan harflerden ilk yani 'd' seçilsin. 100ms içnide tekrar 3'e basılırsa 'e' seçilsin. 100ms den sonra 3 e basılırsa  başa dönerek tekrar 'd' seçilsin. Eğer 3 den farklı bir tuşa basılırsa o tuşa ait harflere geçilsin gbi bir alğoritma olabilir.

Erhan YILMAZ

@igolcubasi hocam teşekkür ederim işime yarayacaktır. Bende anlam veremedim gelen maili görünce şimdi konuya bakınca anladım. :)

Ramiz

Electrical & Electronics Engineering -> Step one

igolcubasi

#include <htc.h>
#include "delay.h"
#include "lcd.h"

#define row1 RC3
#define row2 RC4
#define row3 RC5
#define row4 RC6
#define col1 RD0
#define col2 RD1
#define col3 RD2


char timer;
char keyactive=1,lastkey=0;
char maxlength;
char keyflag=0;
char Posflag=0;
float counter=0;
char key=0;
char symbolflag=0;
char tmpkey=0;
char UpperCase=0;
char textkey=0;
char currentrow;
char initPos;
char maxLength;
char PreviousKey=0;

char scanKeyboard(void)
{
         key=0;
        
        row1=1;
        if(col1)
        	key='1';
        else if (col2)
        	key='2';
        else if (col3)
            key='3';
        row1=0;
        
        row2=1;
        if(col1)
            key='4';
        else if (col2)
            key='5';
        else if (col3)
            key='6';
        row2=0;
        
        row3=1;
        if(col1)
            key='7';
        else if (col2)
            key='8';
        else if (col3)
            key='9';
        row3=0;
        
        row4=1;
        if(col1)
            key='*'; 
        else if (col2)
            key='0';
        else if (col3)
            key='#';
         row4=0;
        
        if((keyactive>0)&&(lastkey==key)){
        	key=0;
        }
        else{
        	keyactive=key;
        	lastkey=key;
        }
        
        return key;
        
}

void placeCursor(char currentrow, char currentcol, char maxLength){
	char i;
	lcd_gotoxy(currentrow,currentcol);
	for (i=0;i<maxLength;i++){
		lcd_yaz(" ");
	}
	lcd_gotoxy(currentrow,currentcol);
	lcd_komut(ImlecYanSon);
	
}


char charKeyboard(char currentrow, char initPos, char maxLength, char textkey)
{
	char textflag=0;
	char tmpkey=0;
	
	tmpkey=textkey;
	

	switch(textkey){
	
		case ('0'):{
				textkey=keyflag + ' ';
				keyflag++;

		}break;
		
		case ('1'):{
				textkey='.' - keyflag;
				keyflag++;
				symbolflag++;
		}break;
		
		case ('*'):{
				textkey='*';
		}break;
		
		case ('#'):{
				textkey='#';
				UpperCase++;
				if(UpperCase>1){
					UpperCase=0;
				}					
		}break;
		
		case ('2'):{ 				
					textkey=keyflag+'a';
					keyflag++;			
		}break;
		
		case ('3'):{ 					
					textkey=keyflag+'d';
					keyflag++;
		}break;
		
		case ('4'):{ 					
					textkey=keyflag+'g';
					keyflag++;
		}break;
		
		case ('5'):{ 					
					textkey=keyflag+'j';
					keyflag++;
		}break;
		
		case ('6'):{ 					
					textkey=keyflag+'m';
					keyflag++;
		}break;
		
		case ('7'):{ 					
					textkey=keyflag+'p';
					keyflag++;
		}break;
		
		case ('8'):{ 					
					textkey=keyflag+'t';
					keyflag++;
		}break;
		
		case ('9'):{ 					
					textkey=keyflag+'w';
					keyflag++;
		}break;
		
		default : textkey=0;break;
	}
	
	if((tmpkey==55)||(tmpkey==57)){ // the key 7 and 9 have 4 letter character, the others have 3 letter character
		if (keyflag>4){
			keyflag=0;
			return tmpkey;	// if keyflag is greater than 4, this function returns the number for 7 or 9 key 
		}
	}
	else if(tmpkey==48){
		if (keyflag>1){
			keyflag=0;
			return tmpkey; // if keyflag is greater than 1, this function returns the number 0
		}
	}
	else if(tmpkey==49){
		if(keyflag==8){
			textkey=':';
		}
		else if(keyflag==9){
			textkey=';';
		}
		else if(keyflag==10){
			textkey='?';
		}
		else if(keyflag==11){
			textkey='/';
		}
		else if(keyflag==12){
			textkey='#';
		}
		else if(keyflag>12){
			keyflag=0;
			return tmpkey;
		}
	}
	else{
		if(keyflag>3){
			keyflag=0;
			return tmpkey; 
		}
	}
	
	
	if(UpperCase){
		textkey=textkey-32;
		if((tmpkey=='0')||(tmpkey=='*')||(tmpkey=='1')){
			textkey=textkey+32;
		}
	}
		
	return textkey;	// if key is 7 or 9 and, keyflag is not greater than 4 for 7 and 9. this function returns the letters for 7 and 9
					// or if key are the others and, keyflag is not greater than 3. this function returns the letters for the others
}
void closeCursor(void)
{
	lcd_komut(ImlecGizle);
}

void cursorUpdate(void)
{
	lcd_komut(ImlecYanSon);
}


void PrintNextPos(char currentrow, char initPos, char maxLength, char letter) //if the previous key and currentkey are not same, print next position
{
	if(textkey != '#'){
		if(Posflag<maxLength){
			lcd_gotoxy(currentrow,initPos+Posflag);
			veri_yolla(letter);	
			Posflag++;
		}
	}
}

void PrintSamePos(char currentrow, char initPos, char maxLength, char letter) // if the previous key and currentkey are same, print same position
{	
	if(textkey != '#'){
		if(Posflag<=maxLength){
			lcd_gotoxy(currentrow,initPos+Posflag-1);
			veri_yolla(letter);
		}
	}
	
	if(Posflag==maxLength){
		closeCursor();
	}
}

char isSameKey(char textkey)	// are the previous key and current key  same?
{	
	if(PreviousKey != 0 || textkey != 0){
		if (PreviousKey==textkey){
			return 1;
		}
		else{
			PreviousKey=textkey;
			return 0;
		}
	}
	return 0;
}


void TextMode(char currentrow, char initPos, char maxLength ) 
{	
	char letter;

	
	
	
	if(Posflag<=maxLength){
		textkey=scanKeyboard();
	}
	else{
		Posflag++;
		textkey=0;
	}
	
		if(textkey != 0){	
			if(timer==2){
				cursorUpdate();
				keyflag=0;
				letter=charKeyboard(currentrow, initPos, maxLength, textkey);
				PrintNextPos(currentrow, initPos, maxLength, letter);
				timer=0;
				PreviousKey=textkey;
			}
			else{
				if(isSameKey(textkey)){ 
						closeCursor();	// close cursor, until it is timeout or the key is different
						letter=charKeyboard(currentrow, initPos, maxLength, textkey);
						PrintSamePos(currentrow, initPos, maxLength, letter);
						timer=0;			
				}
				else{
					cursorUpdate();	// updatecursor, if it is different key
					keyflag=0;
					letter=charKeyboard(currentrow, initPos, maxLength, textkey);				
					PrintNextPos(currentrow, initPos, maxLength, letter);
					timer=0;
				}
			}
		}
		else if(timer==2){	// updatecursor, only if it is timeout 
			cursorUpdate();
			keyflag=0;
		}
}
void main(void)
{  
   char key=0;
   
   ADCON1=0x07;
   TRISA=0x00;
   TRISB=0x00;
   TRISC=0x00;
   TRISD=0xFF;
   PORTB=0;PORTC=0;PORTD=0;
    
   TMR1H=-50000/256;
   TMR1L=-50000%256;
   TMR1CS=0;
   T1CKPS1=1;
   T1CKPS0=0;
   T1SYNC=1;
   TMR1IF=0;
   TMR1IE=1;
   TMR1ON=1;
   PEIE=1;
   GIE=1;
           
   lcd_init();
   lcd_komut(ImlecGizle);
    
   while(1){
	   
	   TextMode(1,1,5);
   } 
}

static void interrupt
textinterrupt(void)
{
	if(TMR1IF){
		GIE=0;
		
		timer++;		
		if(timer>2)
			timer=0;
		
		TMR1H=-50000/256;
		TMR1L=-50000%256;
		TMR1IF=0;
		GIE=1;
	}
}

Klein

Bir zamanlar bir iş için yazmıştım. Kodlar çok eski olduğu iin tamamını hatırlamıyorum. Hatırladığım kadarıylaaçıklamaya çalışacağım.

updateinboxval(0 ,inptr);
bu LCD'yi güncellemek için.   ilk parametre sütun, ikinci parametre uzunluk.

62, 16, 70 değerli tuşlar muhtemelen enter ve benzeri onay tuşları.
60 ve 21  backspace ve geri tuşları.
63 ve 14  esc gibi onaysız çıkş tuşları.
rakam tuşlarına basıldığında gelen key değerleri ASCII kodlamasına göre.


keypress değişkeni  tuşa basıldığını gösteren bayrak.
keypress = nopress tuş basılı olduğu srece tekrar girmesin diye.

Hatırladığım kadarıyla Büyük harfler yoktu.  Biraz tadilatla işini görebilir.


unsigned char alphaedit(unsigned char length){
unsigned char inptr =0;
unsigned char ret = 0;
unsigned char loopval =0xFF;
unsigned long int I;
unsigned char alphaindex=0;
unsigned char alphaflag=0;
unsigned char numkey=0;
unsigned char lastkey=0;
	keybuf[0]=0;
	keypress=nopress;
	key=0xFF;
	while (loopval){
		if (keypress){
	 			keypress = nopress;
			if ((key > ' '&& key < 60)&&(inptr<length)){
				numkey=key-48;
	 			I=0;
				if(inptr){
					if(key != lastkey){
						lastkey=key;
						I=561000;
						goto ptrplus;		
					}
				}else lastkey=key;
				alphaflag=1;
				cursor_off();
				keybuf[inptr]=alphamap[numkey*5+alphaindex];
				if (++alphaindex >4) alphaindex=0; 
				keybuf[inptr+1]=0;
			}

			if((key == 62 || key==16 || key==70) && inptr) {cursor_off();ret=1;loopval=0;}
			if ((key == 60 || key==21) && inptr) {
				inptr--;
				keybuf[inptr]=' ';
				updateinboxval(0 ,inptr);
				keybuf[inptr]=0;
			}		
			if (key == 63 || key==14) {cursor_off();loopval=0;}
				updateinboxval(0,inptr);
		}
ptrplus:
		if(I < 260000) I++;
			else 
			if (alphaflag){
				alphaindex=0;
				alphaflag=0;
				inptr++;
				keybuf[inptr]=0;
				cursor_on();
			}
	} // while(1) block end
	return(ret);
}

Erhan YILMAZ

Sağolun hocam inceleyeceğim.
Bende baktım ascii karakter sırasına göre olacak gibi değil. 0-9 tuşlarını kullandım her tuşa 6 karakter atadım. Büyük harfleri kullandım. Kalanlara da diğer noktalama işaretlerini v.s. koyarak halletmeye çalışıyorum. 10x6'lık bir dizi ile basılan tuş ve basılma adetine göre istenen karakteri gösterdim.