2010年
6月
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

セットアップ日記


2010年06月16日 二年越し

_ AVRでデジットの液晶

二年以上前に、日本橋のデジットで買った規格の分からない液晶を動かすことに成功した。と言っても、私が解析したわけではなく、先人の解析を元にプログラムを書いただけである。液晶は裏にIN50175Hという刻印のあるもので、買った当時検索したが、何も分からなかった。最近検索すると、解析結果が分かったので、動かしてみた。 14セグメントの文字が8文字と9個の記号が表示できる。信号は三本で、各セグメントのon/offをクロックに合わせて送って、その後で表示を指示する。難しいのは、セグメントの順番が、一つの文字で連続していないことだ。いろいろと試行錯誤の結果できあがったattiny2313をつかって表示させるプログラムがこれ。
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000 /* 1MHz */
#include <util/delay.h>
#include <avr/pgmspace.h>
/* lcd controller for IN50175H */
// PORTB 
#define LATCH 3
#define DATA  4
#define CLOCK 5
// 1 Vcc
// 2 NCC?
// 3 NCC?
// 4 latch
// 5 data
// 6 clock
// 7 GND
#define setbit(PORT,BIT) PORT|=_BV(BIT)
#define clearbit(PORT,BIT) PORT&=~_BV(BIT)
#define checkbit(PORT,BIT) (PORT&_BV(BIT))
static volatile unsigned char buf[20];
//static char segsign[14]={1,1,1,1,0,0,0,1,1,1,1,0,0,0}; /* 1:+,:-*/
static unsigned char offset[14]={1,2,3,4,72,71,70,81,82,83,84,152,151,150};
//static unsigned char chars[9]={36,78,79,80,116,117,118,119,120};
unsigned char seg(char c,char s){ /*c:0-7, s:0-13*/
  //  return c*4*((segsign[s]==0)?-1:+1)+offset[s];
  return c*4*((s%7<4)?+1:-1)+offset[s];
}
const prog_uint16_t number[0x60]={
//   edcba987654321
  0b000000000000000, //  0x20
  0b000100010000000, //! 0x21
  0b000100000100000, //" 0x22
  0b001101110101001, //# 0x23
  0b001111100101001, //$ 0x24
  0b000110001011111, //% 0x25
  0b001011001010110, //& 0x26
  0b000000001000000, //' 0x27
  0b000000001000100, //( 0x28
  0b000000000010010, //) 0x29
  0b000000101111111, //* 0x2a
  0b000000100101001, //+ 0x2b
  0b000000000000010, //, 0x2c
  0b000000000001001, //- 0x2d
  0b000000100000000, //. 0x2e
  0b000000001000010, /// 0x2f
//   edcba987654321
  0b011111011000010, //0 0x30
  0b010010000000000, //1 0x31
  0b011001010001001, //2 0x32
  0b011011000001000, //3 0x33
  0b010110000001001, //4 0x34
  0b001101000000101, //5 0x35
  0b001111010001001, //6 0x36
  0b011010000000000, //7 0x37
  0b011111010001001, //8 0x38
  0b011111000001001, //9 0x38
  0b000000100100000, //: 0x3a
  0b000000000100010, //; 0x3b
  0b000000001000101, //< 0x3c
  0b000001000001001, //= 0x3d
  0b000000000011010, //> 0x3e
  0b011000100001000, //? 0x3f
//   edcba987654321
  0b011101010101000, //@ 0x40
  0b011110010001001, //A 0x41
  0b011011100101000, //B 0x42
  0b001101010000000, //C 0x43
  0b011011100100000, //D 0x44
  0b001101010001001, //E 0x45
  0b001100010000001, //F 0x46
  0b001111010001000, //G 0x47
  0b010110010001001, //H 0x48
  0b001001100100000, //I 0x49
  0b010011010000000, //J 0x4a
  0b000100011000101, //K 0x4b
  0b000101010000000, //L 0x4c
  0b010110011010000, //M 0x4d
  0b010110010010100, //N 0x4e
  0b011111010000000, //0 0x4f
//   edcba987654321
  0b011100010001001, //P 0x50
  0b011111010000100, //Q 0x51
  0b011100010001101, //R 0x52
  0b001111000001001, //S 0x53
  0b001000100100000, //T 0x54
  0b010111010000000, //U 0x55
  0b000100011000010, //V 0x56
  0b010110010000110, //W 0x57
  0b000000001010110, //X 0x58
  0b000000101010000, //Y 0x59
  0b001001001000010, //Z 0x5a
  0b001001000010010, //[ 0x5b
  0b000000000010100, //\ 0x5c
  0b001001001000100, //] 0x5d
  0b000000000000110, //^ 0x5e
  0b000001000000000, //_ 0x5f
//   edcba987654321
  0b000000000010000, //` 0x60
  0b011110010001001, //A 0x41
  0b011011100101000, //B 0x42
  0b001101010000000, //C 0x43
  0b011011100100000, //D 0x44
  0b001101010001001, //E 0x45
  0b001100010000001, //F 0x46
  0b001111010001000, //G 0x47
  0b010110010001001, //H 0x48
  0b001001100100000, //I 0x49
  0b010011010000000, //J 0x4a
  0b000100011000101, //K 0x4b
  0b000101010000000, //L 0x4c
  0b010110011010000, //M 0x4d
  0b010110010010100, //N 0x4e
  0b011111010000000, //0 0x4f
//   edcba987654321
  0b011100010001001, //P 0x50
  0b011111010000100, //Q 0x51
  0b011100010001101, //R 0x52
  0b001111000001001, //S 0x53
  0b001000100100000, //T 0x54
  0b010111010000000, //U 0x55
  0b000100011000010, //V 0x56
  0b010110010000110, //W 0x57
  0b000000001010110, //X 0x58
  0b000000101010000, //Y 0x59
  0b001001001000010, //Z 0x5a
  0b000000100100001, //{ 0x7b
  0b000000100100000, //| 0x7c
  0b000000100101000, //} 0x7d
  0b010000010001001, //~ 0x7e
  0b000000000000000  //  0x7f
};
void buf_clear(){
  unsigned char i;
  for(i=0;i<20;i++){buf[i]=0x00;}
}
void buf_display(){
  unsigned char i;
  clearbit(PORTB,LATCH);
  _delay_us(1);
  for(i=0;i<161;i++){ 
    if( buf[i>>3]&(1<<(i&7)) ){
      setbit(PORTB,DATA);
    }else{
      clearbit(PORTB,DATA);
    }
    _delay_us(1);
    setbit(PORTB,CLOCK);
    _delay_us(1);
    clearbit(PORTB,CLOCK);
    _delay_us(1);
  }
  setbit(PORTB,LATCH);
  _delay_us(1);
}
void buf_set(char n,unsigned char c){
  unsigned char i,s;
  unsigned int p;
  for(s=0;s<14;s++){
    i=seg(n,s);
    //    p=number[c];
    p=pgm_read_word(&number[c-0x20]);
    if(p&(1<>3]|=1<<(i&7);
    }else{
      buf[i>>3]&=~(1<<(i&7));
    }
  }
}
int main(){
  unsigned char i,j;
  PORTB=0;
  DDRB=0x038; /* write 456 */
  _delay_ms(1000);
  buf_clear();
  buf_display();
  j=0x20;
  for(;;){
    for(i=0;i<8;i++){buf_set(i,j);if(++j>0x80){j=0x20;}}
    buf_display();
    _delay_ms(2000);
  }
}
苦労したのは、文字のフォントを打ち込むところと、そのデータをflashに置くためのコードの書き方です。初めは、constにしてもRAMに確保されて、RAM不足になってしまったが、flashにおくには、特殊な書き方が必要のようだ。 動く様子を他の人に見せていたら、14セグメントあると、漢字も表示できるのではないかということになった。微妙なものもあるけれど、そのときに思いついた漢字がこれらです。
大天
田因困 凶 区 円内
小川上工 山
一二三
十 干土 木王 玉平 米
他にもいろいろあるだろうけど、214通り考えるのは大変なので、このくらいにしておこう。
[]