[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: Вот, долго комментировал, теперь должно быть максимально понятно.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Сергей Борщ 21 марта 2002 г. 13:05
В ответ на: А не поделится кто-нибудь примерчиком программы на асме сопряжения MSP430 c HD44780? отправлено Albatros 20 марта 2002 г. 16:30

Связь по 4-битной шине. По 8-битной будет даже проще.


#include
NAME char_lcd

#define XTAL 4000000 ; Hz
#define ms *XTAL/4/1000
#define mks *XTAL/4/1000000

#define LCDPort P1OUT_ ; bits <7-4> to LCD D<7-4>
; D<3-0> pulled low in LCD internaly
#define _RS (1<<3) ; bit <3> to LCD RS pin
#define _E (1<<2) ; bit <2> to LCD E pin

PUBLIC InitLCD ;void InitLCD(void);
PUBLIC WriteChar ;void WriteChar(char Char);
PUBLIC WriteLCDCommand ;void WriteLCDCommand(char Command);
PUBLIC WriteString ;void WriteString(char *String);
PUBLIC Delay ;void Delay(unsigned int Time);
PUBLIC ClearScreen ;void ClearScreen(void);

RSEG CODE
InitLCD:
BIC.B #_RS,&LCDPort
MOV #50 ms,R12
CALL #Delay

;assume display can be here in unknown (8-bit or 4-bit) mode
;3 states possible here:
;(1) 8-bit mode
;(2) 4-bit mode waiting for higher nibble
;(3) 4-bit mode waiting for lower nibble
MOV.B #0x30,R12
;data reconized as:
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)"set 8-bit mode" command higher nibble (*) -> DL=8
;(3)"dummy", lower nibble of previous command
CALL #OutNibble
MOV #50 ms,R12
CALL #Delay

;now states are:
;(1) 8-bit mode
;(2) 4-bit mode waiting for lower nibble
;(3) 4-bit mode waiting for higher nibble
MOV.B #0x30,R12
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)lower nibble of (*) command -> LINES=1,FONT=5*7
;(3)"set 8-bit mode" command higher nibble (**) -> DL=8
CALL #OutNibble
MOV #200 mks,R12
CALL #Delay

;now states are:
;(1) 8-bit mode
;(2) 8-bit mode
;(3) 4-bit mode waiting for lower nibble
MOV.B #0x30,R12
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(3)lower nibble of (**) command -> LINES=1,FONT=5*7
CALL #OutNibble
MOV #200 mks,R12
CALL #Delay

;now states are:
;(1) 8-bit mode
;(2) 8-bit mode
;(3) 8-bit mode
MOV.B #0x20,R12 ; DL=4,LINES=1,FONT=5*7
CALL #OutNibble ; one nible because in 8-bit mode
MOV #40 mks,R12
CALL #Delay

;display in 4-bit mode now and requires 2 nibbles per command
MOV.B #0x28,R12 ; DL=4,LINES=2,FONT=5*7
CALL #WriteLCDCommand
MOV.B #0x0C,R12 ; Display On, Cursor Off
CALL #WriteLCDCommand
ClearScreen:
MOV.B #0x01,R12 ;Clear Display, return cursor
CALL #WriteLCDCommand
MOV #1600-40 mks,R12
CALL #Delay
RET

OutNibble: ; bits <7-4> of R12
AND.B #0xF0,R12 ; mask low tetrade
AND.B #0x0F,&LCDPort ; clear D<7-4>
BIS.B R12,&LCDPort ; write 4 bits to LCD
BIS.B #_E,&LCDPort
BIC.B #_E,&LCDPort
RET

WriteLCDCommand: ; command code in R12
BIC.B #_RS,&LCDPort ; data is a Command

WriteChar: ; char code in R12
; _RS remains high after previous write if WriteChar
PUSH R13
MOV.B R12,R13 ; save lo tetr
call #OutNibble ; high nibble
RLC.B R13
RLC.B R13
RLC.B R13
RLC.B R13
MOV.B R13,R12
CALL #OutNibble ; low nibble
BIS.B #_RS,&LCDPort ; next data is a character
MOV #40 mks,R12
POP R13
Delay: ; Time in R12
NOP ; 1 cycle
ADD #-1,R12 ; 1 cycle
JNE Delay ; 2 cycles
RET

WriteString: ; pointer to string in R12
PUSH R13
MOV R12,R13
WriteStrLoop:
MOV.B @R13+,R12
TST.B R12
JEQ WriteStrDone
CALL #WriteChar
JMP WriteStrLoop
WriteStrDone:
POP R13
RET

END


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru