블로그 이미지
송시혁

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

2013. 5. 31. 08:24 임베디드/Atmega







그림을 보면 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'를 출력한다.







'임베디드 > Atmega' 카테고리의 다른 글

6월 3일 usart  (0) 2013.06.11
5월 30일 lcd에 숫자를 출력하는 함수.  (0) 2013.06.10
5월 31일 atmega timer  (0) 2013.06.03
5월 29일 LCD결선  (0) 2013.05.29
5월 28일 atmega2560 컴파일  (0) 2013.05.28
posted by 송시혁