임베디드/Atmega

5월 30일 atmega 문자출력

송시혁 2013. 5. 31. 08:24







그림을 보면 PORTD,DDRD를 사용해야 한다는 것을 알 수 있다.그림에서 LCD_RS, RW, EN을 확장보드판에 각각 50,49,48번에 연결하였다.
그러나 정의 할 때는 #define LCD_RS 50이라고 정의하면 안된다. 50번은 핀이 50번째 있다는 의미이지,
50을 정의 한다해서 저 핀을 쓸수 있는게 아니다. 




PORTD에 관한 정보이다. 50, 49,48번에 해당하는 핀은 PORTD7,6,5에 1번을 집어넣고 나머지는 0으로 만들어야 된다.

1110 0000을 만들기 위해서는 헤더파일에 다음과 같이 정의한다.



#define LCD_RS (1<<7) 
#define LCD_RW (1<<6)
#define LCD_EN (1<<5)
각각의 쉬프트연산을 하여 7,6,5 번에 1을 넣은뒤, 아래와 같이 |시킨다.

DDRD= (LCD_RS)|(LCD_RW)|(LCD_EN);



아래그림을 보면,  bus선은 53~60에 연결하였다. 그래서 DDRC, PORTC를 사용한다.








LCD 타이밍도 , 아트메가도 마찬가지로 LCD를 사용하기 위해서는 타이밍도를 참조하고 소스를 구성해야 한다.




LCD_EN부분을 비활성화 0으로 만들어 준다. 
LCD_EN이 헤더 파일에 (1<<5)로 정의 되어 있다. 즉, 0001 0000이다.
PORTD =1111 1111이라고 가정한다면,
LCD_EN=0001 0000 에서 5번비트만, 0으로 만들고, 나머지를 1로 만들고 특정 비트만을 바꾸기 위해서는 
먼저 바꾸고자 하는것을 ~(not)연산자를 사용하여 반전시킨 다음에 &시키면,
특정한 위치에 0으로 바꿀 수 있다.

1111 1111
1110 1111-> 반전시킨 것.

결과= 1110 1111이 된다.

PORTD=PORTD|LCD_EN;

PORTD와 LCD_EN을 |시켜서 5번째 자리에 1을 넣어 활성화 시킨다.

데이터를 실제로 쓰는 부분이라고 생각한다.
두번째 지연문이 끝난 다음, 함수의 인자인 ucdata를 PORTC에 넣는다.
기존의 ARM과는 달리, BUS선을 따로 초기화 시킬 필요가 없다.(//PIO_CODR = LCD_BS;)
그 이유는 PORTC자체가 BUS선이므로, 바로 ucdata를 넣으면 된다.


PORTC=ucdata;




PORTD=  PORTD&(~LCD_EN)기법이 사용되었다.

data를 모두 읽었기 때문에 활성화는 low가 된다.
마찬가지로 특정한 자리에 0으로 만들기 위해서

PORTD&(~LCD_EN)기법이 사용되었다.







DATA_WRITE 함수는 위에 빨간네모 말고는 다를 게 없다. 저 부분이 다른 이유는 ARM에서도 이미 다루었듯이

데이터를 입력받기 위해서는 RS가 HIGH가 되어야 하므로, PORTD에 LCD_EN에 해당비트를 1로 맟추어야 한다.

PORTD= PORTD|LCD_EN; 그래서 '|'시키면, 해당비트에 1이 되어 RS는 HIGH값이 되어 데이터를 입력받는다.








마찬가지로 VOID *형 인자로 받는다. main()함수에서 lcd_string()함수 호출시

입력받고자 하는문자를 "000"를 인자로 받는다.

그러면, 반복문이 실행하고 종료조건으로 if문을 써서 0이 되며, 반복문이 종료된다.

한 문자씩 lcd_data_write에 인자로 입력받고 출력된다. 


vp=(unsigned char *)vp+1;은 가르키고 있는 문자에 +1을 하여 다음문자를 vp에 

넣게 된다. 예를 들어서 "test"에서 't'가 실행되고 난뒤, 't'다음에 있는 'e'를 출력한다.