PIC16F916 + 極小3桁LCD
aitendoの極小3桁LCD(3C8-DIP)の続きです。
GR KURUMIでうまくいかなかったのでPICでやってみました。今回使った、PIC16F916はLCDコントローラ機能を持っているので、つないでちょいちょいと設定すればうまくいくはず…だったのですが、LCD用の電圧を外から入れたりするので少し苦労しました。
とりあえず、うまくいったのでソースを貼っておきます。
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, DEBUG = OFF #pragma config FOSC = INTOSCCLK, FCMEN = OFF, MCLRE = OFF #pragma config WDTE = OFF, CP = OFF, PWRTE = OFF #include "pic16f916.h" #include <xc.h> #include <stdio.h> #include <stdlib.h> #define _XTAL_FREQ 8000000 unsigned char digit[10] = { 0x77, /* 0 */ 0x22, /* 1 */ 0x5b, /* 2 */ 0x6b, /* 3 */ 0x2e, /* 4 */ 0x6d, /* 5 */ 0x7d, /* 6 */ 0x23, /* 7 */ 0x7f, /* 8 */ 0x6f /* 9 */ }; void setnum( int num ); /* * */ int main(int argc, char** argv) { int num = 0; OSCCON = 0b01110000; ANSEL = 0x00; LCDSE0 = 0x3f; LCDSE1 = 0x00; LCDPS = 0x88; LCDCON = 0x93; LCDDATA0 = 0x00; /* COM0 */ LCDDATA1 = 0x00; /* COM0 */ LCDDATA3 = 0x00; /* COM1 */ LCDDATA4 = 0x00; /* COM1 */ LCDDATA6 = 0x00; /* COM2 */ LCDDATA7 = 0x00; /* COM2 */ LCDDATA9 = 0x00; /* COM3 */ LCDDATA10 = 0x00; /* COM3 */ setnum( 123 ); while( 1 ); return (EXIT_SUCCESS); } void setnum( int num ) { unsigned char dat[3]; dat[0] = digit[ num / 100 ]; dat[1] = digit[ ( num /10 ) % 10 ]; dat[2] = digit[ num % 10 ]; LCDDATA0 = ( dat[0] & 0x03 ) | ( ( dat[1] & 0x03 ) << 2 ) | ( ( dat[2] & 0x03 ) << 4 ); LCDDATA3 = ( ( dat[0] >> 2 ) & 0x03 ) | ( ( ( dat[1] >> 2 ) & 0x03 ) << 2 ) | ( ( ( dat[2] >> 2 ) & 0x03 ) << 4 ); LCDDATA6 = ( ( dat[0] >> 4 ) & 0x03 ) | ( ( ( dat[1] >> 4 ) & 0x03 ) << 2 ) | ( ( ( dat[2] >> 4 ) & 0x03 ) << 4 ); LCDDATA9 = ( ( dat[0] >> 6 ) & 0x03 ) | ( ( ( dat[1] >> 6 ) & 0x03 ) << 2 ) | ( ( ( dat[2] >> 6 ) & 0x03 ) << 4 ); }
(MPLAB X IDE + XC8)
追記:
回路図を書いてみました。(生まれて初めて)