JESCAB 
Produkter Tjänster Info Leveransvillkor Kontakt
 Snabb länkar:


SCDQ5542Q

 

 

 

Exemplet visar kod för att skriva till en miniatyrdisplay från Osram. Den använda modellen i exemplet heter SCDQ5542Q.

 

Ett datablad finns här.

 

Denna display har ingen inbyggd teckengenerator, så man skickar data till alla "dots" (5x5 st för varje tecken) och kan alltså skriva vilket tecken, figur eller annat mönster som helst. Databladet har tabeller med exempel på bitmönster för vanliga bokstäver, siffror och andra specialtecken. En hel omskrivning av hela displayen tar bara ett par tiotals microsekunder, så även enklare animeringar skulle kunna genereras.

 

Koden i exemplet skriven för PIC16F886, men kan utan större justeringar användas till de flesta PIC16.

 

Notera att när displayen sitter monterad som på bilden till höger, så är den (jämfört med databladet) monterad upp-och-ner. D.v.s att de 5 "raderna" är numrerade 0-4 *nerifrån* och de fem "punkterna" på varje rad ligger från höger till vänster. Det har naturligtsvis ingen annan batydelse än att man får tänka på det när man kodar tecknen som ska visas. Å andra sidan så kan man enkelt koda tecken även för "stående" montering.

 

Koden nedan skriver texten enligt bilden till höger.

Lägg upp ett tomt projekt i MPLAB, skapa en ny, tom ASM fil och klistra in koden...

 scdq5542q

 

;**********************************************************************
;   Enkelt test av SCDQ5542Q 5x5 "dot matrix" LED display.
;   För PIC16F886
;
;**********************************************************************
;                                                                     *
;    Filename:     SCDQ5542Q_16F886.asm
;    Date:          20070714
;    File Version:  1.0
;
;    Author:        Jan-Erik Söderholm
;    Company:       Jan-Erik Söderholm Consulting AB
;
;**********************************************************************
;
;    Files required:  P16F886.INC
;                     16F886.LKR
;
;**********************************************************************
;
; Notes:
; Använder intosc på 4 Mhz.
;
; Koppling av pinnar på dipslayen :
;
; LOAD : RA0
; SDATA : RA1
; SDCLK : RA2
;
;**********************************************************************
;
;
 list      p=16f886              ; list directive to define processor
 #include <p16f886.inc>          ; processor specific variable definitions

 __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
 __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;
    errorlevel -302                 ; Så vi slipper "warning -302" om bankning...
;
;**********************************************************************
; Definition av pinnar och port för displayen.
;
    #define     SCDQ5542Q_LOAD    PORTA, 0
    #define     SCDQ5542Q_SDATA   PORTA, 1
    #define     SCDQ5542Q_SDCLK   PORTA, 2
;  
;
;**********************************************************************
; Här hamnar vi efter reset eller power-on av processorn.
;
RESET_VECTOR    CODE    0x000       ; processor reset vector
     goto    start               ; go to beginning of program
;
; Här hamnar vi vid ett avbrott/interrupt.
; Används inte i detta exempel men är med för att göra det komplett...
;
INT_VECTOR      CODE    0x004       ; interrupt vector location
        retfie                      ; Ingen interrupt kod...
;       
;**********************************************************************
;**********************************************************************
; Huvudkoden.
; Här hamnar vi vid reset eller power-on (via RESET_VECTOR ovan)
;
;
MAIN    CODE
start
;
; Först normal uppstart ej specifik för LCD
;
        banksel ansel               ; Stäng av alla analoga funktioner
        clrf    ansel
        clrf    anselh
        banksel trisa               ; Alla pinnar utgångar...
        clrf    trisa
        clrf    trisb
        clrf    trisc
;       
        banksel intcon
        clrf    intcon
        banksel porta               ; se till att vi är på bank 0...
;
; Så då var grundinställningen av processorn klar...
;
; Ge displayen lite tid att starta upp efter power-on.
        call        delay_1s
;
; Se till att WR-pinnen är i "rätt" läge från början.
        bcf         SCDQ5542Q_SDCLK
        bsf         SCDQ5542Q_LOAD
;
; Ladda W med lite olika data och anropa rutinen för att
; skifta ut dom till dipslayen...
;
        movlw   b'11000000'             ; clear display
        call    SCDQ5542Q_write_char
        movlw   b'11110100'             ; brightnes 20%
        call    SCDQ5542Q_write_char
;
        movlw   b'10100011'             ; char 3
        call    SCDQ5542Q_write_char
        movlw   b'00010001'             ; Data för "H"
        call    SCDQ5542Q_write_char
        movlw   b'00110001'
        call    SCDQ5542Q_write_char
        movlw   b'01011111'
        call    SCDQ5542Q_write_char
        movlw   b'01110001'
        call    SCDQ5542Q_write_char
        movlw   b'10010001'
        call    SCDQ5542Q_write_char
