Kod för att skriva till en "dot-matrix" LED display från Siemens modell DLR3416 skriven för PIC16F886. Kan utan större justeringar användas till de flesta nyare PIC16. För detaljer om displayen se datablad som kan hittas här : http://www.jescab.se/upload/DLO3416.pdf.
Lägg upp ett tomt projekt i MPLAB, skapa en ny, tom ASM fil och klistra in koden. Se även min sida om MPLAB.
Notera att det enda som används i kopplingen är PIC'en, en 100 nF kondensator, ett motstånd till MCLR samt displayen! PIC'en körs med intern oscillator så inga andra externa komponenter behövs. De färgade trådarna till vänster är inkopplingen av min Wisp628... |
|
;**********************************************************************
; Enkelt test av DLR3416 5x7 "dot matrix" LED display.
; För PIC16F886
;
;**********************************************************************
; *
; Filename: DLR3416_16F886.asm
; Date: 20070709
; 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.
;
; A0-A1 : RA0-RA1 (adress, 1-av-4)
; WR : RA3 (skrivpuls)
; D0-D6 : RB0-RB6 (7 databitar, normalt ett ASCII tecken)
;
;**********************************************************************
;
;
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
;
;**********************************************************************
; Definition av pinnar och port för displayen.
;
#define DLR3416_A0 PORTA, 0
#define DLR3416_A1 PORTA, 1
#define DLR3416_WR PORTA, 2
#define DLR3416_DATA PORTB
;
;
;**********************************************************************
; 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...
;
;**********************************************************************
;**********************************************************************
; Macro för att skicka ett tecken till DLR3416.
; "pos" = position 1-4 räknat från vänster.
; "char" är ASCII tecknet enligt teckentabell i databladdet.
;
dlr3416_out macro pos, char
movlw pos ; adressen (1-4)...
movwf dlr3416_pos
movlw char ; tecknet...
movwf dlr3416_char
call dlr3416_write_char
endm
;
;**********************************************************************
;**********************************************************************
; 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.
bsf dlr3416_wr
;
; Gör några anrop till macrot för att skriva ut lite text.
;
dlr3416_out 1, a'H'
dlr3416_out 2, a'E'
dlr3416_out 3, a'J'
dlr3416_out 4, a'!'
;
;
loop goto loop ; Gör ingenting mer....
;
;
;*********************************************************************
; Subrutin för DLR3416
;
; Två temp variabler som används av rutinen.
; Lägger dom i "shared memory" så slipper vi banksel...
;
DLR3416_VARS UDATA_SHR ; Starta ny data-section.
DLR3416_POS RES 1 ; Position på displayen.
DLR3416_CHAR RES 1 ; Tecken som ska skrivas.
;
; Slut på variabler, här kommer koden...
;
DLR3416_CODE CODE ; Starta ny code-section.
;
; Rutin för att skriva ett tecken på displayen.
; Anropas av "dlr3416_out" macrot.
;
DLR3416_write_char
;
; Lägg först ut tecknet på datapinnarna.
;
movf dlr3416_char, w
movwf dlr3416_data
;
; Det följande är för att sätta rätt adress
; på A0 och A1.
; Kan göras lite kompaktare men det blev tydligt
; så här...
;
decfsz dlr3416_pos, f ; pos = 1 ?
goto not_pos_1 ; Nej...
bsf dlr3416_a0 ; Ja, sätt A0/A1.
nop
bsf dlr3416_a1
nop
goto toggle_wr
;
not_pos_1
decfsz dlr3416_pos, f ; pos = 2 ?
goto not_pos_2 ; Nej...
bcf dlr3416_a0 ; Ja...
nop
bsf dlr3416_a1
nop
goto toggle_wr
;
not_pos_2
decfsz dlr3416_pos, f ; o.s.v...
goto not_pos_3
bsf dlr3416_a0
nop
bcf dlr3416_a1
nop
goto toggle_wr
;
not_pos_3
bcf dlr3416_a0 ; pos måste vara = 4...
nop
bcf dlr3416_a1
nop
goto toggle_wr
;
toggle_wr
bcf dlr3416_wr ; Skriv till displayen.
nop
bsf dlr3416_wr
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