 |
:: ضو فضي ::
تاريخ التسجيل: Aug 2010
المشاركات: 350
|
|
نشاط [ DELTA67 ]
قوة السمعة:79
|
|
26-03-2013, 09:43 AM
المشاركة 7
|
|
هــذا مثال عن وصل شاشة LCD على الــ PORTD للـ ATMEGA8 :
هذا البرنامج يقوم باعداد الشاشة للعمل بنظام 4 بت 4bit MODE ثم محيها و أخيرا يعر ض الحرفين A و E .
كود:
;******************************************************
.include "m8def.inc" ; Definition file for ATmega8
;****************************************************
;* Program Constants
;******************************************************
.equ lcdrs = 0 ; RS sur PORTD,0
.equ lcde = 1 ; E sur PORTD,1
; D4-D7 sur PORTD,4-7
; ATTENTION: la tension de contraste broche CO doit être de l'ordre de 0,8 V
;******************************************************
;* Program Variables Definitions
;******************************************************
.def mpr =r16 ; Multipurpose Register
.def wreg = r17
;****************************************************
;Code segment
.cseg
;Reset and Interrupt Vectors
.org 0x000 ; Define start of Code segment
rjmp reset ;Reset Handler
;*****************************************************
;* Func: RESET
;* Desc: Reset Handler Routine
;*****************************************************
;Reset procedure
reset: ;Set the stack pointer to the top of RAM
ldi mpr,low(RAMEND)
out SPL,mpr
ldi mpr,high(RAMEND)
out SPH,mpr
rjmp MAIN
;****************************************************
;* Func: MAIN
;* Desc: Main Entry into program
;******************************************************
MAIN:
ldi r16,0
out PORTD, r16
ldi R16,0b11111111
out DDRD,R16 ; Port D en sortie
rcall LCD_INIT
ldi wreg, 0x41 ;write 'A' to the LCD char data RAM
rcall LCD_DATA
rcall delay
ldi wreg, 0x45 ;write 'E' to the LCD char data RAM
rcall LCD_DATA
loop:
rjmp loop
; ==============================================
; Initialize LCD module
LCD_INIT:
rcall delay2 ; wait after power on
ldi wreg,0x20 ;Function set, 4 line interface
out PORTD,wreg ;Put on port
nop ;wait for data setup time
sbi PORTD,lcde ;Toggle enable line
nop
nop
cbi PORTD,lcde
rcall delay
; At this point, the normal 4 wire command routine can be used
ldi wreg,0x28 ;0b00101000 = Function set, 4 wire, 2 lines, 5x7 font
rcall LCD_CMD
rcall delay
ldi wreg,0x0C ;0b00001100 = Display on, no cursor, no blink
rcall LCD_CMD
rcall delay
ldi wreg,0x06 ;0b00000110 = Address increment, no scrolling
rcall LCD_CMD
rcall delay
ldi wreg,0x01 ;Clear LCD command
rcall LCD_CMD
rcall delay
ret
;==========================================
; Send command in wreg to LCD
LCD_CMD:
push wreg ;Save character
andi wreg,0xF0 ;Strip off lower bits
out PORTD,wreg ;Put on port
nop ;wait for data setup time
sbi PORTD,lcde ; Toggle enable line
nop
nop
cbi PORTD,lcde
pop wreg ;Recall character
swap wreg ;Get lower nibble
andi wreg,0xF0 ;Strip off lower bits
out PORTD,wreg ;Put on port
nop
sbi PORTD,lcde ;Toggle enable line
nop
nop
cbi PORTD,lcde
ret
;===========================================
; Send character data in wreg to LCD
LCD_DATA:
push wreg ;Save character
andi wreg,0xF0 ;Strip off lower bits
out PORTD,wreg ;Put on port
nop
sbi PORTD,lcdrs ;Register select set for data
nop
nop
sbi PORTD,lcde ;Toggle enable line
nop
;nop
cbi PORTD,lcde
pop wreg ;Recall character
swap wreg ;Get lower nibble
andi wreg,0xF0 ;Strip off lower bits
out PORTD,wreg ;Put on port
nop
sbi PORTD,lcdrs ;Register select set for data
nop
nop
sbi PORTD,lcde ;Toggle enable line
nop
nop
cbi PORTD,lcde
cbi PORTD,lcdrs
ret
; ===========================================
delay:
clr r2
LCD_delay_outer:
clr r3
LCD_delay_inner:
dec r3
brne LCD_delay_inner
dec r2
brne LCD_delay_outer
ret
delay2:
ldi r20, 3
wait:
rcall delay
dec r20
brne wait
ret
التعديل الأخير تم بواسطة : DELTA67 بتاريخ 26-03-2013 الساعة 10:39 AM
|