LCD
Contents LCD test 실습내용
LCD TEST LCD Module 16 문자 * 2 줄 폰트 5 * 8 LCD 컨트롤러 포함
LCD TEST Pin Description
LCD TEST Block Diagram
LCD TEST LCD Module의 내부 Register Instruction Register(IR) : D.D.RAM과 C.G.RAM에 대한 Address 정보와 Clear, 커서 이동에 대한 명령코드를 가지고 있음. 쓰기만 가능 Data Register(DR) : D.D.RAM, C.G.RAM에 데이터를 쓰거나 읽을 때 사용. 데이터를 읽을 경우 DR에 읽은 데이터 저장. IR에 주소를 쓰면 주소에 대한 LCD의 표시 데이터가 C.G.RAM, D.D.RAM으로 부터 DR로 전송 Busy Flag(BF) : LCD의 기록모드에서 외부와 동기를 위해 사용되는 Flag. 외부에서 LCD에 기록한 후 LCD가 내부동작에 머무르고 있을 경우 Busy를 ‘1’로 두어 외부의 명령어를 무시. Address Counter(AC) : AC는 D.D.RAM, C.G.RAM의 주소를 지정할 때 사용. IR에 주소 정보를 쓰면 AC로 전송. 데이터를 쓰면 AC는 자동적으로 +1 또는 -1을 수행
LCD TEST Display Data RAM(D.D.RAM) : 8bits 글자 코드의 디스플레이 데이터를 가지고 있음. D.D.RAM 내에 글자표시에 사용되지 않는 메모리 영역은 일반적인 데이터 RAM으로 사용될 수 있음 D.D.RAM의 주소를 16진수로 나타낸 그림 Line1과 Line2는 주소가 연속적이지 않으므로 Line2로 넘어가려면 주소 설정을 다시 해야 함
LCD TEST Character Generator ROM(C.G.ROM) : 글자발생기는 5 * 8 의 글자를 발생 Character Generator RAM(C.G.RAM) : 사용자가 프로그램으로 새로운 글자의 패턴을 만들 경우에 사용되는 RAM
LCD TEST
LCD TEST LCD Display 과정 전원 인가 VDD 4.5V 후 30ms 대기 LCD 초기화 Busy Flag 검사 IR에 명령어 저장 DR에 표시문자 저장
LCD TEST LCD 초기화
LCD TEST LCD 초기화
LCD TEST LCD instruction sets
LCD TEST LCD TEST의 구성 Reset 버튼과 FPGA clock, lcd를 사용하기 위한 enable핀, RS, R/W를 위한 LCD_A핀, 데이터 전송을 위한 LCD_D로 구성 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LCD_test is port ( FPGA_RSTB : IN std_logic; FPGA_CLK : IN std_logic; LCD_A : OUT std_logic_vector (1 downto 0); LCD_EN : OUT std_logic; LCD_D : OUT std_logic_vector (7 downto 0)); end LCD_test; architecture Behavioral of LCD_test is signal load_100k : std_logic; signal clk_100k : std_logic; signal cnt_100k : std_logic_vector (7 downto 0); signal load_50 : std_logic; signal clk_50 : std_logic; signal cnt_50 : std_logic_vector (11 downto 0); signal lcd_cnt : std_logic_vector (8 downto 0); signal lcd_state : std_logic_vector (7 downto 0); signal lcd_db : std_logic_vector (7 downto 0);
LCD TEST Clock 분주(100kHz) begin process(FPGA_RSTB,FPGA_CLK,load_100k,cnt_100k) if FPGA_RSTB = '0' then cnt_100k <= (others => '0'); clk_100k <= '0'; elsif rising_edge (FPGA_CLK) then if load_100k = '1' then clk_100k <= not clk_100k; else cnt_100k <= cnt_100k + 1; end if; end process; load_100k <= '1' when (cnt_100k = X"13") else '0';
LCD TEST Clock 분주(50Hz) process(FPGA_RSTB,clk_100k,load_50,cnt_50) begin if FPGA_RSTB = '0' then cnt_50 <= (others => '0'); clk_50 <= '0'; elsif rising_edge (clk_100k) then if load_50 = '1' then clk_50 <= not clk_50; else cnt_50 <= cnt_50 + 1; end if; end process; load_50 <= '1' when (cnt_50 = X"3E7") else '0';
LCD TEST LCD state 할당 process(FPGA_RSTB,clk_50,lcd_cnt) begin if FPGA_RSTB = '0' then lcd_cnt <= (others => '0'); elsif rising_edge (clk_50) then if (lcd_cnt >= "001010110") then lcd_cnt <= lcd_cnt; else lcd_cnt <= lcd_cnt + 1; end if; end process; lcd_state <= lcd_cnt (8 downto 1);
LCD TEST 각 state에 따른 출력 process(lcd_state) begin case lcd_state is when X"00" => lcd_db <= "00111000"; -- Function set when X"01" => lcd_db <= "00001000"; -- Display OFF when X"02" => lcd_db <= "00000001"; -- Display clear when X"03" => lcd_db <= "00000110"; -- Entry mode set when X"04" => lcd_db <= "00001100"; -- Display ON when X"05" => lcd_db <= "00000011"; -- Return Home when X"06" => lcd_db <= X"4C"; -- L when X"07" => lcd_db <= X"49"; -- I when X"08" => lcd_db <= X"42"; -- B when X"09" => lcd_db <= X"45"; -- E when X"0A" => lcd_db <= X"52"; -- R when X"0B" => lcd_db <= X"54"; -- T when X"0C" => lcd_db <= X"52"; -- R when X"0D" => lcd_db <= X"4F"; -- O when X"0E" => lcd_db <= X"4E"; -- N when X"0F" => lcd_db <= X"20"; -- 공백 when X"10" => lcd_db <= X"43"; -- C when X"11" => lcd_db <= X"6F"; -- o when X"12" => lcd_db <= X"20"; -- 공백 when X"13" => lcd_db <= X"4C"; -- L when X"14" => lcd_db <= X"74"; -- t when X"15" => lcd_db <= X"64"; -- d when X"16" => lcd_db <= X"C0"; -- Change Line
LCD TEST 각 state에 따른 출력 when X"17" => lcd_db <= X"20"; -- 공백 when X"18" => lcd_db <= X"3C"; -- < when X"19" => lcd_db <= X"52"; -- R when X"1A" => lcd_db <= X"6F"; -- o when X"1B" => lcd_db <= X"56"; -- V when X"1C" => lcd_db <= X"5F"; -- - when X"1D" => lcd_db <= X"4C"; -- L when X"1E" => lcd_db <= X"61"; -- a when X"1F" => lcd_db <= X"62"; -- b when X"20" => lcd_db <= X"20"; -- 공백 when X"21" => lcd_db <= X"33"; -- 3 when X"22" => lcd_db <= X"30"; -- 0 when X"23" => lcd_db <= X"30"; -- 0 when X"24" => lcd_db <= X"30"; -- 0 when X"25" => lcd_db <= X"3E"; -- > when X"26" => lcd_db <= X"20"; -- 공백 when others => lcd_db <= (others => '0'); end case; end process;
LCD TEST 내부 시그널과 포트와의 연결 LCD_A(1) <= '0'; LCD_A(0) <= '0' when (lcd_state >= X"00" and lcd_state < X"06") or (lcd_state = X"16") else '1'; LCD_EN <= not lcd_cnt(0); LCD_D <= lcd_db; end Behavioral;
실습내용 LCD 모듈을 이용하여 학번, 이름 출력하기 조원의 학번에서 년도 부분을 제외한 6자리 위와 같이 라인 1에 출력 조원의 이름 이니셜을 라인 2에 출력 주어진 Pin table 이용 각 state에 따른 출력 부분을 채워서 따를 것 Function set : 2-line mode, display off Display OFF : display off, cursor off, blink off Entry mode set : Increment mode, Entire shift off Display ON : display on, cursor off, blink off Entity의 내용은 LCD Test와 동일 < 7 1 5 9 > 3 2 4 K Y H ! J S ?
실습내용 Pin table PORT PIN Clk P79 LCD(2) P61 Rst_n P205 LCD(3) P62 LCD_A(0)(RS) P50 LCD(4) P63 LCD_A(1)(R/W) P51 LCD(5) P64 LCD_EN P52 LCD(6) P65 LCD(0) P57 LCD(7) P67 LCD(1) P58