;
        movlw   b'10100010'             ; char 2
        call    SCDQ5542Q_write_char
        movlw   b'00011111'             ; Data för "E"
        call    SCDQ5542Q_write_char
        movlw   b'00100001'
        call    SCDQ5542Q_write_char
        movlw   b'01011111'
        call    SCDQ5542Q_write_char
        movlw   b'01100001'
        call    SCDQ5542Q_write_char
        movlw   b'10011111'
        call    SCDQ5542Q_write_char
;
        movlw   b'10100001'             ; char 1
        call    SCDQ5542Q_write_char
        movlw   b'00000110'             ; Data för "J"
        call    SCDQ5542Q_write_char
        movlw   b'00101001'
        call    SCDQ5542Q_write_char
        movlw   b'01010000'
        call    SCDQ5542Q_write_char
        movlw   b'01110000'
        call    SCDQ5542Q_write_char
        movlw   b'10011111'
        call    SCDQ5542Q_write_char
;
        movlw   b'10100000'             ; char 0
        call    SCDQ5542Q_write_char
        movlw   b'00000100'             ; Data för "!"
        call    SCDQ5542Q_write_char
        movlw   b'00100000'
        call    SCDQ5542Q_write_char
        movlw   b'01000100'
        call    SCDQ5542Q_write_char
        movlw   b'01100100'
        call    SCDQ5542Q_write_char
        movlw   b'10000100'
        call    SCDQ5542Q_write_char
;
;
loop    goto loop                       ; Gör ingenting mer....
;
;               
;*********************************************************************
;*********************************************************************
; Subrutin för SCDQ5542Q
;
; Två temp variabler som används av rutinen.
; Lägger dom i "shared memory" så slipper vi banksel...
; SCDQ5542Q_CHAR håller byten som ska ut medan den
; skiftas, SCDQ5542Q_TMP är en bit-räknare...
;
SCDQ5542Q_VARS    UDATA_SHR             ; Starta ny data-section.
SCDQ5542Q_TMP     RES 1                 ; Position på displayen.
SCDQ5542Q_CHAR    RES 1                 ; Tecken som ska skrivas.
;
; Slut på variabler, här kommer koden...
;
SCDQ5542Q_CODE        CODE              ; Starta ny code-section.
;
; Rutin för att skriva ett tecken på displayen.
; Anropas av "SCDQ5542Q_out" macrot.
; Rutinen ska anropas med tecknet som ska skickas i W registret.
;
SCDQ5542Q_write_char
;
        movwf       SCDQ5542Q_CHAR      ; Spara W.
        movlw       h'08'               ; Antal bitar i en byte
        movwf       SCDQ5542Q_TMP       ; till "bit-räknaren"...
;
        bcf         SCDQ5542Q_LOAD      ; Starta överföring
        bcf         status, c           ; Se till att C är "nollad"
;
next_bit
        rrf         SCDQ5542Q_CHAR, f   ; Skifta en bit till C-flaggan
        btfss       status, c           ; Var den "1" ?
        goto        send_low            ; Nej, skicka en nolla...
        bsf         SCDQ5542Q_SDATA     ; Ja, skicka en etta...
        goto        clock
send_low
        bcf         SCDQ5542Q_SDATA
clock
        nop
        bsf         SCDQ5542Q_SDCLK     ; "Klocka" in biten på SDATA
        nop
        bcf         SCDQ5542Q_SDCLK     ; till displayen...
        nop
        decfsz      SCDQ5542Q_TMP, f    ; Alla bitar skickade ?
        goto        next_bit            ; Nej, kör ett varv till...
;
        nop
        bsf         SCDQ5542Q_LOAD      ; Avsluta överföringen genom att
        nop                             ; sätta LOAD pinnen hög igen.
        nop
;
        return
;       
;**********************************************************************
;**********************************************************************
; Diverse delay rutiner.
; Alla delay rutiner generade med kodgeneratorn här :
; http://www.piclist.com/techref/piclist/codegen/delay.htm
; OBS generatade för 4 Mhz processorhastighet.
;
DLY_VAR      UDATA_SHR
d1           RES 1
d2           RES 1
d3           RES 1
;
;
DLY_CODE        CODE
;
delay_1s
 movlw 0x08
 movwf d1
 movlw 0x2F
 movwf d2
 movlw 0x03
 movwf d3
Delay_1s_0
 decfsz d1, f
 goto $+2
 decfsz d2, f
 goto $+2
 decfsz d3, f
 goto Delay_1s_0
 goto $+1
 nop
    return
;
;**********************************************************************
;**********************************************************************
    end

 


Denna sida senast uppdaterad 26-Jan-2013