News:

Let's find out together what makes a PIC Tick!

Main Menu

HT16K33 14 segments display control using PIC12F1840

Started by JackB, Jun 09, 2025, 09:37 PM

Previous topic - Next topic

JackB

Hello everyone,

I'd like to share this simple code using I2C, an PIC12F1840 to control an HT16K33 or (VK16K33)

14 segments led display, this code was written by Steve Smythe 2017.

I did adapt to Positron 8.





' Note **** : after uploading disconnect Pickit3
' Project   : HT16K33 / VK16K33  14 Segments Led display controller
' File      : "D:\Positron Code\12F1840\HT16K33 14 Segments controller.bas"
' Date      : Jun 6-2025
' Byte used : 1446 (35.30%) out of 4096
' Note      : HOLTEK RAM Mapping 16*8 LED Controller Driver with keyscan
' IC equ    : VK16K33 from VINKA Microelctronics
' Display   : 14DR5421AS Futurlec Double Hi-Red 0.54" Common Cathode 14-Segment LED Display
' Datasheet : Config p41 / OSCCON p61 /
' Credit    : Steve Smythe 2017

Device = 12F1840         
Declare Xtal = 32

Config1 FOSC_INTOSC , WDTE_OFF , PWRTE_OFF , MCLRE_OFF , CP_OFF , CPD_OFF , BOREN_ON , CLKOUTEN_OFF , IESO_ON , FCMEN_ON
Config2 WRT_OFF , PLLEN_ON , STVREN_ON , BORV_19 , LVP_OFF
 
TRISA = %00001000
PORTA = 0
OSCCON = $F0

Declare I2C_Slow_Bus = OFF
Dim Count As Byte
                               
Symbol SCL = PORTA.1           ' I2C clock pin
Symbol SDA = PORTA.2           ' I2C data pin
Symbol cControl = %11100000    ' I2C address
I2COut SDA,SCL,cControl,[$21]  ' start clock/oscillator
DelayMS 1                   ' Delay 1ms after each write

' data for each character -----------------------
'
'   byte1,byte2
'0 = $3f,$0
'1 = $6,$0
'2 = $db,$0
'3 = $cf,$0
'4 = $e6,$0
'5 = $ed,$0
'6 = $fd,$0
'7 = $1,$c
'8 = $ff,$0
'9 = $c7,$8
'. = $0,$40
'+ = $c0,$12
'- = $c0,$0
'/ = $0,$c
'| = $0,$10
'\ = $0,$21
'$ = $8d,$c
'all segments = $3f,$3f
'A $F7,$0
'B $8F,$12
'C $39,$0
'D $F,$12
'E $F9,$0
'F $F1,$0
'G $BD,$0
'H $F6,$0
'I $9,$12
'J $1E,$0
'K $70,$24
'L $38,$0
'M $36,$5
'N $36,$21
'O $3F,$0
'P $F3,$0
'Q $3F,$20
'R $F3,$20
'S $ED,$0
'T $0,$12
'U $3E,$0
'V $30,$C
'W $36,$28
'X $0,$2D
'Y $0,$15
'Z $9,$C
'a $58,$10
'b $78,$20
'c $D8,$0
'd $8E,$8
'e $58,$8
'f $71,$0
'g $8E,$4
'h $70,$10
'i $0,$10
'j $E,$0
'k $0,$36
'l $30,$0
'm $D4,$10
'n $50,$10
'o $DC,$0
'p $70,$1
'q $86,$4
'r $50,$0
's $88,$20
't $78,$0
'u $1C,$0
'v $4,$20
'w $14,$28
'x $C0,$28
'y $C,$28
'z $48,$8
'-------------------------------------------------

'Program Start

Do
Count = 0

I2COut SDA,SCL,cControl,[$80] ' clear the display
' print out the character set four at a time

