@.CharSet=CP1251
@GNU AS

.syntax unified     @   
.thumb              @    Thumb
.cpu cortex-m4      @ 
.fpu fpv4-sp-d16    @ 

@
@    spi  ili9341   i2c  ssd1306
@      src\periph\gpio\gpio_b_conf.inc
@
.section .asmcode

@  
.global Start
Start:              @     
                    BL              SYSCLK84_START
                    BL              SYSTICK_START

.INCLUDE       "/src/periph/gpio/rcc_ahb1enr_gpio_set.inc"    @   GPIO
.INCLUDE       "/src/periph/gpio/gpio_b_conf.inc"             @   GPIO_B

                    MOV             R0, 100
                    BL              SYSTICK_DELAY

                    BL              LCD_INIT    @  ILI9341

                    @    
                    MOV             R1, 0x0000        @  : 
                    LDR             R2, =319          @ x_Start=0,  x_End=239
                    MOV             R3, 239           @ y_Start=0,  y_End=319
                    BL              LCD_FILLRECT

                    BL              I2C_INIT @   i2c1

                    @  
                    ADR r4, TEST_TEXT
                    BL LCD_PUTSTR

                    BL I2C_WAIT_RELEASE       @   
                    @     
                    ITE             EQ
                    ADREQ           R4, TEXT_I2C_REL
                    ADRNE           R4, TEXT_I2C_BUSY
                    BL              LCD_PUTSTR

                    @  
                    MOV             R2, 25             @  
                    ADR             R3, ssd1306_init_endtable-ssd1306_init_seq @   

                    @      (START)
                    MOV             R0, 0x78   @   
                    BL              I2C_TARGET_BEGIN
                    BNE             lcd_err
                    ADR             R4, TEXT_I2C_78
                    BL              LCD_PUTSTR

send_loop:          @  
                    MOV             R0, 0x80    @  
                    MOV             R1, 0
                    BL I2C_SEND_BYTE

                    LDRB            R0, [ R3 ], 1     @ 
                    CMP             R2, 1  @     
                    IT              EQ
                    MOVEQ           R1, 1  @ -     STOP
                    BL I2C_SEND_BYTE

                    SUBS            R2, R2, 1
                    BNE             send_loop

                    @     
                    ADR             R4, TEXT_SSD1306_INIT
                    BL              LCD_PUTSTR


                   @       [0,0]
                    MOV             R0, 0x78   @   
                    BL              I2C_TARGET_BEGIN
                    BNE lcd_err

                    MOV             R0, 0x80        @  
                    MOV             R1, 0
                    BL              I2C_SEND_BYTE

                    MOV             R0, 0xB0      @ 
                    BL              I2C_SEND_BYTE

                    MOV             R0, 0x80        @  
                    BL              I2C_SEND_BYTE

                    MOV             R0, 0x00    @ 
                    BL              I2C_SEND_BYTE

                    MOV             R0, 0x80        @  
                    BL              I2C_SEND_BYTE

                    MOV             R0, 0x10        @ 
                    BL              I2C_SEND_BYTE


                    @   
                    MOV             R2, 64
send_loop1:         @   
                    MOV             R0, 0x40    @  
                    MOV             R1, 0
                    BL              I2C_SEND_BYTE


                    MOV             R0, R2    @  
                    CMP             R2, 1   @    
                    IT             EQ
                    MOVEQ           R1, 1   @   STOP
                    BL              I2C_SEND_BYTE

                    SUBS            R2, R2, 1
                    BNE             send_loop1

                    @     
                    ADR             R4, TEXT_SSD1306_TEST
                    BL              LCD_PUTSTR

MAIN_LOOP:          B    MAIN_LOOP

lcd_err:
                    ADR           R4, TEXT_I2C_err  @   
                    BL              LCD_PUTSTR
                    B               MAIN_LOOP


