================================ Outline ====================================
AT91SAM7S256 데이터 시트
LCD 코딩
----------------------------------------------------------------------------
AT91SAM7S256 데이터 시트
5V-tolerant I/Os, including Four High-current Drive I/O lines, Up to 16 mA Each (SAM7S161/16 I/Os Not 5V-tolerant)
- ARM은 3.3V전압을 인가 받지만 5V 전압도 견딜 수 있게 설계되어 있다.
우리가 사용하는 character LCD도 5V를 사용하지만 다행히 ARM에서 인가하는 3.3V도 작동한다.
//현재 사용하고 있는 Character LCD의 back light 연결을 위해서 15번 pin은 GND
//16번 pin은 GCC(5V)이다.
assembly에서 ‘\’를 사용하면 엔터 입력 시 다음 줄이 이전 줄에 줄맞춤 된다.


AT91SAM7S256.h에서 PIO가 define 된 값을 찾아보자.
LCD 코딩

Assembly로 정의될 때만 PIO_PER를 쓸 수 있을 뿐만 아니라 주소 값도 datasheet에서 본 FFFFF400이 아님을 알 수 있다.
우리가 찾는 FFFFF400값을 검색해서 찾아보자.

#ifndef __ASSEMBLY__
typedef volatile unsigned int AT91_REG;// Hardware register definition
#define AT91_CAST(a) (a)
#else
#define AT91_CAST(a)
#endif
Assembly가 아님으로 밑에 #define AT91_CAST(a) (a) 값이 작동하며 본래 그대로의 값임을 알 수 있다.
AT91_REG * 는 typedef 된 volatile unsigned int 이다.
타이밍도를 보고 딜레이를 주어 코딩을 해보자.

#include <AT91SAM7S256.h> #include "LCD.h"
volatile unsigned int uiCnt;
#define Delay(x) for(uiCnt = 0; uiCnt < x; ++uiCnt) #define LCD_FAR_INST(x) ( ((x)) << 16 & (LCD_BUS) ); void LCD_Init() { //*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; //Assembly code *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; *AT91C_PIOA_PPUDR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; }
void LCD_Inst(unsigned int uiInst) { //initiatation in reference with timing map
*AT91C_PIOA_CODR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; //all pin low :: all init Delay(100000); Delay(100000);
*AT91C_PIOA_SODR = LCD_EN; //only enable high
Delay(100000); Delay(100000); *AT91C_PIOA_SODR = LCD_FAR_INST(uiInst); //input data Delay(100000); Delay(100000);
*AT91C_PIOA_CODR = LCD_EN; //only enable low
Delay(100000); Delay(100000); } |