BMP To And From Memory

Code Examples ››
Parent Previous Next

DEMO BMP FILES TO AND FROM FLASH MEMORY

(Download)


Device = 33EP128MC504


Declare Xtal = 150

Declare Auto_Heap_Arrays = On

Declare Auto_Heap_Strings = On

Declare Auto_Variable_Bank_Cross = On

Declare Stack_Expand = On

Declare Watchdog = OFF

Declare Warnings = Off

Declare Access_Upper_64K = On


'================ MCU =======================

$define McuType              1

'================ TFT SCREEN ================

$define TFT_IC               ILI9341

$define TftScreenWidth       320

$define TftScreenHeight      240

$define TftWidthOffset       0

$define TftHeightOffset      0

$define TftPixelCheck        0

$define TFT_COM              SPI_2

$define TFT_COM_Slow         SPI2STAT = 0X0000 : SPI2CON1 = 0X033D : SPI2BUF = 0 : SPI2STAT = 0X8000

$define TFT_COM_Fast         SPI2STAT = 0X0000 : SPI2CON1 = 0X033B : SPI2BUF = 0 : SPI2STAT = 0X8000

$define TFT_RESET            PORTC.2

$define TFT_CS               PORTC.9

$define TFT_DC               PORTC.1

$define TFT_MOSI             PORTC.6

$define _TFT_MOSI            _PORTC.6

$define TFT_MISO             PORTC.5

$define _TFT_MISO            _PORTC.5

$define TFT_SCLK             PORTC.7

$define _TFT_SCLK            _PORTC.7

Include                      "TftLib\TFT_Graphic_Lib.inc"

Include                      "TftLib\Colors\Colors.inc"

Include                      "TftLib\Drivers\Drivers.inc"

Include                      "TftLib\Drivers\ILI9341.inc"

Include                      "TftLib\System\System.inc"

Include                      "TftLib\System\System_SPI_V4.inc"

Include                      "TftLib\Shapes\Shapes.inc"

Include                      "TftLib\Shapes\Shapes_SPI_V1.inc"

'================ SD CARD ===================

$define SDCardUsed           1

$define SDCardFatUsed        1

$define SD_COM               SPI_1

$define SD_CS                PORTA.1

$define SD_SDO               PORTA.4

$define _SD_SDO              _PORTA.4

$define SD_SDI               PORTA.9

$define _SD_SDI              _PORTA.9

$define SD_CLK               PORTC.3

$define _SD_CLK              _PORTC.3

Include                      "TftLib\SdCard\SdCard.inc"

Include                      "TftLib\SdCard\Fat.inc"

Include                      "TftLib\SdCard\SdCard_SPI_V4.inc"

'================ MEMORY ====================

$define MemoryType           2

$define MEM_PAGE_SIZE        256

$define MEM_SECTOR_SIZE      4096

$define MEM_SECTOR_COUNT     2048

$define MEM_FILE_COUNT       256

$define MEM_WRITE_DELAY      5

$define MEM_COM              SPI_1

$define MEM_CS               PORTA.7

$define MEM_MOSI             PORTA.4

$define _MEM_MOSI            _PORTA.4

$define MEM_MISO             PORTA.9

$define _MEM_MISO            _PORTA.9

$define MEM_SCLK             PORTC.3

$define _MEM_SCLK            _PORTC.3

Include                      "TftLib\Memory\Memory.inc"

Include                      "TftLib\Memory\Flash.inc"

Include                      "TftLib\Memory\Memory_SPI_V3.inc"

Include                      "TftLib\Memory\Flash_SPI_V1.inc"

'================ TFT TOUCH =================

$define TOUCH_IC             XPT2046

$define Z_Threshold          500

$define TouchAveragePoints   2

$define TouchMedianDistance  8

$define TOUCH_COM            SPI_SW

$define T_CS                 PORTC.8

$define T_IRQ                PORTA.8

$define T_MOSI               PORTC.6

$define _T_MOSI              _PORTC.6

$define T_MISO               PORTC.5

$define _T_MISO              _PORTC.5

$define T_SCLK               PORTC.7

$define _T_SCLK              _PORTC.7

Include                      "TftLib\Touch\Touch.inc"

Include                      "TftLib\Touch\XPT2046.inc"

'================ SPRITES ===================

$define SpritesUsed          1

$define SpriteBufferSize     910

$define SpriteBufferNumber   3

Include                      "TftLib\Sprites\Sprites.inc"

Include                      "TftLib\Sprites\Sprites_SPI_V2.inc"

