제가 요번에 전자계산기 제어 산업기사를 보게 되서 실기를 연습 중입니다..
그래서 이렇게 연습을 하게 되었는데요.
일단 프로그램이 동작은 되기는 합니다..
근데 키를 여러번 눌러야지 반응 하거나 누르고 조금 기다려야지 반응을 보입니다..
조금 빠르게 반응 하게 하는 방법은 없을까요..?
그리고 232통신을 하게 되면 데이터가 송신은 하는데, 계속 송신되서 스크롤이 아래로 내려갑니다..
송신을 한번만 하게 하거나 계속 처음 자리에서 출력되게 하는 방법은 없을까요??
#include <io51.h>
#define RS P3.4
#define RW P3.5
#define E P3.6
bit sw0 = P0.4;
bit sw1 = P0.5;
bit sw2 = P0.6;
bit sw3 = P0.7;
unsigned int keyvalue = 0x0f;
void delay_ms(unsigned int ms)
{
unsigned int i,cnt;
for(i=0; i<ms; i++)
for(cnt=0; cnt<230; cnt++);
}
void delay(unsigned int del)
{
while(del--);
}
void lcd_cmd(char ch)
{
RS=0;
RW=0;
E=1;
delay(10);
P1=ch;
E=0;
}
void lcd_putc(char ch)
{
RS=1;
RW=0;
E=1;
delay(10);
P1=ch;
E=0;
}
void lcd_puts(char *p)
{
unsigned char ch;
while(ch=*p++) lcd_putc(ch);
}
void lcd_clr(void)
{
lcd_cmd(0x01);
}
void lcd_xy(int x, int y)
{
if(y==0) lcd_cmd(x+0x80);
if(y==1) lcd_cmd(x+0xc0);
}
void lcd_init(void)
{
delay_ms(100);
lcd_cmd(0x38); // Function Set
delay_ms(10);
lcd_cmd(0x0C); // Display On/Off
delay_ms(3);
lcd_cmd(0x01); // Display Clear
lcd_cmd(0x06); // Entry Mode Set
}
void keycheck(void)
{
unsigned int key;
sw0=0; sw1=1; sw2=1; sw3=1;
key=(P0 & 0x0f);
if(key != 0x0f){
switch(key){
case 0x0d : keyvalue=0x01; break;
case 0x0b : keyvalue=0x02; break;
case 0x07 : keyvalue=0x03; break;
}
}
}
void txd(unsigned char ch)
{
while(!TI);
TI=0;
SBUF = ch;
}
void usart_puts(char *p)
{
unsigned char ch;
while(ch=*p++) txd(ch);
}
void usart_init(void)
{
TMOD = 0x20;
TH1 = 0xfa;
TCON = 0x40;
IE = 0x90;
PCON = 0x00;
SCON = 0x53;
}
void main(void)
{
lcd_init();
lcd_clr();
usart_init();
delay_ms(100);
lcd_xy(0,0);
lcd_puts("DATA...SYSTEM");
lcd_xy(0,1);
lcd_puts("DATA INPUT");
delay_ms(2000);
lcd_xy(0,0);
lcd_puts("12345678 ");
lcd_xy(0,1);
lcd_puts("HHHHHHHH ");
do{
//keyvalue=0x0f;
keycheck();
if(keyvalue != 0x0f){
switch(keyvalue){
case 1:
lcd_xy(0,0);
lcd_puts("12345678 ");
lcd_xy(0,1);
lcd_puts("LHHHHHHH ");
keyvalue = 0x0f;
break;
case 2:
lcd_xy(0,0);
lcd_puts("12345678 ");
lcd_xy(0,1);
lcd_puts("LHLHLHLH ");
usart_puts("12345678");
txd(0x0A); // 커서를 아래로 내려준다.
txd(0x0D); // 커서를 맨 앞으로 보내준다.
usart_puts("LHLHLHLH");
txd(0x0A); // 커서를 아래로 내려준다.
txd(0x0D); // 커서를 맨 앞으로 보내준다. */
keyvalue = 0x0f;
break;
case 3:
lcd_xy(0,0);
lcd_puts("12345678 ");
lcd_xy(0,1);
lcd_puts("HLHLHLHL ");
usart_puts("12345678");
txd(0x0A); // 커서를 아래로 내려준다.
txd(0x0D); // 커서를 맨 앞으로 보내준다.
usart_puts("HLHLHLHL");
txd(0x0A); // 커서를 아래로 내려준다.
txd(0x0D); // 커서를 맨 앞으로 보내준다.
keyvalue = 0x0f;
break;
}
}
}while(1);
}
포인터를 받아서 포인터의 내용이 0이 될때까지 계속 보내라면....안되지요...널문자를 체크 하도록 해야지요...
void usart_puts(char *p)
{
unsigned char i=0;
while(*(ptr+i)!='\0') txd(*(ptr+i++)) ;
}
{
unsigned char i;
for(i=0;i<strlen(str);i++)
{
txd(str[i]);
}
}
편한데루 쓰세요..
감사합니다.. 수정해보겠습니다.. 정말 감사드려요!!