Picaxe Programmbeispiele

Bei den meisten Beispielen kam ein Picaxe 18-X Demoboard und ein serielles LCD zu Einsatz.

Breadboard Adapter
PICAXE-18 TUTORIAL BOARD

Sieben Segment Anzeige ansteuern

An dem folgenden Beispiel kann man gut erkennen wie im PICAXE Programming Editor die Simulation der Programmes läuft.
Man kann gut die Zustände der Ein- und Ausgänge und der Variablen erkennen.

' Auf dem PICAXE 18X Tutorial Board
#picaxe 18x
#freq m4

main1:
pause 2000
goto siebenseg

siebenseg:
let pins = %00111111 ; digit 0
pause 1000
let pins = %00000110 ; digit 1
pause 1000
let pins = %01011011 ; digit 2
pause 1000
let pins = %01001111 ; digit 3
pause 1000
let pins = %01100110 ; digit 4
pause 1000
let pins = %01101101 ; digit 5
pause 1000
let pins = %01111101 ; digit 6
pause 1000
let pins = %00000111 ; digit 7
pause 1000
let pins = %01111111 ; digit 8
pause 1000
let pins = %01101111 ; digit 9
pause 1000
goto main1

 

Bit schieben – Lauflicht

symbol counter = b1
symbol var_in = b2
var_in = %00000001

main:
gosub shift_left
gosub shift_right
end

shift_left:
for counter = 1 to 7
var_in = var_in * 2 ' shift left as MSB first
let pins = var_in
pause 1000
next counter
return

shift_right
for counter = 1 to 7
var_in = var_in / 2 ' shift left as MSB first
let pins = var_in
pause 1000

next counter
return

 

PICAXE Routinen für serielle LCD

