Wednesday, June 10, 2009

PIC 16F84A İLE LCD ARAYÜZÜ



Mikrodenetleyici dünyasında, pratik kullanımda insan ile etkileşimde büyük bir önemi olan LCD göstergeri yönetmek ve kullanmak gereklidir. Aşağıda PIC 16F84A ile gerçekleştirilmiş bir devre ve bunun ASM Örnek olarak aşağıdaki devrede mikrodenetleyiciye besleme, XT osilatör eklenmiştir. Bundan sonra ortak anotlu 7 segment displayin 8 bacağına PIC’in B Portları bağlanmıştır.
LCD Arayüzünün Gerçekleştirilmiş Hali




LCD Arayüzü Devre Şeması



LCD Assembly Programı

       LIST P=16F84A, F=INHX8M
;      ERRORLEVEL  2
       __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC

       ;include

       #include "p16f84A.inc"


;*****************************************************************************
RESET_V             EQU    0x0000       ; Address of RESET Vector
ISR_V        EQU    0x0004       ; Address of Interrupt Vector
OSC_FREQ     EQU    D'4000000'   ; Oscillator Frequency is 4 MHz

LCD_DATA     EQU    PORTB        ; LCD data lines interface
LCD_DATA_TRIS EQU    TRISB
LCD_CTRL     EQU    PORTA        ; LCD control lines interface

LCD_LINE0    EQU    0x000
LCD_LINE1    EQU    0x040
LCD_LINE2    EQU    0x014
LCD_LINE3    EQU    0x054

; PORTA bits
LCD_E        EQU    2            ; LCD Enable control line
LCD_RW       EQU    1            ; LCD Read/Write control line
LCD_RS       EQU    0            ; LCD Register-Select control line

; PORTB bits
DB7          EQU    7            ; LCD dataline 7 (MSB)
DB6          EQU    6            ; LCD dataline 6
DB5          EQU    5            ; LCD dataline 5
DB4          EQU    4            ; LCD dataline 4
DB3          EQU    3            ; LCD dataline 3
DB2          EQU    2            ; LCD dataline 2
DB1          EQU    1            ; LCD dataline 1
DB0          EQU    0            ; LCD dataline 0 (LSB)

; misc.
LCD_TEMP     EQU    0x020        ; LCD subroutines internal use

TABLE_INDEX  EQU    0x021        ; Index to table strings
COUNT        EQU    0x022        ; A counter
DELAY        equ    0x023        ; Used in DELAYxxx routines
X_DELAY             equ    0x024        ; Used in X_DELAYxxx routines


;*****************************************************************************
; Program Baslangic
;*****************************************************************************
       ORG    RESET_V                    ; RESET vector location
RESET        GOTO   START


;*****************************************************************************
       ORG    ISR_V               ; Interrupt vector location
INTERRUPT    BCF     STATUS, RP0 ; Select bank 0
             GOTO    INTERRUPT


;*****************************************************************************
START                             ; POWER_ON Reset (Beginning of program)
             CLRF   STATUS       ; Do initialization, Select bank 0
             CLRF   INTCON       ; Clear int-flags, Disable interrupts
             CLRF   PCLATH       ; Keep in lower 2KByte

             CLRF   PORTA        ; ALL PORT output should output Low.
             CLRF   PORTB

             BSF    STATUS, RP0  ; Select bank 1
             MOVLW  0x0F8        ; RA2-0 outputs, RA4-3 inputs
             MOVWF  TRISA
             MOVLW  0x000        ; RB7-0 outputs
             MOVWF  TRISB
             BSF    OPTION_REG, NOT_RBPU
                                  ; Disable PORTB pull-ups

             BCF    STATUS, RP0  ; Select bank 0

             CALL   LCDINIT             ; Initialize LCDisplay


;*****************************************************************************
; Display some lines, here
            
       MOVLW  0x030        ; ASCII '0'
             MOVWF  COUNT
             MOVLW  LCD_LINE0
             CALL   LCDSDDA             ; Position cursor leftmost on first line
             CALL   TABLE_MSG    ; Display message
             MOVLW  LCD_LINE0 + 0x013
             CALL   LCDSDDA             ; Position cursor
             MOVF   COUNT, W
             CALL   LCDPUTCHAR   ; Display line number

             INCF   COUNT, F
             MOVLW  LCD_LINE1
             CALL   LCDSDDA
             CALL   TABLE_MSG2
             MOVLW  LCD_LINE1 + 0x013
             CALL   LCDSDDA
             MOVF   COUNT, W
             CALL   LCDPUTCHAR

             INCF   COUNT, F
             MOVLW  LCD_LINE2
             CALL   LCDSDDA
             CALL   TABLE_MSG
             MOVLW  LCD_LINE2 + 0x013
             CALL   LCDSDDA
             MOVF   COUNT, W
             CALL   LCDPUTCHAR

             INCF   COUNT, F
             MOVLW  LCD_LINE3
             CALL   LCDSDDA
             CALL   TABLE_MSG
             MOVLW  LCD_LINE3 + 0x013
             CALL   LCDSDDA
             MOVF   COUNT, W
             CALL   LCDPUTCHAR
            
