Файл: Microcontroller Programming. Thi Micro Chip PIC (Julio Sanchez, 2007).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 14.06.2025

Просмотров: 8587

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

306

Chapter 13

to send ASCII characters. Since the scarcity of port lines is the original reason for using a master/slave set up, parallel communications may not be a good solution in many cases. On the other hand, communications between master and slave can take place serially, using a single interface line. The discussion of using serial interface between a master and an LCD slave driver PIC is left for the chapter on serial communications.

13.4 Sample Programs

The following section lists the sample programs discussed in this chapter.

13.4.1 LCDTest1

;File name: LCDTest1.asm

;Date: April 13, 2006

;Author: Julio Sanchez

;Processor: 16F84A

;Description:

;Program to exercise 8-bit PIC-to-LCD interface.

;Code assumes that LCD is driven by Hitachi HD44780

;controller and that the display supports two lines

;each one with 16 characters. The wiring and base

;address of each display line is stored in #define

;statements. These statements can be edited to

;accommodate a different set-up.

;Program uses delay loops for interface timing.

;WARNING:

;Code assumes 4Mhz clock. Delay routines must be

;edited for faster clock

;Displays: Minnesota State, Mankato

;

;===========================

;switches ;===========================

;Switches used in __config directive:

;

_CP_ON

Code protection ON/OFF

; *

_CP_OFF

;

*

_PWRTE_ON

Power-up timer ON/OFF

;_PWRTE_OFF

;

_WDT_ON

Watchdog timer ON/OFF

; * _WDT_OFF

;

_LP_OSC

Low power crystal

occilator

; * _XT_OSC

External parallel

resonator/crystal oscillator

;

_HS_OSC

High speed crystal resonator (8 to

10 MHz)

;

Resonator: Murate

Erie CSA8.00MG =

8 MHz


LCD Interfacing and Programming

307

;

_RC_OSC

Resistor/capacitor oscillator (simplest, 20%

error)

;|

;|_____ * indicates set up values

;========================= ; set up and configuration ;=========================

processor 16f84A

include

<p16f84A.inc>

__config

_XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

;=====================================================

;

constant definitions

; for PIC-to-LCD pin wiring and LCD line addresses

;=====================================================

#define E_line 1

;|

#define RS_line 2

;| — from wiring diagram

#define RW_line 3

;|

; LCD line addresses (from LCD data sheet)

#define LCD_1 0x80

; First LCD line constant

#define LCD_2 0xc0

; Second LCD line constant

;Note: The constants that define the LCD display line

;addresses have the high-order bit set in

;order to facilitate the controller command

;

;=====================================================

;

variables in PIC RAM

;=====================================================

;Reserve 16 bytes for string buffer cblock 0x0c

strData endc

;Leave 16 bytes and Continue with local variables

cblock 0x1d

; Start of block

count1

; Counter # 1

count2

; Counter # 2

count3

; Counter # 3

pic_ad

; Storage for start of text area

; (labeled strData) in PIC RAM

J

; counter J

K

; counter K

index

; Index into text table (also used

; for auxiliary storage)

endc

;============================================================

; program


;============================================================ org 0 ; start at address
goto main
; Space for interrupt handlers org 0x08

308

Chapter 13

main:

; Allow LCD time to initialize

; itself

call

initLCD

; Then do forced

; initialization

call

delay_5ms

; Wait.

; Store base address of text buffer in PIC RAM

movlw

0x0c

; Start address of text buffer

movwf

pic_ad

; to local variable

movlw

b’00000000’

; All lines to output

tris

PORTA

; in Port-A

tris

PORTB

; and port B

movlw

b’00000000’

; All outputs ports low

movwf

PORTA

movwf

PORTB

; Wait and initialize HD44780

call

delay_5ms

;======================

;first LCD line ;======================

;Store 16 blanks in PIC RAM, starting at address stored

;in variable pic_ad

call blank16

;Call procedure to store ASCII characters for message

;in text buffer

movlw

d’3’

; Offset into buffer

call

storeMN

; Set DDRAM address to start of first line

call

line1

; Call procedure to display 16 characters in LCD

call

display16

;========================

;

second LCD line

;========================

call

delay_125mcs

; Wait for termination

call

blank16

; Blank buffer

;Call procedure to store ASCII characters for message

;in text buffer

movlw

d’1’

;

Offset into buffer

call

storeUniv

call

line2

;

DDRAM address of LCD line 2

call

display16

;=======================


LCD Interfacing and Programming

309

; done! ;======================= loopHere:

goto loopHere ;done

;************************************************************ ; INITIALIZE LCD PROCEDURE ;************************************************************ initLCD

;Initialization for Densitron LCD module as follows:

;8-bit interface

;2 display lines of 16 characters each

;cursor on

;left-to-right increment

;cursor shift right

;no display shift

;***********************|

;

COMMAND MODE

|

;***********************|

bcf

PORTA,E_line

; E line low

bcf

PORTA,RS_line

; RS line low for command

bcf

PORTA,RW_line

; Write mode

call

delay_125mcs

;delay 125

microseconds

;***********************|

;

FUNCTION SET

|

;***********************|

movlw

0x38

; 0 0

1

1 1 0 0 0 (FUNCTION SET)

;

|

| | |__ font select:

;

|

| |

1 = 5x10 in 1/8 or 1/11

;

|

| |

0 = 1/16 dc

;

|

| |___ Duty cycle select

;

|

|

0 = 1/8 or 1/11

;

|

|

1 = 1/16

;

|

|___ Interface width

;

|

0 = 4 bits

;

|

1 = 8 bits

;

|___ FUNCTION SET COMMAND

movwf

PORTB

;0011

1000

call

pulseE

;pulseE

and delay

;***********************|

;

DISPLAY OFF

|

;***********************|

movlw

0x08

; 0 0

0

0 1 0 0 0 (DISPLAY ON/OFF)

;

| | | |___ Blink character

;

| | |

1 = on, 0 = off

;

| | |___ Cursor on/off