'=============== SND FONT ===================

$define FontSNDUsed          1

Include                      "TftLib\Fonts\SND\F0_SND_8x8_Basic.inc"

$define FontSmooth           0

$define FontMaxSpace         8

$define FontMaxPixels        8

Include                      "TftLib\Fonts\SND.inc"

Include                      "TftLib\Fonts\SND_SPI_V1.inc"

'=============== BDF FONT ===================

$define FontBDFUsed          0



Symbol LED = PORTC.0 : Output LED : Low LED

Symbol BT = PORTA.0 : Input BT


'Generated with Excel table

$define TickMenu_List_Front         0

$define TickMenu_List_Back          1

$define TickMenu_List_Kitchen       2

$define TickMenu_List_Porch         3

$define TickMenu_List_All           4

$define TickMenu_Mark_Empty_Front   5

$define TickMenu_Mark_Empty_Back    6

$define TickMenu_Mark_Empty_Kitchen 7

$define TickMenu_Mark_Empty_Porch   8

$define TickMenu_Mark_Empty_All     9

$define Button_Up_Set               10

$define TickMenu_List_Front_Erase   11

$define TickMenu_List_Back_Erase    12

$define TickMenu_List_Kitchen_Erase 13

$define TickMenu_List_Porch_Erase   14

$define TickMenu_List_All_Erase     15

$define TickMenu_Mark_Check_Front   16

$define TickMenu_Mark_Check_Back    17

$define TickMenu_Mark_Check_Kitchen 18

$define TickMenu_Mark_Check_Porch   19

$define TickMenu_Mark_Check_All     20

$define Button_Down_Set             21

$define Tree_TickMenu_Show          22

$define Tree_Button_Door_Show       23

$define Button_Down_Lock            24

$define Button_Down_Unlock          25

$define Button_Down_Door            26

$define Tree_TickMenu_Hide          27

$define Tree_Button_Door_Hide       28

$define Button_Up_Door              29

$define Button_Up_Lock              30

$define Button_Up_Unlock            31

$define Button_Hide_Lock            32

$define Button_Hide_Unlock          33

$define Button_Hide_Set             34

$define MainScreen                  35

$define Message_Clear               36


Dim sFileName As String * 12

Dim bCounter1 As Byte

Dim bCounter2 As Byte

Dim wBitVariable As Word

Dim ButtonDoor As wBitVariable.0    

Dim ButtonLock As wBitVariable.1    = 1 

Dim ButtonUnlock As wBitVariable.2  = 0

Dim ButtonSet As wBitVariable.3 

Dim TickFront As wBitVariable.4

Dim TickBack As wBitVariable.5

Dim TickKitchen As wBitVariable.6

Dim TickPorch As wBitVariable.7

Dim TickAll As wBitVariable.8


Main:

    Clear

    SetCrystal()

    SetPins()

    TftBmpMemSet()

    TftSetSndFont(0,0)

    TftSetUp(0,0)  

    TftResetScreen(BLACK)

    TransferFilesToFlash()

    TftTouchCalibration(3) 

    'Mask full screen transfer lag by switching off the screen during transfer

    TftDisplayOff()

    TftBmpFromMemIndex(MainScreen, 0, 0)

    TftDisplayOn()

    

    While 1 = 1

        'Touch IRQ triggered

        If T_IRQ = 0 Then

            'if touch ADC values are within valid range

            If TftTouchGetCoordinates(1) = 1 Then

                'check if valid menu has been selected

                ClickMenu(wTouchToPointX, wTouchToPointY)

                'Debounce

                DelayMS 300

            EndIf    

        EndIf  

    Wend  

End  