;*****************************************************************************
; Program ends here
;*****************************************************************************
LOOP
             GOTO   LOOP         ; Stay here forever


;*****************************************************************************
; Send a message using a table to output a message
;*****************************************************************************
TABLE_MSG
             MOVLW  0            ; Startindex of table message
DISP_MSG
             MOVWF  TABLE_INDEX  ; Holds message address
             CALL   MSG1
             ANDLW  0x0FF        ; Check if at end of message
             BTFSC  STATUS, Z    ; (zero returned at end)
             GOTO   TABLE_MSG_END            
             CALL   LCDPUTCHAR   ; Display character
             MOVF   TABLE_INDEX, W      ; Point to next character
             ADDLW  1
             GOTO   DISP_MSG
TABLE_MSG_END RETURN

;*****************************************************************************
; Send a message using a table to output a message
; OK
;*****************************************************************************
TABLE_MSG2
             MOVLW  0            ; Startindex of table message
DISP_MSG2
             MOVWF  TABLE_INDEX  ; Holds message address
             CALL   MSG2
             ANDLW  0x0FF        ; Check if at end of message
             BTFSC  STATUS, Z    ; (zero returned at end)
             GOTO   TABLE_MSG2_END            
             CALL   LCDPUTCHAR   ; Display character
             MOVF   TABLE_INDEX, W      ; Point to next character
             ADDLW  1
             GOTO   DISP_MSG2
TABLE_MSG2_END      RETURN




;*****************************************************************************
; LCD Module Subroutines
;*****************************************************************************
;
;=============================================================================
; LCDINIT
; Initilize LC-Display Module
; Should be modified to your needs (i.e. display type, cursor on/off, etc.)
; OK
;=============================================================================
LCDINIT
                                  ; Busy-flag is not yet valid
             CLRF   LCD_CTRL     ; ALL PORT output should output Low.
                                  ; power-up delay
             MOVLW  0x01E
             CALL   X_DELAY500   ; 30 * 0.5mS = 15mS
                                  ; Busy Flag should be valid from here
             MOVLW  0x038        ; 8-bit-interface, 2-lines
             CALL   LCDPUTCMD
             MOVLW  0x000        ; disp.off, curs.off, no-blink
             CALL   LCDDMODE
             CALL   LCDCLEAR
             MOVLW  0x004        ; disp.on, curs.off
             CALL   LCDDMODE
             MOVLW  0x002        ; auto-inc (shift-cursor)
             CALL   LCDEMODE
             RETURN
;=============================================================================
; LCD_ENABLE
; Pulses LCD enable pin
; OK
;=============================================================================
LCD_ENABLE
             BSF    LCD_CTRL, LCD_E     ; LCD E-line High
             BCF    LCD_CTRL, LCD_E     ; LCD E-line Low
             RETURN
;=============================================================================
; LCDBUSY
; Returns when LCD busy-flag is inactive
; OK
;=============================================================================
LCDBUSY
             BSF    STATUS,RP0   ; Select Register page 1
             MOVLW  0x0FF        ; Set PORTB for input
             MOVWF  LCD_DATA_TRIS
             BCF    STATUS, RP0  ; Select Register page 0
             BCF    LCD_CTRL, LCD_RS; Set LCD for command mode
             BSF    LCD_CTRL, LCD_RW; Setup to read busy flag
             BSF    LCD_CTRL, LCD_E     ; LCD E-line High
             MOVF   LCD_DATA, W  ; Read busy flag + DDram address
             BCF    LCD_CTRL, LCD_E     ; LCD E-line Low
             ANDLW  0x80         ; Check Busy flag, High = Busy
             BTFSS  STATUS, Z
             GOTO   LCDBUSY
