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)


追記:

回路図を書いてみました。(生まれて初めて)