سلام
من یک برنامه نوشتم کمی ایراد داره
لطفا یکی کمک کنه
.
مبکروی مگا هشت کیبرو رو میخونه و با توجه به کلیدی که زده شده یک کد از طریق اس پی آی به میکرو ی مگا 32 ارسال میکنه
میکرو ی مگا 32 هم با توجه به کد دریافت شده و اینکه بیت shift یک باشه یا نه کاراکتر معادل کلید رو درون آرایه ی l1lcd[] قرار میده
اینکه تو کدوم خونه اش قرار بگیره رو pos1 مشخص میکنه که با هر بار زدن کلید و اجرای روتین یک واحد اضافه میشه تا اگه کلید بعدی زده شد بره تو خونه ی بعدی
مشکل الان دقیقا اینه که با هر بار زدن کلید کاراکتر زده شده بی نهایت بار میره خونه های آرایه ریخته میشه
من چه کار کنم که فقط با یک بار زدن کلید فقز یک بار انجام بشه ؟
ممنون !
این هم بخش از کل برنامه : در سمت مگا 32
.
.
[code=cpp]
#include <mega32.h>
#include <delay.h>
#include <string.h>
#include <stdio.h>
#include <lcd.h>
#include <string.h>
#asm
.equ __lcd_port = 0x1b ;
#endasm
bit control_key = 0 , print_key = 0 , other_key = 0 ;
bit enter = 0 , delete = 0 , bspace = 0 ;
bit shift = 0 , normal = 1 ;
char l1lcd[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
char l1clr[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
char nt[] , st[] , n ;
unsigned char pressed_key ;
interrupt [SPI_STC] void spi_stc_isr(void)
{
pressed_key = SPDR ;
switch(pressed_key)
{
case 0x71 : print_key = 1 ; n = 15 ; nt[n] = 'q' ; st[n] = 'Q' ; break ; // q
case 0x77 : print_key = 1 ; n = 16 ; nt[n] = 'w' ; st[n] = 'W' ; break ; // w
case 0x65 : print_key = 1 ; n = 17 ; nt[n] = 'e' ; st[n] = 'E' ; break ; // e
case 0x72 : print_key = 1 ; n = 18 ; nt[n] = 'r' ; st[n] = 'R' ; break ; // r
case 0x74 : print_key = 1 ; n = 19 ; nt[n] = 't' ; st[n] = 'T' ; break ; // t
case 0x79 : print_key = 1 ; n = 20 ; nt[n] = 'y' ; st[n] = 'Y' ; break ; // y
case 0x75 : print_key = 1 ; n = 21 ; nt[n] = 'u' ; st[n] = 'U' ; break ; // u
case 0x69 : print_key = 1 ; n = 22 ; nt[n] = 'i' ; st[n] = 'I' ; break ; // i
case 0x6f : print_key = 1 ; n = 23 ; nt[n] = 'o' ; st[n] = 'O' ; break ; // o
case 0x70 : print_key = 1 ; n = 24 ; nt[n] = 'p' ; st[n] = 'P' ; break ; // p
case 0x5b : print_key = 1 ; n = 25 ; nt[n] = '[' ; st[n] = '{' ; break ; // [
case 0x5d : print_key = 1 ; n = 26 ; nt[n] = ']' ; st[n] = '}' ; break ; // ]
}
if(print_key==1 && shift==0 && pos1<15)
{
l1lcd[pos1] = nt[n] ;
pos1++ ;
}
else if(print_key==1 && shift==1 && pos1<15)
{
l1lcd[pos1] = st[n] ;
pos1++ ;
}
}
[/code]
من یک برنامه نوشتم کمی ایراد داره
لطفا یکی کمک کنه
.
مبکروی مگا هشت کیبرو رو میخونه و با توجه به کلیدی که زده شده یک کد از طریق اس پی آی به میکرو ی مگا 32 ارسال میکنه
میکرو ی مگا 32 هم با توجه به کد دریافت شده و اینکه بیت shift یک باشه یا نه کاراکتر معادل کلید رو درون آرایه ی l1lcd[] قرار میده
اینکه تو کدوم خونه اش قرار بگیره رو pos1 مشخص میکنه که با هر بار زدن کلید و اجرای روتین یک واحد اضافه میشه تا اگه کلید بعدی زده شد بره تو خونه ی بعدی
مشکل الان دقیقا اینه که با هر بار زدن کلید کاراکتر زده شده بی نهایت بار میره خونه های آرایه ریخته میشه
من چه کار کنم که فقط با یک بار زدن کلید فقز یک بار انجام بشه ؟
ممنون !
این هم بخش از کل برنامه : در سمت مگا 32
.
.
[code=cpp]
#include <mega32.h>
#include <delay.h>
#include <string.h>
#include <stdio.h>
#include <lcd.h>
#include <string.h>
#asm
.equ __lcd_port = 0x1b ;
#endasm
bit control_key = 0 , print_key = 0 , other_key = 0 ;
bit enter = 0 , delete = 0 , bspace = 0 ;
bit shift = 0 , normal = 1 ;
char l1lcd[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
char l1clr[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
char nt[] , st[] , n ;
unsigned char pressed_key ;
interrupt [SPI_STC] void spi_stc_isr(void)
{
pressed_key = SPDR ;
switch(pressed_key)
{
case 0x71 : print_key = 1 ; n = 15 ; nt[n] = 'q' ; st[n] = 'Q' ; break ; // q
case 0x77 : print_key = 1 ; n = 16 ; nt[n] = 'w' ; st[n] = 'W' ; break ; // w
case 0x65 : print_key = 1 ; n = 17 ; nt[n] = 'e' ; st[n] = 'E' ; break ; // e
case 0x72 : print_key = 1 ; n = 18 ; nt[n] = 'r' ; st[n] = 'R' ; break ; // r
case 0x74 : print_key = 1 ; n = 19 ; nt[n] = 't' ; st[n] = 'T' ; break ; // t
case 0x79 : print_key = 1 ; n = 20 ; nt[n] = 'y' ; st[n] = 'Y' ; break ; // y
case 0x75 : print_key = 1 ; n = 21 ; nt[n] = 'u' ; st[n] = 'U' ; break ; // u
case 0x69 : print_key = 1 ; n = 22 ; nt[n] = 'i' ; st[n] = 'I' ; break ; // i
case 0x6f : print_key = 1 ; n = 23 ; nt[n] = 'o' ; st[n] = 'O' ; break ; // o
case 0x70 : print_key = 1 ; n = 24 ; nt[n] = 'p' ; st[n] = 'P' ; break ; // p
case 0x5b : print_key = 1 ; n = 25 ; nt[n] = '[' ; st[n] = '{' ; break ; // [
case 0x5d : print_key = 1 ; n = 26 ; nt[n] = ']' ; st[n] = '}' ; break ; // ]
}
if(print_key==1 && shift==0 && pos1<15)
{
l1lcd[pos1] = nt[n] ;
pos1++ ;
}
else if(print_key==1 && shift==1 && pos1<15)
{
l1lcd[pos1] = st[n] ;
pos1++ ;
}
}
[/code]
دیدگاه