LCDNOTBUSY   BCF    LCD_CTRL, LCD_RW
             BSF    STATUS, RP0  ; Select Register page 1
              MOVLW  0x000
             MOVWF  LCD_DATA_TRIS ; Set PORTB for output
             BCF    STATUS, RP0  ; Select Register page 0
             RETURN
;=============================================================================
; LCDCLEAR
; Clears display and returns cursor to home position (upper-left corner).
;
;=============================================================================
LCDCLEAR
             MOVLW  0x001
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDHOME
; Returns cursor to home position.
; Returns display to original position (when shifted).
;
;=============================================================================
LCDHOME
             MOVLW  0x002
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDEMODE
; Sets entry mode of display.
; Required entry mode must be set in W
;  b0  : 0 = no display shift     1 = display shift
;  b1  : 0 = auto-decrement       1 = auto-increment
;  b2-7      : don't care
; OK
;=============================================================================
LCDEMODE
             ANDLW  0x003        ; Strip upper bits
             IORLW  0x004        ; Function set
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDDMODE
; Sets display control.
; Required display mode must be set in W
;  b0  : 0 = cursor blink off     1 = cursor blink on
;  b1  : 0 = cursor off    1 = cursor on
;  b2  : 0 = display off   1 = display on (display data remains in DDRAM)
;  b3-7      : don't care
; OK
;=============================================================================
LCDDMODE
             ANDLW  0x007        ; Strip upper bits
             IORLW  0x008        ; Function set
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDSCGA
; Sets Character-Generator-RAM address. CGRAM is read/written after
;  this setting.
; Required CGRAM address must be set in W
;  b0-5      : required CGRAM address
;  b6-7      : don't care
;
;=============================================================================
LCDSCGA
             ANDLW  0x03F        ; Strip upper bits
             IORLW  0x040        ; Function set
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDSDDA
; Sets the Display-Data-RAM address. DDRAM data is read/written after
;  this setting.
; Required DDRAM address must be set in W
;  b0-6      : required DDRAM address
;  b7  : don't care
; OK
;=============================================================================
LCDSDDA
             IORLW  0x080        ; Function set
             CALL   LCDPUTCMD
             RETURN
;=============================================================================
; LCDGADDR
; Returns address counter contents, used for both DDRAM and CGRAM.
; RAM address is returned in W
;
;=============================================================================
LCDGADDR
             BSF    STATUS,RP0   ; Select Register page 1
             MOVLW  0x0FF        ; Set PORTB for input
             MOVWF  LCD_DATA_TRIS
             BCF    STATUS, RP0  ; Select Register page 0
             BCF    LCD_CTRL, LCD_RS; Set LCD for command mode
             BSF    LCD_CTRL, LCD_RW; Setup to read busy flag
             BSF    LCD_CTRL, LCD_E     ; LCD E-line High
             MOVF   LCD_DATA, W  ; Read busy flag + RAM address
             BCF    LCD_CTRL, LCD_E     ; LCD E-line Low
             ANDLW  0x07F        ; Strip upper bit
             BCF    LCD_CTRL, LCD_RW
             BSF    STATUS, RP0  ; Select Register page 1
             MOVLW  0x000
             MOVWF  LCD_DATA_TRIS ; Set PORTB for output
             BCF    STATUS, RP0  ; Select Register page 0
             RETURN
;=============================================================================
; LCDPUTCHAR
; Sends character to LCD
; Required character must be in W
; OK
;=============================================================================
LCDPUTCHAR
             MOVWF  LCD_TEMP     ; Character to be sent is in W
             CALL   LCDBUSY             ; Wait for LCD to be ready
             BCF    LCD_CTRL, LCD_RW; Set LCD in read mode
             BSF    LCD_CTRL, LCD_RS; Set LCD in data mode
             BSF    LCD_CTRL, LCD_E     ; LCD E-line High
             MOVF   LCD_TEMP, W
             MOVWF  LCD_DATA     ; Send data to LCD
             BCF    LCD_CTRL, LCD_E     ; LCD E-line Low
             RETURN
;=============================================================================
; LCDPUTCMD
; Sends command to LCD
; Required command must be in W
; OK
;=============================================================================
LCDPUTCMD
             MOVWF  LCD_TEMP     ; Command to be sent is in W
             CALL   LCDBUSY             ; Wait for LCD to be ready
             BCF    LCD_CTRL, LCD_RW; Set LCD in read mode
             BCF    LCD_CTRL, LCD_RS; Set LCD in command mode
             BSF    LCD_CTRL, LCD_E     ; LCD E-line High
             MOVF   LCD_TEMP, W
             MOVWF  LCD_DATA     ; Send data to LCD
             BCF    LCD_CTRL, LCD_E     ; LCD E-line Low
             RETURN