' Eigenschaften LCD
' 2 Zeilen
' 16 Zeichen pro Zeile
' 1. Zeile Pos  0 bis 15 wird angezeigt, bis Pos.40 Zeichen im Speicher
' 2. Zeile Pos 41 bis 56 wird angezeigt, bis Pos.80 Zeichen im Speicher
'--------------------------------------------------------------------
' Initialisierung
'--------------------------------------------------------------------
init1: pause 500                 ; notwendig nach Power On
serout 7,N2400,(254,1)            ' Clear Display
pause 30
'--------------------------------------------------------------------
' Cursorpositionierung
'--------------------------------------------------------------------
serout 7,N2400,(254,128)          ; Cursor erste Zeile
serout 7,N2400,(254,200)          ; Cursor zweite Zeile
'--------------------------------------------------------------------
' Countdownzähler
'--------------------------------------------------------------------
serout 7,N2400,(254,128)          ; Cursor erste Zeile
serout 7,N2400,("Countdown ")     ; Ausgabe erste Zeile
serout 7,N2400,(254,200)          ; Cursor zweite Zeile
for b1 = 100 to  0 step -1
serout 7,N2400,(254,192,#b1,"            ")  ; Variable b1 ausgeben
pause 1000
next b1
serout 7,N2400,(254,128,"Countdown beendet")
'--------------------------------------------------------------------
' Cursor an / aus
'--------------------------------------------------------------------
serout 7,N2400,(254,0x0C)     ;Cursor off
serout 7,N2400,(254,0x0E)     ;Cursor on
'--------------------------------------------------------------------
' Cursor positionieren
'--------------------------------------------------------------------
cursor1:                       ; cursor zeile 1 pos 128 + x
serout 7,N2400,(254,128)       ; erste Zeile
for b1 = 128 to  150
serout 7,N2400,(254,b1)        ;cursor right
pause 200
next b1
for b1 = 150 to  128 step -2
serout 7,N2400,(254,b1)        ;cursor left
pause 200
next b1
'-------------------------------------------------------------------
' Text scrollen
'-------------------------------------------------------------------
Laufschrift1:
serout 7,N2400,(254,128)     ; erste Zeile
serout 7,N2400,("  **** Das ist eine Laufschrift   **** ")
for b1 = 0 to  300
serout 7,N2400,(254,0x18)    ;scroll left
pause 300
next b1
'-------------------------------------------------------------------
' Die 1. Zeile komplett beschreiben und scrollen
'-------------------------------------------------------------------
serout 7,N2400,(254,128)     ; erste Zeile
serout 7,N2400,("Das passt in den Speicher der 1. Zeile**")

for b1 = 0 to  30
serout 7,N2400,(254,0x18)    ;scroll left
pause 200
next b1
wait 2

for b1 = 0 to  30
serout 7,N2400,(254,0x1C)    ;scroll right
pause 200
next b1
'------------------------------------------------------------------
' Cursor verschieben
'------------------------------------------------------------------
serout 7,N2400,(254,0x10)    ;Cursor left
serout 7,N2400,(254,0x14)    ;Cursor right
'------------------------------------------------------------------
' Cursor Blinken an /aus
'------------------------------------------------------------------
serout 7,N2400,(254,0x0D)    ;Cursor blinking on
serout 7,N2400,(254,0x0C)    ;Cursor blinking of
'------------------------------------------------------------------
' Display an /aus
'------------------------------------------------------------------     
for b1 = 0 to  10
serout 7,N2400,(254,0x08)    ;Display off
pause 500
serout 7,N2400,(254,0x0c)    ;Display on
pause 500
next b1
'------------------------------------------------------------------
' LCD Zeichensatz anzeigen
'------------------------------------------------------------------
zeichensatz:
for b1 = 8 to  252         ' Ausgabe des Zeichensatzes
serout 7,N2400,(254,128,#b1,"  ",b1)
pause 500
next b1

'------------------------------------------------------------------
'LCD Textspeicher verwenden      Message 1 bis 7 möglich
'------------------------------------------------------------------
init: pause 500
serout 7,N2400,(254,1)                    ' Clear Display
pause 30

for b1 = 1 to 7
serout 7,N2400,(253,b1,"Textspeicher ", #b1,"         ")
pause 1000
next b1

for b1 = 1 to 7
serout 7,N2400, (b1)
pause 2000
next b1
'-----------------------------------------------------------------
lcd-zeichensatz
lcd-zeichensatz

Auswahl LCD Sonderzeichen

ZeichenNameHexcode
±plus/minus10
Pfeil nach obenC5
Pfeil nach untenC6
Pfeil nach rechtsC7
Pfeil nach linksC8
«linkes AnführungszeichenBB
»rechtes AnführungszeichenBC
<kleiner als3C
>größer als3E

 

Ansteuerung 2 -zeiliges LCD parallel

LCD-Modul DATAVISION DV-20208
LCD-Modul DATAVISION DV-20208

 

Zum Einsatz kam hier ein günstiges LCD von Pollin. Um Prozessorpins und Datenleitungen zu sparen wird es im 4 Bit Modus betrieben. Im Prinzip wird die Standadroutine aus dem Handbuch verwendet.

Im Handbuch sind allerdings die Datenleitungen DB4 bis DB7 vertauscht und müssen genau anders herum gezählt werden.

 

 

 

PICAXE Standard LCD
PICAXE Standard LCD

 

 

 

 

 

 

 

;    Pinbelegung
;    Pin2   RS    Low = Befehlsmodus High = Zeichemmodus
;    Pin7 bis 4     DB    Daten
;    D4  = Pin4
;    D5  = Pin5
;    D6  = Pin6
;    D7  = Pin7
;    Pin3  SE     Daten enable
;    B1  =    Ausgabewert LCD    high
;    B2  =    Ausgabewert LCD    low
;    B3  =    Zählerwert diverse LCD Routinen
symbol display_loeschen           = %00000001    ; D0 = 1
symbol display_cursor_anfang      = %00000010    ; D1 = 1
symbol display_cursor_links       = %00000100    ; D2 = 1 D1 = Richtung D0 = Shift
symbol display_cursor_rechts      = %00000110
symbol display_shift_ein          = %00000101
symbol display_ein                = %00001100
symbol display_aus                = %00001000
symbol display_cursor_ein         = %00001010
symbol display_cgram_adress       = %01000000   
; symbol display_cgram_write RS   = 1 RW = 0     ; read Write Leitung notwendig
; symbol display_cgram_read RS    = 1 RW = 1

main:
 gosub init
 goto main

init:
 let pins = %00000000           ; Clear all output lines
 let b4 = 0                     ; Reset variable b4
 ;let dirsc = %11111100         ; Set pins 2-7 as output lines (Stamp only).
 pause 200                      ; Wait 200 ms for LCD to reset.
 let pins =  %00110000          ; Set to 8-bit operation.
 pulsout 3,1                    ; Send data by pulsing ;enable’
 pause 10                       ; Wait 10 ms
 pulsout 3,1                    ; Send data again
 pulsout 3,1                    ; Send data again
 let pins = %00100000           ; Set to 4-bit operation.
 pulsout 3,1                    ; Send data.
 pulsout 3,1                    ; Send data again.
 let pins = %10000000           ; Set to two line operation
 pulsout 3,1                    ; Send data.
 let b1 = 14                    ; Screen on, cursor on instruction
 gosub wrins                    ; Write instruction to LCD
 return
wrchr:
 let pins = b1 & 240            ; Mask the high nibble of b1 into b2.
 ;let pins = b1 & %11110000
 high 2                         ; Make sure RS is high
 pulsout 3,1                    ; Pulse the enable pin to send data.
 let b2 = b1 * 16               ; 4 Stellen nach links schieben
 ; let b2 = b1 * %00010000
 let pins = b2 & 240            ; low teil ist jetzt in bit 4 bis 7 verschoben
 high 2                         ; Make sure RS is high
 pulsout 3,1                    ; Pulse enable pin to send data.
 return
wrins: let pins = b1 & 240     ; Mask the high nibble of b1 into b2.
 pulsout 3,1                   ; Pulse the enable pin to send data.
 let b2 = b1 * 16              ; Put low nibble of b1 into b2.
 let pins = b2 & 240           ; Mask the high nibble of b2
 pulsout 3,1                   ; Pulse enable pin to send data.
 high 2                        ; Back to character mode
 return
display_clear:                ; D0 aud 1
 let b1 = 1                   ; Set b1 to clear instruction
 goto wrins                   ; Send it to LCD
 return
display_cursor_null:
 let b1 = 2                   ; Set b1 to clear instruction
 goto wrins
 return
display_cursor_one:          ;Cursor in die 1. Zeile
 let b1 = 128                ; Set b1 to start of first line
 goto wrins                  ; Send it to LCD
 return
display_cursor_two:          ;Cursor in die 2. Zeile
 let b1 = 192                ; Set b1 to start of second line
 goto wrins                  ; Send it to LCD
 return
display_flash:
 for b3 = 1 to 10            ; Start a for...next loop using
 let b1 = 8                  ; Set b1 to ;turn visual display
 gosub wrins                 ; Send instruction to LCD
 pause 200                   ; Pause for 0.2 second
 let b1 = 12                 ; Set b1 to ;turn visual display
 gosub wrins                 ; Send instruction to LCD
 pause 200                   ; Pause for 0.2 second
 next b3                     ; End of for...next loop
 return
display_scroll_right:
 for b3 = 1 to 40            ; Start a for...next loop using
 let b1 = 28                 ; Set b1 to ;scroll display
 pause 200
 next b3
 return
display_scroll_left:
 for b3 = 1 to 40           ; Start a for...next loop using
 let b1 = 24                ; Set b1 to ;scroll display
 pause 200
 next
 return
display_cursor_left:        ;  Cursor left
 let b1 = 16
 goto wrins
 return
 display_cursor_right:      ;  Cursor right
 let b1 = 20
 goto wrins
 return

Ansteuerung eines Servomotors

Der Befehl servopos erwartete den Pin und die Servoposition als Parameter.
Die beiden Endpositionen haben den Wert 75 und 225, die Mittenposition liegt so bei 150.

init: servo 4,75            ‘ start servo on 4
main: servopos 4,75         ‘ move servo to one end
pause 2000                  ‘ wait 2 seconds
servopos 4,150              ‘ move servo to centre
pause 2000                  ‘ wait 2 seconds
servopos 4,225              ‘ move servo to other end
pause 2000                  ‘ wait 2 seconds
goto main                   ‘ loop back to start