Drive a 2x16 or 4x20 Hitachi LCD with a single pin via a 74HC595 Shift Register

Started by top204, Feb 06, 2021, 03:58 PM

Previous topic - Next topic

Pepe


Abdullah

Abdullah

Pepe

Cortando la parte del código que está  en el programa principal y pegándola en un nuevo archivo con extensión .inc

Pepe

Device = 16F676
Config FOSC_INTRCIO, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, BOREN_OFF, CP_OFF, CPD_OFF
Declare Xtal = 4
All_Digital True

'------------------ ADC Setup -------------------
Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 50

'------------------ LCD via CD4094 -------------------
Symbol SR_DATA  = PORTC.0
Symbol SR_CLK   = PORTC.1
Symbol SR_LATCH = PORTC.2

Dim LCDByte   As Byte
Dim TempByte  As Byte
Dim Command   As Byte
Dim DataByte  As Byte
Dim B         As Byte

Dim vdc As Word
Dim vac As Word
Dim i As Byte
Dim vdcSum As Word
Dim vacSum As Word
Dim PrintValue As Word
Dim scaledVdc As Word
Dim scaledVac As Word
Dim Digits As Word
TRISC = 0
PORTC = 0

'------------------ LCD INIT -------------------
GoSub LCD_Setup
DelayMS 300
GoSub LCD_Clear

'------------------ MAIN LOOP -------------------
Main:
    vdcSum = 0
    vacSum = 0

    ' --- Read and Average ---
    For i = 1 To 10
        vdcSum = vdcSum + ADIn 0     ' DC Voltage on AN0
        vacSum = vacSum + ADIn 1     ' AC Voltage on AN1
        DelayMS 5
    Next

    vdc = vdcSum / 10
    vac = vacSum / 10

    ' --- Safe Conversion (0–999V scale for 0–5V) ---
     scaledVdc = (vdc * 500) / 1023
     scaledVac = (vac * 500) / 1023
    '---------------- LCD Display -----------------
    GoSub LCD_Home
    GoSub LCD_Show_Solar
    GoSub LCD_Show_AC
    GoSub LCD_NextLine

    DelayMS 500
GoTo Main
'------------------ LCD TEXT ROUTINES -------------------

LCD_Show_Solar:
    DataByte = "S" : GoSub LCD_SendData
    DataByte = "O" : GoSub LCD_SendData
    DataByte = "L" : GoSub LCD_SendData
    DataByte = ":" : GoSub LCD_SendData
    PrintValue = scaledVdc
    GoSub LCD_Print_Dec3
    DataByte = " " : GoSub LCD_SendData
    DataByte = " " : GoSub LCD_SendData
Return

LCD_Show_AC:
    DataByte = "A" : GoSub LCD_SendData
    DataByte = "C" : GoSub LCD_SendData
    DataByte = "V" : GoSub LCD_SendData
    DataByte = ":" : GoSub LCD_SendData
    PrintValue = scaledVac
    GoSub LCD_Print_Dec3
   
Return
'------------------ PRINT DECIMAL -------------------
LCD_Print_Dec3:
    DataByte =( Dig PrintValue, 2 )+ 48 : GoSub LCD_SendData
    DataByte =( Dig PrintValue, 1 )+ 48 : GoSub LCD_SendData
    DataByte =( Dig PrintValue, 0 )+ 48 : GoSub LCD_SendData
Return

'------------------ LCD BASIC ROUTINES -------------------

LCD_Clear:
    Command = $01 : GoSub LCD_SendCommand
    DelayMS 2
Return

LCD_Home:
    Command = $80 : GoSub LCD_SendCommand
Return

LCD_NextLine:
    Command = $C0 : GoSub LCD_SendCommand
Return
'-----------------------------------------------------------
ShiftOut_Byte:
    For B = 0 To 7
        SR_CLK = 0
        SR_DATA = (TempByte >> 7) & 1
        DelayUS 5
        SR_CLK = 1
        DelayUS 5
        TempByte = TempByte << 1
    Next
Return

SendTo_LCD:
    TempByte = LCDByte
    GoSub ShiftOut_Byte
    SR_LATCH = 1
    DelayUS 10
    SR_LATCH = 0
Return

PulseE:
    LCDByte.6 = 1
    GoSub SendTo_LCD
    DelayUS 20
    LCDByte.6 = 0
    GoSub SendTo_LCD
Return

LCD_SendCommand:
    LCDByte = Command >> 4
    LCDByte.5 = 0
    GoSub PulseE
    LCDByte = Command & $0F
    LCDByte.5 = 0
    GoSub PulseE
    DelayMS 2
Return

LCD_SendData:
    LCDByte = DataByte >> 4
    LCDByte.5 = 1
    GoSub PulseE
    LCDByte = DataByte & $0F
    LCDByte.5 = 1
    GoSub PulseE
    DelayMS 2
Return

LCD_Setup:
    DelayMS 15
    Command = $03 : GoSub LCD_SendCommand
    DelayMS 5
    Command = $03 : GoSub LCD_SendCommand
    DelayUS 150
    Command = $03 : GoSub LCD_SendCommand
    Command = $02 : GoSub LCD_SendCommand
    Command = $28 : GoSub LCD_SendCommand
    Command = $0C : GoSub LCD_SendCommand
    Command = $06 : GoSub LCD_SendCommand
    Command = $01 : GoSub LCD_SendCommand
    DelayMS 2
Return