読者です 読者をやめる 読者になる 読者になる

hd44780, SC1602BS

移転しました。


SC1602BS


LCDキャラクタディスプレイモジュール(16×2行)
用のavrコードを定期的に紛失して、定期的に書き直している気がする。
今回はc言語で。

#include <avr/io.h>
#include <util/delay.h>

//#define DB4 PINB0
//#define DB5 PINB1
//#define DB6 PINB2
//#define DB7 PINB3
#define DAT 0x0F// fixed
#define CTL 0xF0

#define RS PINB5
#define RW PINB4
#define EN PINB6

#define CLEAR_DISP 0x01
//#define RETURN_HOME 0x02
#define DISP_OFF 0x08

#define DISP_ON 0x0c
#define CURSOR 0x02
#define BRINK 0x01

void write_dat(unsigned char c){
  DDRB = DAT | CTL;//all output
  PORTB = (_BV(RS) & CTL) | (c>>4 & DAT);//EN,RW 0, RS:1, dat upper4
  PORTB |= _BV(EN);//EN 1 (RS,RW send)
  PORTB &= ~_BV(EN);//EN 0 (DAT send)

  PORTB = (_BV(RS) & CTL) | (c & DAT);//EN,RW:0, RS:1, dat lower4
  PORTB |= _BV(EN);//EN 1
  PORTB &= ~_BV(EN);//EN 0

  // wait busy flag and t_add
  _delay_us(37+4);
}

void write_cmd4b(unsigned char c){
  DDRB = DAT | CTL;//all output
  PORTB = c & DAT;//EN,RW:0, RS:0, dat only lower4
  PORTB |= _BV(EN);//EN 1
  PORTB &= ~_BV(EN);//EN 0
  //no wait 
}

void write_cmd8b(unsigned char c){
  DDRB = DAT | CTL;//all output
  PORTB = (c>>4) & DAT;//EN,RW:0, RS:0, dat upper4
  PORTB |= _BV(EN);//EN 1
  PORTB &= ~_BV(EN);//EN 0

  PORTB = c & DAT;//EN,RW:0, RS:0, dat lower4
  PORTB |= _BV(EN);//EN 1
  PORTB &= ~_BV(EN);//EN 0

  _delay_us(37);
}

void init(){
  _delay_ms(40);//after vcc2.7V:40ms, after vcc4.5v:15ms
  write_cmd4b(0x03);
  _delay_ms(5);//4.1ms
  write_cmd4b(0x03);
  _delay_us(100);//100us
  write_cmd4b(0x03);

  write_cmd4b(0x02);//set 4bit interface
  _delay_us(37);

  write_cmd8b(0x28);//funcset 2line , 5x8dot 
//  write_cmd8b(0x20);//1line , 5x8dot 

  write_cmd8b(DISP_OFF);//dis off

  write_cmd8b(CLEAR_DISP);//dis clear
  _delay_ms(2);

  write_cmd8b(0x06);//ent_mode_set, cursor inc on , disp shift off

}

void write_str(unsigned char *str){
  while(*str != '\0'){
    write_dat(*str);
    str++;
  }
}
int main(void){
  PORTB = 0x00;
  DDRB = 0xff;//out/-in

  init();
  write_cmd8b(DISP_ON|CURSOR|BRINK);
  write_str("モンダイ ナイ \\e");

  for(;;);
}