Proc TransferFilesToFlash()

    Dim wTemp As Dword


    bCounter1 = 0

    Do

        If File_Init() = cErrOK Then Break

        Inc bCounter1

        DelayMS 10

    Loop Until bCounter1 = 255


    If bCounter1 = 255 Then

        'Sd Card initialization fail

        TftPrintSndString("SD FAIL", 1, 5,13,1, GREEN,BLACK,0)

        While 1 = 1 : Wend

    EndIf

    

    'Some delay to avoid accidental FLASH erasure

    TftPrintSndString("File transfer in  ", 1, 5,13,1, GREEN,BLACK,0)

    For bCounter1 = 4 DownTo 0

        TftPrintSndInteger(bCounter1,1, 1, 23,13,1, GREEN,BLACK,0) 

        DelayMS 1000   

    Next

    

    TftPrintSndString("Format memory start", 1, 5,13,1, GREEN,BLACK,0)

    TftBmpMemFormat() 

    TftPrintSndString("Format memory done ", 1, 5,13,1, GREEN,BLACK,0)

    DelayMS 1000

    

    bCounter2 = 0

    'Generate file names as in SD card and transfer

    For bCounter1 = 0 To 36

        sFileName = "P" + Str$(Dec3 bCounter1) + ".BMP"

        TftPrintSndString(sFileName, 1, 5,12,1, GREEN,BLACK,0)

        TftPrintSndString("                ", 1, 14,12,1, GREEN,BLACK,0)

        Inc bCounter2

        Select TftBmpSdToMem(sFileName) 

            Case 0

                Dec bCounter2

            Case 1

                TftPrintSndString("SD NO RESPONSE  ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 2

                TftPrintSndString("NO FAT16/FAT32  ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 3

                TftPrintSndString("FILE NOT FOUND  ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 4

                TftPrintSndString("FILE IN USE     ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 5

                TftPrintSndString("READ/WRITE ERROR", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 6

                TftPrintSndString("MEMORY ERROR    ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case 7

                TftPrintSndString("NO FREE SPACE   ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

            Case Else

                TftPrintSndString("UNKNOWN ERROR   ", 1, 14,12,1, GREEN,BLACK,0)

                DelayMS 1000

        EndSelect

    Next


    TftPrintSndString("Done with " + Str$(Dec3 bCounter2) + " errors", 1, 5,11,1, GREEN,BLACK,0)

    DelayMS 1000

EndProc


Proc ClickMenu(wPointX As Word, wPointY As Word)

    'Button door

    If wPointX > 17 And wPointX < 106 And wPointY > 189 And wPointY < 221 Then

        Toggle ButtonDoor 

        ButtonDoor_Change()

        ExitProc

    EndIf        


    'Button lock

    If wPointX > 127 And wPointX < 216 And wPointY > 189 And wPointY < 221 Then

        If ButtonDoor = 1 Then

            Toggle ButtonLock 

            ButtonLock_Change()

        EndIf

        ExitProc

    EndIf  

    

    'Button unlock

    If wPointX > 127 And wPointX < 216 And wPointY > 145 And wPointY < 177 Then

        If ButtonDoor = 1 Then

            Toggle ButtonUnlock 

            ButtonUnlock_Change()

        EndIf

        ExitProc

    EndIf  

    

    'Tick front

    If wPointX > 233 And wPointX < 265 And wPointY > 194 And wPointY < 219 Then

        If ButtonDoor = 1 Then

            Toggle TickFront  

            TickFront_Change()

        EndIf

        ExitProc

    EndIf 

    

    'Tick back

    If wPointX > 233 And wPointX < 265 And wPointY > 163 And wPointY < 188 Then

        If ButtonDoor = 1 Then

            Toggle TickBack 

            TickBack_Change()

        EndIf

        ExitProc

    EndIf 

     

    'Tick kitchen

    If wPointX > 233 And wPointX < 265 And wPointY > 134 And wPointY < 159 Then

        If ButtonDoor = 1 Then

            Toggle TickKitchen

            TickKitchen_Change()

        EndIf

        ExitProc

    EndIf 

    

    'Tick porch

    If wPointX > 233 And wPointX < 265 And wPointY > 104 And wPointY < 129 Then

        If ButtonDoor = 1 Then

            Toggle TickPorch

            TickPorch_Change()

        EndIf

        ExitProc

    EndIf 

    

    'Tick all

    If wPointX > 233 And wPointX < 265 And wPointY > 74 And wPointY < 99 Then

        If ButtonDoor = 1 Then

            Toggle TickAll

            TickAll_Change()

        EndIf

        ExitProc

    EndIf 

    

    'Button Set

    If wPointX > 233 And wPointX < 318 And wPointY > 12 And wPointY < 45 Then

        If ButtonDoor = 1 Then

            TickButtonSet_Change()

        EndIf

        ExitProc

    EndIf 

EndProc



Proc TickButtonSet_Change()

    TftBmpFromMemIndex(Button_Down_Set, 233, 12)

    DelayMS 1000  

    TftBmpFromMemIndex(Button_Up_Set, 233, 12) 

    If ButtonLock = 1 Then

        TftBmpFromMemIndex(Message_Clear, 59, 221)

        TftPrintSndString("Door LOCK ... Done", 1,10,28,1, CARDINAL, BLACK,1)

    Else

        TftBmpFromMemIndex(Message_Clear, 59, 221)

        TftPrintSndString("Door UNLOCK ... Done", 1,9,28,1, CARDINAL, BLACK,1)

    EndIf

EndProc


Proc TickAll_Change()

    If TickAll = 0 Then

        TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        wBitVariable = wBitVariable & %1111111100001111

        TickPorch_Change()

        TickKitchen_Change()

        TickBack_Change()

        TickFront_Change()

    Else

        TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        wBitVariable = wBitVariable | %0000000011110000

        TickPorch_Change()

        TickKitchen_Change()

        TickBack_Change()

        TickFront_Change()

    EndIf 

EndProc


Proc TickPorch_Change()

    If TickPorch = 0 Then

        TftBmpFromMemIndex(TickMenu_Mark_Empty_Porch, 233, 104)

        TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        TickAll = 0

    Else

        TftBmpFromMemIndex(TickMenu_Mark_Check_Porch, 233, 104)

        If (wBitVariable & %0000000011110000) = %11110000 Then

            TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        EndIf

    EndIf 

EndProc


Proc TickKitchen_Change()

    If TickKitchen = 0 Then

        TftBmpFromMemIndex(TickMenu_Mark_Empty_Kitchen, 233, 134)

        TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        TickAll = 0

    Else

        TftBmpFromMemIndex(TickMenu_Mark_Check_Kitchen, 233, 134)

        If (wBitVariable & %0000000011110000) = %11110000 Then

            TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        EndIf

    EndIf 

EndProc


Proc TickBack_Change()

    If TickBack = 0 Then

        TftBmpFromMemIndex(TickMenu_Mark_Empty_Back, 233, 163)

        TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        TickAll = 0

    Else

        TftBmpFromMemIndex(TickMenu_Mark_Check_Back, 233, 163)

        If (wBitVariable & %0000000011110000) = %11110000 Then

            TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        EndIf

    EndIf 

EndProc


Proc TickFront_Change()

    If TickFront = 0 Then

        TftBmpFromMemIndex(TickMenu_Mark_Empty_Front, 233, 194)

        TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        TickAll = 0

    Else

        TftBmpFromMemIndex(TickMenu_Mark_Check_Front, 233, 194)

        If (wBitVariable & %0000000011110000) = %11110000 Then

            TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        EndIf

    EndIf 

EndProc


Proc ButtonUnlock_Change()

    If ButtonUnlock = 0 Then

        ButtonLock = 1 

        TftBmpFromMemIndex(Button_Up_Unlock, 127, 145)

        TftBmpFromMemIndex(Button_Down_Lock, 127, 189)  

        

    Else

        ButtonLock = 0

        TftBmpFromMemIndex(Button_Down_Unlock, 127, 145)

        TftBmpFromMemIndex(Button_Up_Lock, 127, 189)

    EndIf

EndProc


Proc ButtonLock_Change()

    If ButtonLock = 0 Then

        ButtonUnlock = 1 

        TftBmpFromMemIndex(Button_Down_Unlock, 127, 145)

        TftBmpFromMemIndex(Button_Up_Lock, 127, 189)  

    Else

        ButtonUnlock = 0

        TftBmpFromMemIndex(Button_Up_Unlock, 127, 145)

        TftBmpFromMemIndex(Button_Down_Lock, 127, 189)

    EndIf

EndProc


Proc ButtonDoor_Change()

    If ButtonDoor = 0 Then

        TftBmpFromMemIndex(Button_Hide_Set, 233, 12)

        TftBmpFromMemIndex(TickMenu_List_All_Erase, 233, 74)

        TftBmpFromMemIndex(TickMenu_List_Porch_Erase, 233, 104)

        TftBmpFromMemIndex(TickMenu_List_Kitchen_Erase, 233, 134)

        TftBmpFromMemIndex(Button_Hide_Unlock, 127, 145)

        TftBmpFromMemIndex(TickMenu_List_Back_Erase, 233, 163)

        TftBmpFromMemIndex(Tree_TickMenu_Hide, 216, 87)

        TftBmpFromMemIndex(Tree_Button_Door_Hide, 106, 162)

        TftBmpFromMemIndex(Button_Hide_Lock, 127, 189)

        TftBmpFromMemIndex(TickMenu_List_Front_Erase, 233, 194)

        TftBmpFromMemIndex(Button_Up_Door, 17, 189)

        TftBmpFromMemIndex(Message_Clear, 59, 221)

    Else

        TftBmpFromMemIndex(Button_Down_Door, 17, 189)

        TftBmpFromMemIndex(Tree_Button_Door_Show, 106, 162)

        

        If ButtonLock = 0 Then

            TftBmpFromMemIndex(Button_Up_Lock, 127, 189)

        Else

            TftBmpFromMemIndex(Button_Down_Lock, 127, 189)

        EndIf

        

        If ButtonUnlock = 0 Then

            TftBmpFromMemIndex(Button_Up_Unlock, 127, 145)

        Else

            TftBmpFromMemIndex(Button_Down_Unlock, 127, 145)

        EndIf

        

        TftBmpFromMemIndex(Tree_TickMenu_Show, 216, 87)

        

        If TickFront = 0 Then

            TftBmpFromMemIndex(TickMenu_Mark_Empty_Front, 233, 194)

        Else

            TftBmpFromMemIndex(TickMenu_Mark_Check_Front, 233, 194)

        EndIf

        TftBmpFromMemIndex(TickMenu_List_Front, 264, 201)

        

        If TickBack = 0 Then

            TftBmpFromMemIndex(TickMenu_Mark_Empty_Back, 233, 163)

        Else

            TftBmpFromMemIndex(TickMenu_Mark_Check_Back, 233, 163)

        EndIf

        TftBmpFromMemIndex(TickMenu_List_Back, 264, 166)

        

        If TickKitchen = 0 Then

            TftBmpFromMemIndex(TickMenu_Mark_Empty_Kitchen, 233, 134)

        Else

            TftBmpFromMemIndex(TickMenu_Mark_Check_Kitchen, 233, 134)

        EndIf

        TftBmpFromMemIndex(TickMenu_List_Kitchen, 264, 136)

        

        If TickPorch = 0 Then

            TftBmpFromMemIndex(TickMenu_Mark_Empty_Porch, 233, 104)

        Else

            TftBmpFromMemIndex(TickMenu_Mark_Check_Porch, 233, 104)

        EndIf

        TftBmpFromMemIndex(TickMenu_List_Porch, 264, 106)

        

        If TickAll = 0 Then

            TftBmpFromMemIndex(TickMenu_Mark_Empty_All, 233, 74)

        Else

            TftBmpFromMemIndex(TickMenu_Mark_Check_All, 233, 74)

        EndIf

        TftBmpFromMemIndex(TickMenu_List_All, 264, 75)

        

        TftBmpFromMemIndex(Button_Up_Set, 233, 12)

    EndIf     

EndProc 



'Set Fosc    

Proc SetCrystal()

    Clear 

    'Crystal = 16 MHz --> PLLDIV = 68 for 140MHz / PLLDIV = 73 For 150MHz

    CLKDIV = %0000000000000010 'PLLPRE = 2 ; PLLPOST = 0

    PLLFBD.Byte0 = 73 '--> 150MHz Fp

    'Wait for oscillator PLL lock

    While OSCCON.5 = 0 : Wend

    DelayMS 100

EndProc   


Proc SetPins()

    'Set all digital

    ANSELA = 0

    ANSELB = 0

    ANSELC = 0


    'RP55 to SCK2 / RP54 To SDO2 / RPI53 to SDI2

    RPOR5.Byte1 = %00001001     'RP55

    RPOR5.Byte0 = %00001000     'RP54

    RPINR22.Byte0 = %00110101   'SDI2 

    RPINR22.Byte1 = %00110111   'SCK2

        

    SPI2CON1 = 0x033B        '8b / SPRE[2:0] 2:1 / PPRE[1:0] 1:1

    SPI2STAT = 0x8000

    

    SPI1CON1 = 0x033B        '8b / SPRE[2:0] 2:1 / PPRE[1:0] 1:1

    SPI1STAT = 0x8000

EndProc


Config FICD = ICS_PGD1, JTAGEN_OFF

Config FPOR = ALTI2C1_OFF, ALTI2C2_OFF, WDTWIN_WIN25

Config FWDT = FWDTEN_OFF, PLLKEN_ON, WDTPOST_PS16384, WDTPRE_PR128, WINDIS_OFF

Config FOSC = FCKSM_CSECMD, IOL1WAY_OFF, OSCIOFNC_OFF, POSCMD_HS

Config FOSCSEL = FNOSC_PRIPLL, IESO_ON, PWMLOCK_OFF

Config FGS = GCP_OFF, GWRP_OFF 

Created with the Personal Edition of HelpNDoc: Maximize Your CHM Help File Capabilities with HelpNDoc