도와주세요!!
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
#include <time.h> //현재시간을 구하기 위해 헤더 파일 불러옴
#define IOM_LCD_BASE 0xbc
#define IOM_LCD_COMMAND_SET _IOW(IOM_LCD_BASE,0,32)
#define IOM_LCD_FUNCTION_SET _IOW(IOM_LCD_BASE,1,32)
#define IOM_LCD_DISPLAY_CONTROL _IOW(IOM_LCD_BASE,2,32)
#define IOM_LCD_CURSOR_SHIFT _IOW(IOM_LCD_BASE,3,32)
#define IOM_LCD_ENTRY_MODE_SET _IOW(IOM_LCD_BASE,4,32)
#define IOM_LCD_RETURN_HOME _IOW(IOM_LCD_BASE,5,32)
#define IOM_LCD_CLEAR _IOW(IOM_LCD_BASE,6,32)
#define IOM_LCD_DD_ADDRESS _IOW(IOM_LCD_BASE,7,32)
#define IOM_LCD_WRITE_BYTE _IOW(IOM_LCD_BASE,8,32)
struct strcommand_varible {
char rows;
char nfonts;
char display_enable;
char cursor_enable;
char nblink;
char set_screen;
char set_rightshit;
char increase;
char nshift;
char pos;
char command;
char strlength;
char buf[20];
};
void init_keyboard(void);
void close_keyboard(void);
int kbhit(void);
int readch(void);
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
unsigned char ch;
int nread;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int main(int argc, char **argv)
{
int i,dev;
char front[20] = "Now Time";
char row_buffer1[20];
char row_buffer2[20];
char *row_one = row_buffer1;
char *row_two = row_buffer2;
time_t t;
time(&t);
struct strcommand_varible strcommand;
strcommand.rows = 2;
strcommand.nfonts = 0;
strcommand.display_enable = 1;
strcommand.cursor_enable = 0;
strcommand.nblink = 0;
strcommand.set_screen = 1;
strcommand.set_rightshit= 0;
strcommand.increase = 1;
strcommand.nshift = 0;
strcommand.pos = 10;
strcommand.command = 1;
strcommand.strlength = 16;
memcpy(&strcommand.buf[0],front,20);
dev = open("/dev/TXTLCD", O_WRONLY|O_NDELAY );
if (dev != -1) {
write(dev,&strcommand,32);
sleep(1);
memset(row_one,0,20); // 0으로 리셋
memset(row_two,0,20); // 0으로 리셋
ioctl(dev,IOM_LCD_CLEAR,&strcommand,32);
sleep(1);
strcommand.pos = 3; // 첫번째 열 입출력(문자) 위치설정
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 0;i < 16;i++) {
if(row_one[i] == '\0') break;
memcpy(&strcommand.buf[0],&front[i],1) ;
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
row_one = ctime(&t) //시간을 문자열로 만든다음 ARRAY에 저장
strcommand.pos = 42; // 두번째 열 입출력(시간) 위치설정
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 11;i < 19;i++) { // 시간만 출력하기 위해 위치 설정
if(row_one[i] == '\0') break;
memcpy(&strcommand.buf[0],&row_one[i],1);
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
init_keyboard();
for(;;){
ioctl(dev,IOM_LCD_CURSOR_SHIFT,&strcommand,32);
usleep(200000);
if(kbhit()) break;
}
close_keyboard();
close(dev);
}
else {
printf( "application : Device Open ERROR!\n");
exit(-1);
}
return(0);
}
============================
바로 위가 코드인데요. 본래 원본 코드는 입력을 두번 받아서 그 문자열을 출력하는건데
현재 시간을 출력하게끔 바꿀려고 코드를 바꿔보았는데요.
사이트를 찾아가며 타임함수랑 모르는 함수들을 알아가며 써보았는데.
리눅스에서 make를 하면 에러가 뜹니다;ㅅ;ㅋ
test_lcd.c : in function 'main':
test_lcd.c : parse error before "strcommand"
make: ***[test_lcd] 오류 1
이게 에러 메세지인데;ㅅ; 어디가 문제인지..??
그리고 time 함수가 약간 불안한데 저렇게 하면 출력이 제대로 되는지 궁금하네요.
참고로 for문은 시간만 출력하기 위해 11부터 19까지 돌게끔 해뒀습니다;ㅅ;ㅋ
아무튼 많은 조언 및 지적 부탁드리겠습니다;ㅅ;ㅋ
PS. 참고루 minicom -s로 targetboard에 들어간 뒤 실행하는 것입니다;ㅅ;ㅋ
그리고 다른 파일도 하나 더있습니다만 여기만 고치면 될 것 같아서 올리지 않았습니다'ㅅ'
134 행에 ; 문자가 빠졌네요.
row_one = ctime(&t) //시간을 문자열로 만든다음 ARRAY에 저장
그리고 memcpy() 함수를 사용하셨으므로 string.h 를 include 문에 추가하세요. ^^