'0 1 2 3
I2COut SDA,SCL,cControl,$00,[$3f,$0,$6,$0,$db,$0,$cf,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'4 5 6 7
I2COut SDA,SCL,cControl,$00,[$e6,$0,$ed,$0,$fd,$0,$1,$c]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'8 9 $ all
I2COut SDA,SCL,cControl,$00,[$ff,$0,$e7,$0,$ed,$12,$3f,$3f]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'- / . +
I2COut SDA,SCL,cControl,$00,[$0,$40,$c0,$12,$c0,$0,$0,$c]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'A B C D
I2COut SDA,SCL,cControl,$00,[$F7,$0,$8F,$12,$39,$0,$F,$12]
I2COut SDA,SCL,cControl,[$81] ; latch data to display
DelayMS 500

'E F G H
I2COut SDA,SCL,cControl,$00,[$F9,$0,$F1,$0,$BD,$0,$F6,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'I J K L
I2COut SDA,SCL,cControl,$00,[$9,$12,$1E,$0,$70,$24,$38,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'M N O P
I2COut SDA,SCL,cControl,$00,[$36,$5,$36,$21,$3F,$0,$F3,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'Q R S T
I2COut SDA,SCL,cControl,$00,[$3F,$20,$F3,$20,$ED,$0,$1,$12]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'U V W X
I2COut SDA,SCL,cControl,$00,[$3E,$0,$30,$C,$36,$28,$0,$2D]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'Y Z all all
I2COut SDA,SCL,cControl,$00,[$0,$15,$9,$C,$3f,$3f,$3f,$3f]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'a b c d
I2COut SDA,SCL,cControl,$00,[$58,$10,$78,$20,$D8,$0,$8E,$8]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'e f g h
I2COut SDA,SCL,cControl,$00,[$58,$8,$71,$0,$8E,$4,$70,$10]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'i j k l
I2COut SDA,SCL,cControl,$00,[$0,$10,$E,$0,$0,$36,$30,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'm n o p
I2COut SDA,SCL,cControl,$00,[$D4,$10,$50,$10,$DC,$0,$70,$1]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'q r s t
I2COut SDA,SCL,cControl,$00,[$86,$4,$50,$0,$88,$20,$78,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'u v w x
I2COut SDA,SCL,cControl,$00,[$1C,$0,$4,$20,$14,$28,$C0,$28]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

'8 8 8 8
I2COut SDA,SCL,cControl,$00,[$ff,$0,$ff,$0,$ff,$0,$ff,$0]
I2COut SDA,SCL,cControl,[$81] ' latch data to display
DelayMS 500

I2COut SDA,SCL,cControl,[$E0] ' dim the display (range $E0 to $EF)
DelayMS 500
I2COut SDA,SCL,cControl,[$EF] ' full brightness again
DelayMS 500
I2COut SDA,SCL,cControl,[$83] ' blink the display ($83=2Hz blink, $85=1Hz, $87=0.5Hz)
DelayMS 3000
I2COut SDA,SCL,cControl,[$80] ' clear the display
DelayMS 500

' make a spinney-round thing!
Do
    I2COut SDA,SCL,cControl,$00,[$0,$12,$0,$12,$0,$12,$0,$12]
    I2COut SDA,SCL,cControl,[$81] ' latch data to display
    DelayMS 20
    I2COut SDA,SCL,cControl,$00,[$0,$c,$0,$c,$0,$c,$0,$c]
    I2COut SDA,SCL,cControl,[$81] ' latch data to display
    DelayMS 20
    I2COut SDA,SCL,cControl,$00,[$c0,$0,$c0,$0,$c0,$0,$c0,$0]
    I2COut SDA,SCL,cControl,[$81] ' latch data to display
    DelayMS 20
    I2COut SDA,SCL,cControl,$00,[$0,$21,$0,$21,$0,$21,$0,$21]
    I2COut SDA,SCL,cControl,[$81] ' latch data to display
    DelayMS 20
    Count = Count + 1
Loop While Count < 21 'till count=20
Loop 'back to top:




Pepe


JackB


Blink edit:

sould be : I2COut SDA,SCL,cControl,[$83] ' blink the display ($87=2Hz blink, $85=1Hz, $83=0.5Hz)