本文へスキップ

アトメル社のAVRマイコンをつかった電子工作および無線を使った電子工作を紹介します。





ホーム > ソフト室 >AVRマイコンで始めるC言語の使い方 >LCDに"Hollo AVR World"を表示する

AVRマイコンで始めるC言語の使い方

LCDに"Hello AVR World"を表示する。

マイコンに接続されていますキャラクタLCDを使用するには、それをマイコンから制御する必要があります。自前でキャラクタLCDの制御するプログラムを書く場合はLCDを制御しているドライバICの知識が必要となります。そこでChaNさんのEZ-LCDというLCDモジュールを使ことでLCDドライバICの知識なくともLCDに文字を表示できるようになります。それでは、EZ-LCDというLCDモジュールを移植してLCDに文字表示を行いましょう。
まずはChaNさんのホームページからEZ-LCDをダウンロードしておいてください。

1.LCDモジュールを移植

(1)AVR Studioでプロジェクトの作成

   ここではAVR Studio 6を使用しています。

(2)"hd44780.h"と"hd44780.c"をインポート

AVR Studio6 ソリューションエクスプローラ画面

インポートするとソリューションエクスプローラに"hd44780.c"と"hd44780.h"が表示されます

プロジェクトを作成したフォルダ

フォルダ内に"hd4480.c"と"hd4480.h"が追加されています。

(3)"hd44780.h"の変更

/*--------------------------------------------------*/
/* Configuration Options                            */
/*--------------------------------------------------*/

#define _LCD_ROWS       2               /* Number of Rows (1,2 or 4) */
#define _LCD_COLS       40              /* Number of Columns (8..40) */
ここで製作したハードウエアに接続されているキャラクタLCDはSC2004CSです。このLCDは4行X20文字ですので"hd44780.h"の内上記2行を下記のように書き換えます。
#define _LCD_ROWS       4               /* Number of Rows (1,2 or 4) */
#define _LCD_COLS       20              /* Number of Columns (8..40) */

(4)"hd44780.c"の変更

キャラクタLCDに接続されているマイコンのポートは以下の様になっています。
機能名称 キャラクタLCDピン名称 マイコンポート名称
4ビットデータ
(4ビットモードで動作)
DB7 PB7
DB6 PB6
DB5 PB5
DB4 PB4
データ書き込み E PB2
LCD選択信号 RS PB0
/* Bus controls */
#if 1
#include <avr/io.h>                             /* Hardware specific include file */
#define IF_BUS          8                       /* Bus width (4 or 8) */
#define DELAY_US(n)     delay_us(n)             /* Delay d microseconds */
#define IF_INIT()                               /* Initialize control port */
#define IF_DLY60()                              /* Delay >=60ns (can be blanked for most uC) */
#define IF_DLY450()     {}                      /* Delay >=450ns@3V, >=250ns@5V */
#define E1_HIGH()       PORTB|=0x80     /* Set E/E1 high */
#define E1_LOW()        PORTB&=0x7F     /* Set E/E1 low */
#define E2_HIGH()       PORTB|=0x01     /* Set E2 high (dual controller only) */
#define E2_LOW()        PORTB&=0xFE     /* Set E2 low (dual controller only) */
#define RS_HIGH()       PORTB|=0x40     /* Set RS high */
#define RS_LOW()        PORTB&=0xBF     /* Set RS low */
#define OUT_DATA(d)     PORTD=d         /* Output a byte d on the bus (higher 4 bits of d in 4-bit mode) */
上記の部分を使用しているマイコンのポートにあわせて書き換えます。
4ビットモードでLCDを制御しますのでバス幅は4ビットを設定します。
ディレイは_delay_msを使用しますのでdelay.hをインクルードします。
マイコンのクロックはデフォルトでは1MHzですのでF_CPUに1Mzを定義します。
* Bus controls */
#if 1
#include <avr/io.h>                                          /* Hardware specific include file */

#define F_CPU 1000000UL                 // 1 MHz
#include <avr/delay.h>                  /* _delay_msを使用するためにインクルード */

#define IF_BUS          4                                    /* Bus width (4 or 8) */
#define DELAY_US(n)     _delay_us(n)                         /* Delay d microseconds */
#define IF_INIT()                                            /* Initialize control port */
#define IF_DLY60()                                           /* Delay >=60ns (can be blanked for most uC) */
#define IF_DLY450()     {}                                   /* Delay >=450ns@3V, >=250ns@5V */
#define E1_HIGH()       PORTB |= 1 << PORTB2                 /* Set E/E1 high */
#define E1_LOW()        PORTB &= ~(1 << PORTB2)              /* Set E/E1 low */
#define E2_HIGH()       PORTB |= 0x01                        /* Set E2 high (dual controller only) */
#define E2_LOW()        PORTB &= 0xFE                        /* Set E2 low (dual controller only) */
#define RS_HIGH()       PORTB |= 1 << PORTB0                 /* Set RS high */
#define RS_LOW()        PORTB &= ~(1 << PORTB0)              /* Set RS low */
#define OUT_DATA(d)     PORTB = ( d & 0xf0) | (PORTB & 0x0f) /* Output a byte d on the bus (higher 4 bits of d in 4-bit mode) */

2.EZ-LCDの関数

関数 内容
lcd_init() LCDモジュールの初期化
lcd_putc( unsigned char chr) 1文字出力
chr:表示する文字コードを指定します。
lcd_locate( unsigned char row, unsigned char col) カーソルの移動
row:移動先の行位置(0~3)
col :移動先の列位置(0~19)
他にも関数があります。ChaNさんのホームページを参照して下さい。

3.プログラム

メインプログラムに"hd44780.h"をインクルードします。
文字列"Hello AVR World"から1文字ずつ取り出してLCDに表示させます。LCDへの表示はlcd_putcで行います。

(1)フローチャート

(2)プログラム

/*
 * avr008_porting.c
 *
 */ 

#include <avr/io.h>
#include "hd44780.h"    // EZ-LCDインクルードファイル

void InitHard( void);   // ポートの初期化及び割込設定

int main(void)
{
        char str[] = "Hello AVR World";
        int     i;
        
        InitHard();     // ポートの初期化をします。
        lcd_init ();    // LCDの初期化をします。
        
        for ( i = 0; i < 15; i++)
        {
                lcd_putc( str[i]);
        }               
        
    while(1)
    {
        //TODO:: Please write your application code 
    }
}

void InitHard( void) // ポートの初期化
{
        // ポートB初期設定
        DDRB = 0xff;            // PB7~PB0を出力に設定します。
        PORTB = 0;              // PB7~PB0に'L'を出力します。
        // ポートC初期設定
        DDRC = 0x3f;            // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
        PORTC = 0;              // PC7~PC0に'L'を出力します。
        // ポートD初期設定
        DDRD = 0xf0;            // PD7~PD4は出力、PD3~PD0は入力に設定します。
        PORTD = 0;              // PD7~PD0に'L'を出力します。
}

(3)プログラム実行結果

キャラクタLCD制御の知識がなくとも表示することができました。
前ページ次ページ