# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > سوال: رفع اشکال برنامه نویسی زبان c

## faz123

من میخوام برنامه اتصال کیبورد به ماژول رو بنویسم در کیبورد کامپیوتر را به پایه rxt میکرو وصل چون داریم از سریال میکرو استفاده میکنیم دیگه ماژول رو نمیتونیم به پاییه txt وصل کنیم. برای همین باید یه پورت سریال مجازی بسازیم . من برنامه اتصال کیبورد به lcd  رو دارم و همینطور برنامه ایجاد پورت سریال نرم افزاری میتونه کسی این ها رو با هم ترکیب کنه و برنامه درست رو بگه بهم؟
#include <mega16.h>
#include <stdio.h>
#include <lcd.h>
#incude <delay.h>
#asm
    .equ __lcd_port=0x1B  ;PORTA
#endasm
unsigned char buffer_lcd[20],Scan_Code;
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x00;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0xF6;
lcd_init(16);
#asm("sei");
while(1)
{
lcd_clear();
sprintf(buffer_lcd,"Key_Press=%X",Scan_Code);
lcd_puts(buffer_lcd);
delay_ms(300);
}
}
interrupt [USART_RXC]void usart_rx_isr(void)
{
unsigned char buffer;
buffer=UDR;
switch(buffer)
{
case 0xF0:
break;
case 0xE0:
break;
default:
Scan_Code=buffer;
}
}
و برنامه پورت سریال نرم افزاری:
#include <delay.h>

#define TX2_PIN        PORTC.0 // UART2 TX pin 
#define TX2_DDR   DDRC.0  // UART2 TX Direction Register

// TX & RX levels
#define HIGH    1
#define LOW        0  

// UART2 specific 
#define DATA_BIT_LENGTH        104  // ((1/BAUD)*10000000)


// put a character DIRECTLY to the UART2
void putchar2(unsigned char c)
{

  unsigned char i;

    TX2_PIN = LOW;                   // clear output (start bit) 
    delay_us(DATA_BIT_LENGTH);

  for(i=0; i<8; i++)
  {
        TX2_PIN = (c & 0x01);
        delay_us(DATA_BIT_LENGTH);
        c >>= 1;                // next bit, please ! 
  }

  TX2_PIN = HIGH;          // stop bit (bit #8)
  delay_us(DATA_BIT_LENGTH);

}

void puts2(char* str)
{
  while( *str != '\0' )
  {
      putchar2((unsigned char) *str++);
  }
}

// UART2 initialization function (we MUST call this function BEFORE using UART2)
void initUART2(void)
{
  TX2_PIN = 1;  // logic 1 (high level = STOP TX)
  TX2_DDR  = 1; // output
}

----------


## Abbas Amiri

راه حل سخت افزاری هم هست . از میکروهایی استفاده کنید که بیش از یک رابط USART دارند .

----------


## faz123

> راه حل سخت افزاری هم هست . از میکروهایی استفاده کنید که بیش از یک رابط USART دارند .


 بله اینم میشه اما در این صورت چطور باید راه اندازیش کنم ؟
دوم این که برنامه من روی ال سی دی نشون میده من میخوام این کار رو نکنه و فقط بره تو بافر در این صورت ایا فقط اگر قسمت های مربوط به ال سی دی رو حذف کنم درست میشه؟
اینا باید حذف شه؟
 #include <lcd.h>
#asm
    .equ __lcd_port=0x1B  ;PORTA
#endasm
lcd_init(16);
lcd_clear();
lcd_puts(buffer_lcd);

----------