;*****************************************************************************
; Delay_time = ((DELAY_value * 3) + 4) * Cycle_time
; DELAY_value = (Delay_time - (4 * Cycle_time)) / (3 * Cycle_time)
;
; i.e. (@ 4MHz crystal)
; Delay_time = ((32 * 3) + 4) * 1uSec
;            = 100uSec
; DELAY_value = (500uSec - 4) / 3
;            = 165.33
;            = 165
;*****************************************************************************
DELAY500     MOVLW  D'165'       ; +1         1 cycle
             MOVWF  DELAY        ; +2         1 cycle
DELAY500_LOOP DECFSZ DELAY, F     ; step 1     1 cycle
             GOTO   DELAY500_LOOP ; step 2     2 cycles
DELAY500_END RETURN              ; +3         2 cycles
;
;
X_DELAY500   MOVWF  X_DELAY             ; +1         1 cycle
X_DELAY500_LOOP     CALL   DELAY500     ; step1             wait 500uSec
             DECFSZ X_DELAY, F   ; step2             1 cycle
             GOTO   X_DELAY500_LOOP     ; step3             2 cycles
X_DELAY500_END      RETURN              ; +2         2 cycles






;=============================================================================
; Table message to display
;=============================================================================
MSG1
             addwf  PCL ,F       ;Jump to char pointed to in W reg
             retlw  'H'
             retlw  'a'
              retlw  'l'
             retlw  'i'
             retlw  'c'
             retlw  ' '
             retlw  'U'
             retlw  'n'
             retlw  'i'
             retlw  '.'
             retlw  ' '
             retlw  ' '
             retlw  '2'
             retlw  '0'
             retlw  '0'
             retlw  '9'
             retlw  ' '
             retlw  ' '
             retlw  ' '
             retlw  '#'
MSG1_END
             retlw  0
;
       IF ( (MSG1 & 0x0FF) >= (MSG1_END & 0x0FF) )
             MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
       ENDIF

MSG2
             addwf  PCL ,F       ;Jump to char pointed to in W reg
             retlw  ' '         
             retlw  ' '
             retlw  ' '
             retlw  'U'
             retlw  'm'
             retlw  'u'
             retlw  't'
             retlw  ' '
             retlw  'S'
             retlw  'I'
             retlw  'M'
             retlw  'S'
             retlw  'E'
             retlw  'K'
             retlw  ' '
             retlw  ' '
             retlw  ' '
             retlw  ' '
             retlw  ' '
             retlw  '#'
MSG2_END
             retlw  0
;
       IF ( (MSG2 & 0x0FF) >= (MSG2_END & 0x0FF) )
             MESSG   "Warning - User Definded: Table 'MSG1' crosses page boundry in computed jump"
       ENDIF


       END                        ; End of program

PIC 16F84A İLE 7 SEGMENT SAYICI


PIC 16F84 İle oldukça pratik sayıcılar yapmak mümkündür. Örnek olarak aşağıdaki devrede mikrodenetleyiciye besleme, XT osilatör eklenmiştir. Bundan sonra ortak anotlu 7 segment displayin 8 bacağına PIC’in B Portları bağlanmıştır.

Sayıcının gerçekleştirilmiş hali



Sayıcının Devre Şeması

Sayıcının Assembly Programı

; ======================================================
; Program: 7 segment 0-9 Sayici
; Author: Umut SIMSEK
; Date: 19.05.2009
; Version: 1.0
; MCU: PIC16F84A
; ======================================================


     PROCESSOR 16F84A
     #include "p16f84a.inc"

     __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;=== Degisken Tanimlamalari ===

     Cblock    0x0C ; RAM starting address
     endc            ; end of variable declerations
     COUNT1 equ h'30'
     N equ h'249'

    
;=== Program Hafiza Yapilandirmasi ===

     ORG 0x00 ; Reset vector
     goto Main
         
     ORG 0x04 ; Iterupt vector
     goto Main


;=== Ana Program ===
    
Main
    
     banksel   TRISB
     clrf TRISB
     banksel PORTB