.align 1
                    @128x64
 ssd1306_init_seq:
                    .BYTE           0xAE    @  

                    .BYTE           0xD5    @    
                    .BYTE           0x80
                                  @    +-----  0-F/ 0 -   1
                                  @   +------  .   0x80

                    .BYTE           0x81    @   
                    .BYTE           0xFF    @ 0x8F..0xCF

                    .BYTE           0xD9    @   DC/DC 
                    .BYTE           0xF1    @ 0x22 - VCC   / 0xF1  

                    .BYTE           0xDB    @   VcomH
                    .BYTE           0x40    @     0x00..0x70

                    .BYTE           0x8D    @   
                    .BYTE           0x14    @ 0x10 -  ( VCC   ) 0x14 -   DC / DC

                    @ ---------

                    .BYTE           0xA8    @  multiplex ratio
                    .BYTE           0x3F    @ 1/64 duty (  ), 0x1F - 128x32, 0x3F - 128x64

                    .BYTE           0xD3    @   ( offset )
                    .BYTE           0x00    @  

                    .BYTE           0xDC
                    .BYTE           0x00

                    .BYTE           0x21    @   
                                            @ 0  
                                            @ 1  

                    .BYTE           0xA0    @     ( X)
                                            @ A1 -   (/)
                                            @ A0 -  (/)

                    .BYTE           0xC0   @    
                                            @    
                                            @ 0 - / (   )
                                            @ 8 - / (   )

                    .BYTE           0xDA    @   COM
                    .BYTE           0x12    @ 0x02 - 128x32, 0x12 - 128x64

                    .BYTE           0xA5    @  

                    .BYTE           0xA6    @ 0xA6 -  , 0xA7 -  

                    .BYTE           0xAF    @   
ssd1306_init_endtable:
                    .byte 0



@ 128x32
@ssd1306_init_seq:
                    .BYTE           0xAE    @ display OFF
                    .BYTE           0xD5    @
                    .BYTE           0x80    @ 00b,Horizontal Addressing Mode; 01b,Vertical Addressing Mode;

                    .BYTE           0xA8    @ Set Page Start Address for Page Addressing Mode,0-7
                    .BYTE           0x1F    @ Mirror vertically  1F

                    .BYTE           0xD3    @ set low column address
                    .BYTE           0x00    @ set high column address

                    .BYTE           0x40    @ set start line address - CHECK

                    .BYTE           0x8D    @ set contrast
                    .BYTE           0x14    @ Mirror horizontally

                    .BYTE           0x20    @ set inverse color
                    .BYTE           0x00    @ set multiplex ratio(1 to 64) - CHECK

                    .BYTE           0xA1    @

                    .BYTE           0xC8    @

                    .BYTE           0xDA    @
                    .BYTE           0x02    @ 02

                    .BYTE           0x81    @
                    .BYTE           0xFF    @

                    .BYTE           0xD9    @
                    .BYTE           0xF1    @

                    .BYTE           0xDB    @
                    .BYTE           0x40    @

                    .BYTE           0xA4    @
                    .BYTE           0xA6    @
                    .BYTE           0xAF    @
@ssd1306_init_endtable:
                    .byte 0




TEST_TEXT:          .BYTE           0x01
                    .SHORT          10    @ Y
                    .SHORT          35    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          "  i2c"

TEXT_I2C_REL:       .BYTE           0x01
                    .SHORT          30    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          " "

TEXT_I2C_BUSY:      .BYTE           0x01
                    .SHORT          30    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          " "

TEXT_I2C_err:       .BYTE           0x01
                    .SHORT          50    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          "  "

TEXT_I2C_78:        .BYTE           0x01
                    .SHORT          50    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          " "

TEXT_SSD1306_INIT:  .BYTE           0x01
                    .SHORT          70    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          " SSD1306 "

TEXT_SSD1306_TEST:  .BYTE           0x01
                    .SHORT          90    @ Y
                    .SHORT          10    @ X
                    .WORD           0xFFFF0000    @ Color
                    .ASCIZ          "  "


