DMC16117A OPTREX社製 16×1文字キャラクタ液晶モジュール

  • このエントリーをはてなブックマークに追加
  • Pocket

表示テスト。
ビジーチェックを入れるようにしました。

2lineに設定して、0x40からが9文字目以降の8文字です。
表示位置をシフトしていないときに。

ピンコンパチとかいいながら、sc1602bsとはVddとGND(Vss)が逆なのでした。危なかった。


#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

#define FUNC_SET 0x20
//#define FOUR_BIT 0x00
#define TWO_LINE 0x08
#define ONE_LINE 0x00

#define SET_ADDR 0x80
#define BUSY 0x08
//#define ADDR 0x7F

char is_busy(){
  DDRB = CTL;//read from DAT
  PORTB = _BV(RW) & CTL;//EN,RS:0, RW:1, dat pull d;
  PORTB |= _BV(EN);//EN:1
  _delay_us(1);
  char busy = PINB & BUSY;
  PORTB &= ~_BV(EN);//EN:0

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

  return busy;
}


char write_dat(unsigned char c){
  while(is_busy());
  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);
  return 0;
}

void write_cmd4b(unsigned char c){
  //no wait
  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

}

void write_cmd8b(unsigned char c){
  while(is_busy());

  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);

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

  write_cmd8b(FUNC_SET|TWO_LINE);//funcset 2line , 5x8dot
//  write_cmd8b(0x20);//1line , 5x8dot
  write_cmd8b(DISP_OFF);
  write_cmd8b(CLEAR_DISP);
  write_cmd8b(0x06);//ent_mode_set, cursor inc on , disp shift off

}

void write_str(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("エトセトラ");
  write_dat(0x7e);
  write_dat(0x7f);
  write_dat(0xf3);

  write_cmd8b(SET_ADDR|0x40);
  write_str("エトセトラ");

  for(;;);
}

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す