Loop

     movlw 0xFF
     movwf PORTB
     call Bekle_1sn
     call Bekle_1sn
     call Bekle_1sn

     movlw 0xC0
     movwf PORTB
     call Bekle_1sn

     movlw 0xF9
     movwf PORTB
     call Bekle_1sn

     movlw 0xA4
     movwf PORTB
     call Bekle_1sn

     movlw 0xB0
     movwf PORTB
     call Bekle_1sn

     movlw 0x99
     movwf PORTB
     call Bekle_1sn

     movlw 0x92
     movwf PORTB
     call Bekle_1sn

     movlw 0x82
     movwf PORTB
     call Bekle_1sn

     movlw 0xF8
     movwf PORTB
     call Bekle_1sn

     movlw 0xF8
     movwf PORTB
     call Bekle_1sn

     movlw 0x80
     movwf PORTB
     call Bekle_1sn

     movlw 0x98
     movwf PORTB
     call Bekle_1sn

     goto Loop

Bekle_1sn
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     call Delay_100ms
     return

Delay_100ms
     movlw d'120'
     movwf COUNT1

Delay_1ms
     movlw N

D_Loop
     addlw -1
     btfss STATUS,Z
     goto D_Loop
    
     decfsz COUNT1,f
     goto Delay_1ms

     return


     End

Monday, May 19, 2008

Le Temps Des Cathédrales


(Gringoire)
C’est une histoire qui a pour lieu
Paris la belle en l’an de Dieu
Mil-quatre-cent-quatre-vingt-deux
Histoire d’amour et de désir
Nous les artistes anonymes
De la sculpture ou de la rime
Tenterons de vous la transcrire
Pour les siècles à venir
Il est venu le temps des cathédrales
Le monde est entré
Dans un nouveau millénaire
L’homme a voulu monter vers les étoiles
Ecrire son histoire
Dans le verre ou dans la pierre
Pierre après pierre, jour après jour
De siècle en siècle avec amour
Il a vu s’élever les tours
Qu’il avait bâties de ses mains
Les poètes et les troubadours
Ont chanté des chansons d’amour
Qui promettaient au genre humain
De meilleurs lendemains
Il est venu le temps des cathédrales
Le monde est entré
Dans un nouveau millénaire
L’homme a voulu monter vers les étoiles
Ecrire son histoire
Dans le verre ou dans la pierre
Il est venu le temps des cathédrales
Le monde est entré
Dans un nouveau millénaire
L’ohmme a voulu monter vers les étoiles
Ecrire son histoire
Dans le verre ou dans la pierre
Il est foutu le temps des cathédrales
La foule des barbares
Est aux portes de la ville
Laissez entrer ces païens, ces vandales
La fin de ce monde
Est prévue pour l’an deux mille
Est prévue pour l’an deux mille

Sunday, April 27, 2008

Desireless – Voyage Voyage


Au dessus des vieux volcans,
Glisse des ailes sous les tapis du vent,
Voyage, voyage,
Eternellement.
De nuages en marécages,
De vent d’Espagne en pluie d’équateur,
Voyage, voyage,
Vole dans les hauteurs
Au dessus des capitales,
Des idées fatales,
Regarde l’océan…
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient.
Sur le Gange ou l’Amazone,
Chez les blacks, chez les sikhs, chez les jaunes,
Voyage, voyage
Dans tout le royaume.
Sur les dunes du Sahara,
Des iles Fidji au Fujiyama,
Voyage, voyage,
Ne t’arrêtes pas.
Au dessus des barbelés,
Des coeurs bombardés,
Regarde l’océan.
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient.
Au dessus des capitales,
Des idées fatales,
Regarde l’océan.
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient

Desireless – Voyage Voyage


Au dessus des vieux volcans,
Glisse des ailes sous les tapis du vent,
Voyage, voyage,
Eternellement.
De nuages en marécages,
De vent d’Espagne en pluie d’équateur,
Voyage, voyage,
Vole dans les hauteurs
Au dessus des capitales,
Des idées fatales,
Regarde l’océan…
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient.
Sur le Gange ou l’Amazone,
Chez les blacks, chez les sikhs, chez les jaunes,
Voyage, voyage
Dans tout le royaume.
Sur les dunes du Sahara,
Des iles Fidji au Fujiyama,
Voyage, voyage,
Ne t’arrêtes pas.
Au dessus des barbelés,
Des coeurs bombardés,
Regarde l’océan.
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient.
Au dessus des capitales,
Des idées fatales,
Regarde l’océan.
Voyage, voyage
Plus loin que la nuit et le jour, (voyage voyage)
Voyage (voyage)
Dans l’espace inouï de l’amour.
Voyage, voyage
Sur l’eau sacrée d’un fleuve indien, (voyage voyage)
Voyage (voyage)
Et jamais ne revient