搜索
bottom↓
回复: 22

进来看看谢谢!!! 求这款OLED屏的程序,谢谢各位---含资料

[复制链接]

出0入0汤圆

发表于 2010-2-3 15:01:33 | 显示全部楼层 |阅读模式
大家好,帮忙赶一个程序,谢谢各位最好是C语言的,汇编的勉强亦可以
最近要做一个视力表,用高亮的OLED屏做,屏幕是这个样字的
用什么控制比较好呢,现在用的是STC12C5A60S2的,但是仅靠内部Flash仅存4张图片,想想办法,谢谢



(原文件名:截图04.jpg)
资料如下:
点击此处下载 ourdev_532127.pdf(文件大小:616K) (原文件点击此处下载 ourdev_532131.pdf(文件大小:1.60M) <font color=green>(原文件名:HX5116-A_DS_preliminary_v03_070703_A.pdf)名:Application_Note_for_AM_3.4_and_4.3_V1.4_20080528.pdf)</font>

尺寸如下:

(原文件名:截图05.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-2-3 15:16:07 | 显示全部楼层
拜托大家乐

出0入0汤圆

发表于 2010-2-3 15:33:32 | 显示全部楼层
资料看不见,不过看参数和TFT相似.但参数不太一样

出0入0汤圆

 楼主| 发表于 2010-2-3 15:42:06 | 显示全部楼层
回复【2楼】Oliver 老易

这里有个用汇编写的,目前为止只让他显示两种颜色
问题是:闪的厉害

-----------------------------------------------------------------------

;适用于STC12C5A60S2,24M晶振
;P0口为红色输入端
;P1口为绿色输入端
;P2口为蓝色输入端
;P3口为时序控制端
DCLK    BIT     P3.0
HSYNC   BIT     P3.1
VSYNC   BIT     P3.2
DE      BIT     P3.3
SDA     BIT     P3.4
SCL     BIT     P3.5
NCS     BIT     P3.6
NRESET  BIT     P3.7
KEY1        BIT     P2.0
KEY2        BIT     P2.1
KEY3        BIT     P2.2
KEY4        BIT     P2.3
KEY5        BIT     P2.4
KEY6        BIT     P2.5
KEY7        BIT     P2.6
KEY8        BIT     P2.7
        ORG     0000H
        AJMP    MAIN
        ORG     0100H
MAIN:   CLR     KEY5
                CLR     KEY6
                CLR     KEY7
                CLR     KEY8
               
                MOV     P0,#00H         ;125nS
        MOV     P1,#00H         ;125nS
        
        MOV     P3,#0FFH        ;125nS
        MOV     R0,#00H         ;地址寄存器
        MOV     R1,#00H         ;数据寄存器
        MOV     R2,#00H
        MOV     R3,#00H
        MOV     R4,#00H
        MOV     R5,#00H         ;计数器
        MOV     R6,#00H         ;计数器
        MOV     R7,#00H         ;计数器
        CLR     NRESET
        ACALL   DEL100uS
        SETB    NRESET
        ACALL   DEL100uS
        MOV     R0,#04H         ;地址,设定分辨率
        MOV     R1,#23H         ;数据,设定分辨率
        ACALL   SPI
        MOV     R0,#05H         ;地址
        MOV     R1,#82H         ;数据
        ACALL   SPI
        MOV     R0,#07H         ;地址
        MOV     R1,#0FH         ;数据
        ACALL   SPI
        MOV     R0,#34H         ;地址   ;T3=10Tcph
        MOV     R1,#18H         ;数据18
        ACALL   SPI
        MOV     R0,#35H         ;地址   ;T4=25Tcph
        MOV     R1,#28H         ;数据28
        ACALL   SPI
        MOV     R0,#36H         ;地址   ;Tf=1Tcph
        MOV     R1,#16H         ;数据16
        ACALL   SPI
        MOV     R0,#37H         ;地址   ;Tb=3Tcph
        MOV     R1,#01H         ;数据01
        ACALL   SPI

        MOV     R0,#02H         ;地址
        MOV     R1,#02H         ;数据
        ACALL   SPI
        MOV     R0,#0AH         ;地址
        MOV     R1,#0BBH         ;数据
        ACALL   SPI
        MOV     R0,#09H         ;地址
        MOV     R1,#24H         ;数据
        ACALL   SPI

        ;以下是灰度设置
        MOV     R0,#10H         ;地址
        MOV     R1,#7AH         ;数据
        ACALL   SPI
        MOV     R0,#11H         ;地址
        MOV     R1,#7DH         ;数据
        ACALL   SPI
        MOV     R0,#12H         ;地址
        MOV     R1,#7AH         ;数据
        ACALL   SPI
        MOV     R0,#13H         ;地址
        MOV     R1,#00H         ;数据
        ACALL   SPI
        MOV     R0,#14H         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#15H         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#16H         ;地址
        MOV     R1,#03H         ;数据
        ACALL   SPI
        MOV     R0,#17H         ;地址
        MOV     R1,#02H         ;数据
        ACALL   SPI
        MOV     R0,#18H         ;地址
        MOV     R1,#03H         ;数据
        ACALL   SPI
        MOV     R0,#19H         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#1AH         ;地址
        MOV     R1,#0AH         ;数据
        ACALL   SPI
        MOV     R0,#1BH         ;地址
        MOV     R1,#00H         ;数据
        ACALL   SPI
        MOV     R0,#1CH         ;地址
        MOV     R1,#07H         ;数据
        ACALL   SPI
        MOV     R0,#1DH         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#1EH         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#1FH         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#20H         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#21H         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#22H         ;地址
        MOV     R1,#0BH         ;数据
        ACALL   SPI
        MOV     R0,#23H         ;地址
        MOV     R1,#00H         ;数据
        ACALL   SPI
        MOV     R0,#24H         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#25H         ;地址
        MOV     R1,#07H         ;数据
        ACALL   SPI
        MOV     R0,#26H         ;地址
        MOV     R1,#05H         ;数据
        ACALL   SPI
        MOV     R0,#27H         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#28H         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#29H         ;地址
        MOV     R1,#04H         ;数据
        ACALL   SPI
        MOV     R0,#2AH         ;地址
        MOV     R1,#09H         ;数据
        ACALL   SPI
        ;以上是灰度设置
        MOV     R0,#06H         ;地址,设置为正常模式
        MOV     R1,#03H         ;数据,设置为正常模式
        ACALL   SPI
            ///*
         
LOOPA: JNB KEY1,K1
       JNB KEY2,K2
           JNB KEY3,K3
           JNB KEY4,K4
           AJMP LOOPA
K1:
     NOP
         NOP
         NOP
         NOP
         NOP
         JNB KEY1,$

         AJMP MAINAB
         AJMP LOOPA
K2:
     NOP
         NOP
         NOP
         NOP
         NOP
         JNB KEY2,$
         AJMP MAIN12
         AJMP LOOPA
K3:
     NOP
         NOP
         NOP
         NOP
         NOP
         JNB KEY2,$
         AJMP MAIN1B
         AJMP LOOPA
K4:
     NOP
         NOP
         NOP
         NOP
         NOP
         JNB KEY2,$
         AJMP MAINA2
         AJMP LOOPA        //*/       
                               
MAIN12:        MOV     55H,#10H
MAIN1:  MOV     56H,#1H
JS1:    MOV     57H,#1H               
JS2:        MOV     DPTR,#FFF
        CLR     VSYNC
MAIN2:  INC     R6                                                                                                                      //调用TH
        ACALL   TH                                  //调用三次  main2
        CJNE    R6,#03H,MAIN2                                                                        //R6等于3
        SETB    VSYNC
MAIN3:  INC     R6
        ACALL   TH                                //     调用th                                                                   //调用TH
        CJNE    R6,#14H,MAIN3   //14=20   上面有个3        ------17     R6等于20
        MOV     40H,#11H                //17
MAIN4:  MOV     41H,#10H                //16
MAIN5:  ACALL   RGB                                //调用RGB                                                                                                        272次//调用RGB
        DJNZ    41H,MAIN5                //16
        DJNZ    40H,MAIN4                //17
MAIN6:  INC     R6                                //
        ACALL   TH                                //                                                                                           //调用TH
        CJNE    R6,#1EH,MAIN6   //30                                                           R6等于30
        MOV     R6,#00H                        //
                DJNZ    57H,JS2
                DJNZ    56H,JS1
                DJNZ    55H,MAIN1
        //        RET//ACALL   LOOPA
        AJMP    LOOPA                       

MAINAB:        MOV     55H,#10H
MAINA:  MOV     56H,#1H
JSA:    MOV     57H,#1H               
JSB:        MOV     DPTR,#GGG
        CLR     VSYNC
MAINB:  INC     R6                                                                                                                      //调用TH
        ACALL   TH                                  //调用三次  main2
        CJNE    R6,#03H,MAINB                                                                        //R6等于3
        SETB    VSYNC
MAINC:  INC     R6
        ACALL   TH                                //     调用th                                                                   //调用TH
        CJNE    R6,#14H,MAINC   //14=20   上面有个3        ------17     R6等于20
        MOV     40H,#11H                //17
MAIND:  MOV     41H,#10H                //16
MAINE:  ACALL   RGB                                //调用RGB                                                                                                        272次//调用RGB
        DJNZ    41H,MAINE                //16
        DJNZ    40H,MAIND                //17
MAINF:  INC     R6                                //
        ACALL   TH                                //                                                                                           //调用TH
        CJNE    R6,#1EH,MAINF   //30                                                           R6等于30
        MOV     R6,#00H                        //
                DJNZ    57H,JSB
                DJNZ    56H,JSA
                DJNZ    55H,MAINA
//        RET        ACALL   LOOPA
        AJMP    LOOPA       

//----------------------------------------------------------------------------------------

MAIN1B:        MOV     55H,#10H
MAIN11:  MOV     56H,#1H
JS11:    MOV     57H,#1H               
JS21:        MOV     DPTR,#DDD
        CLR     VSYNC
MAIN21:  INC     R6                                                                                                                      //调用TH
        ACALL   TH                                  //调用三次  main2
        CJNE    R6,#03H,MAIN21                                                                        //R6等于3
        SETB    VSYNC
MAIN31:  INC     R6
        ACALL   TH                                //     调用th                                                                   //调用TH
        CJNE    R6,#14H,MAIN31   //14=20   上面有个3        ------17     R6等于20
        MOV     40H,#11H                //17
MAIN41:  MOV     41H,#10H                //16
MAIN51:  ACALL   RGB                                //调用RGB                                                                                                        272次//调用RGB
        DJNZ    41H,MAIN51                //16
        DJNZ    40H,MAIN41                //17
MAIN61:  INC     R6                                //
        ACALL   TH                                //                                                                                           //调用TH
        CJNE    R6,#1EH,MAIN61   //30                                                           R6等于30
        MOV     R6,#00H                        //
                DJNZ    57H,JS21
                DJNZ    56H,JS11
                DJNZ    55H,MAIN1B
        //        RET//ACALL   LOOPA
        AJMP    LOOPA

//------------------------------------------------------------------------------------------------
MAINA2:        MOV     55H,#10H
MAIN121:  MOV     56H,#1H
JS12:    MOV     57H,#1H               
JS22:        MOV     DPTR,#HHH
        CLR     VSYNC
MAIN22:  INC     R6                                                                                                                      //调用TH
        ACALL   TH                                  //调用三次  main2
        CJNE    R6,#03H,MAIN22                                                                        //R6等于3
        SETB    VSYNC
MAIN32:  INC     R6
        ACALL   TH                                //     调用th                                                                   //调用TH
        CJNE    R6,#14H,MAIN32   //14=20   上面有个3        ------17     R6等于20
        MOV     40H,#11H                //17
MAIN42:  MOV     41H,#10H                //16
MAIN52:  ACALL   RGB                                //调用RGB                                                                                                        272次//调用RGB
        DJNZ    41H,MAIN52                //16
        DJNZ    40H,MAIN42                //17
MAIN62:  INC     R6                                //
        ACALL   TH                                //                                                                                           //调用TH
        CJNE    R6,#1EH,MAIN62   //30                                                           R6等于30
        MOV     R6,#00H                        //
                DJNZ    57H,JS22
                DJNZ    56H,JS12
                DJNZ    55H,MAIN121
        //        RET//ACALL   LOOPA
        AJMP    LOOPA


///-----------------------------------------------------------------------------------------------




SPI:    MOV     A,R0            ;传输地址
        CLR     C               ;写操作
        RLC     A
        CLR     NCS
        MOV     R7,#08H
SPI1:   RLC     A
        MOV     SDA,C
        CLR     SCL
        NOP
        SETB    SCL             ;SCL上升沿写入数据
        DJNZ    R7,SPI1
        MOV     R7,#08H
        MOV     A,R1            ;传输数据
SPI2:   RLC     A
        MOV     SDA,C
        CLR     SCL
        NOP
        SETB    SCL
        DJNZ    R7,SPI2
        SETB    NCS
        ACALL   DEL376nS        ;250nS
        RET                     ;167nS

                                                       
//DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
//DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
//DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H
//DB   000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H //---------60

RGB:                            ;一个行扫描,输入480个RGB图象数据
        MOV     R7,#1EH         ;前30个Tcph
        CLR     HSYNC
RGB_30: CLR     DCLK
        SETB    DCLK
        DJNZ    R7,RGB_30       ;30个Tcph   //有循环
        MOV     R7,#48
        SETB    HSYNC
RGB_72: CLR     DCLK
        SETB    DCLK            ;72个Tcph   //有循环
        DJNZ    R7,RGB_72
        MOV     R7,#0F0H
        SETB    DE

RGB_480:MOV     42H,#3CH           //60
LOOP2:  MOV     A,#00H
        MOVC    A,@A+DPTR
        MOV     43H,#08H
LOOP1:  CLR     DCLK
        RLC     A
        JC      H_HIGH                                                // 为1时跳转
            MOV     P0,#0FFH        ;红色                                                                 //白色
            MOV     P1,#0FFH        ;绿色
           // MOV     P2,#0FFH        ;蓝色
            SJMP    L_LOW       
H_HIGH: MOV     P0,#00H        ;红色                                                                 //黑色
        MOV     P1,#00H        ;绿色
        //MOV     P2,#00H        ;蓝色
L_LOW:  SETB    DCLK            ;480个Tcph
        DJNZ    43H,LOOP1                                             //08         
        INC     DPTR
        DJNZ    42H,LOOP2                                             //有循环  60ci
                                                                                         
        MOV     R7,#5AH
        CLR     DE
RGB_90: CLR     DCLK
        SETB    DCLK            ;90个Tcph
        DJNZ    R7,RGB_90
        RET

TH:     CLR     DE              ;一个HSYNC周期,期间DE为低电平
        MOV     R7,#1EH         ;前30个Tcph
        CLR     HSYNC
TH_30:  CLR     DCLK
        SETB    DCLK
        DJNZ    R7,TH_30        ;30个Tcph                                                                 //有循环
        MOV     R7,#48
        SETB    HSYNC
TH_72:  CLR     DCLK
        SETB    DCLK            ;72个Tcph                                                                 //有循环
        DJNZ    R7,TH_72
        MOV     R7,#0EEH
TH_238: CLR     DCLK
        SETB    DCLK            ;480个Tcph
        DJNZ    R7,TH_238                                                                                                 //有循环
        MOV     R7,#0F2H
TH_242: CLR     DCLK
        SETB    DCLK            ;480个Tcph
        DJNZ    R7,TH_242                                                                                                 //有循环
        MOV     R7,#5AH
TH_90:  CLR     DCLK
        SETB    DCLK            ;90个Tcph
        DJNZ    R7,TH_90                                                                                                 //有循环
        RET


DEL376nS:MOV 30H,#01H           ;125nS
         NOP                    ;42nS
         NOP                    ;42nS
         RET                    ;167nS

DEL100uS:MOV 31H,#64H
DEL100_1:MOV 30H,#04H           ;125nS
         NOP
         DJNZ 30H,$             ;208nS
         DJNZ 31H,DEL100_1      ;208nS
         RET

GGG:

出0入0汤圆

发表于 2010-2-3 15:52:00 | 显示全部楼层
好好看数据手册。(解决主要依靠自己,呵呵)
其实OLED和普通的LCD一样。
数据D0~D7,CS,RD,WR,RES等等。

出0入0汤圆

发表于 2010-2-3 15:53:16 | 显示全部楼层
FLASH不够,只能外扩了。

出0入0汤圆

 楼主| 发表于 2010-2-3 16:05:00 | 显示全部楼层
回复【7楼】Excellence 精益求精
-----------------------------------------------------------------------

谢谢,但是它的三种颜色怎样传送的,有个例子没有,我看一下,谢谢

出0入0汤圆

 楼主| 发表于 2010-2-3 16:06:40 | 显示全部楼层
回复【7楼】Excellence 精益求精
-----------------------------------------------------------------------

我的QQ:850118301

出0入0汤圆

发表于 2010-2-3 16:09:31 | 显示全部楼层
我说说,不对请指正,因为我没用过这个OLED。我用过16色和单色的。
1,是不是用image2lcd取个图片。这个软件可以取彩色的。
2,是不是OLED初始化时,应该设置它,能显示三色,有的初始化成单色就只能显示单色。

出0入0汤圆

 楼主| 发表于 2010-2-3 16:15:21 | 显示全部楼层
回复【10楼】Excellence 精益求精
-----------------------------------------------------------------------

我试一下这个软件,呵呵,谢谢,不行的话再说啊

出0入0汤圆

 楼主| 发表于 2010-2-3 16:17:06 | 显示全部楼层
回复【10楼】Excellence 精益求精
-----------------------------------------------------------------------

能把你写过的那个16色和单色的程序发一份给我吗,谢谢,邮箱:sunjie718@126.com         QQ:850118301

出0入0汤圆

发表于 2010-2-3 18:48:52 | 显示全部楼层
应该是RGB口吧?再快的MCU跑RGB也够呛

出0入0汤圆

发表于 2010-2-3 20:46:03 | 显示全部楼层
我用过奇晶的2.4寸OLED,用AT91SAM7S64可SPI接口来驱动的,程序写得比较乱,凑合着用,程序是16BIT色的



(原文件名:Snap1.jpg)


(原文件名:C0240QGLA-T.JPG)



//*----------------------------------------------------------------------------
//* AT91SAM7 OLED
//*
//*
//* - simply say "hello world" on the OLED


#include "AT91SAM7S64.h"
#include "lib_AT91SAM7S64.h"

// choice the hardware spi

#define EXT_OC          18432000           // Exetrnal ocilator MAINCK
#define MCK             47923200           // MCK (PLLRC div by 2)
#define MCKKHz          (MCK/1000)
#define SPEED                         (MCKKHz/100)


/* General IO */



//#define DATA        AT91C_PIO_PA13
//#define SPCK        AT91C_PIO_PA14

//#define OLED_SPIEN   (1<<0)
//#define OLED_SPISCK  (1<<1)
//#define OLED_SPISDA  (1<<2)
#define OLED_SPIEN   (1<<30)
//#define OLED_SPB          (1<<3)
#define OLED_POWER1  (1<<4)
#define OLED_POWER2  (1<<5)


#define CMD        0x70
#define DAT 0x72

/* SPI NPCS IO */

#define NPCS_NIC                        AT91C_PA11_NPCS0        // (A) NPCS0
#define NPCS_EXT_FLASH                AT91C_PA31_NPCS1        // (A) NPCS1
#define NPCS_SD                                AT91C_PA10_NPCS2        // (B) NPCS2
#define NPCS_OLED                        AT91C_PA22_NPCS3        // (B) NPCS3
#define Set_SPIEN_Low  *AT91C_PIOA_CODR = OLED_SPIEN
#define Set_SPIEN_High *AT91C_PIOA_SODR = OLED_SPIEN

/* SPI PCS_Device */
#define PCS_NIC                        0
#define PCS_EXT_FLASH        1
#define PCS_SD                        2
#define PCS_OLED                3

#define SPI_NSCKDIV                7        // SPICK = MCK/16
#define SPI_LSCKDIV                200 // SPICK = MCK/200 for SD/MMC Initialization
#define GUI_BLACK         0x0000    //白
#define GUI_BLUE          0x001F    //蓝
#define GUI_GREEN         0x07E0    //绿
#define GUI_CYAN          0x07ff        //蓝绿色,青色
#define GUI_RED           0xF800        //红色
#define GUI_MAGENTA       0x8b008b        //红紫色, 洋红         
#define GUI_BROWN         0x2a2aa5
#define GUI_DARKGRAY      0x404040
#define GUI_GRAY          0x808080
#define GUI_LIGHTGRAY     0xd3d3d3
#define GUI_LIGHTBLUE     0xff8080
#define GUI_LIGHTGREEN    0x80ff80
#define GUI_LIGHTCYAN     0x80ffff
#define GUI_LIGHTRED      0x8080ff
#define GUI_LIGHTMAGENTA  0xff80ff
#define GUI_YELLOW        0xFFE0
#define GUI_WHITE         0xFFFF
/* Global variables */


void DelayMs(unsigned int n)//延时函数
{
        unsigned int i;

        for(i=0;i<4000*n;i++)
        {
        ;
        }
}

void Reset_SPI_Devices(void)
{

        // on the LED0


//        AT91F_PIO_SetOutput(AT91C_BASE_PIOA, RES);
        AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, OLED_POWER1|OLED_POWER2);
        DelayMs(1000);
        //AT91F_PIO_SetOutput(AT91C_BASE_PIOA, OLED_POWER1|OLED_POWER2|OLED_SPB);

         AT91F_PIO_SetOutput(AT91C_BASE_PIOA, OLED_POWER1|OLED_POWER2);
        // Off the LED0

        Set_SPIEN_High;       
       
}

//unsigned
void send_Byte_SPI(unsigned char data)
{
       
                AT91PS_SPI pSPI = AT91C_BASE_SPI;
                // wait for transmit completion/ready
                // while((pSPI->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
        //        while (!(pSPI->SPI_SR & AT91C_SPI_TDRE));
//        pSPI->SPI_TDR = data;       
        pSPI->SPI_TDR = data|(0x07 << 16);
//        while (!(pSPI->SPI_SR & AT91C_SPI_TDRE));
        while(!(pSPI->SPI_SR & AT91C_SPI_TXEMPTY));               
        //        while (!(pSPI->SPI_SR & AT91C_SPI_RDRF));
               
//                return pSPI->SPI_RDR;
               

}

void Write_Command(unsigned int com)
{
           Set_SPIEN_Low;
        send_Byte_SPI(CMD);
        send_Byte_SPI(com>>8);
        send_Byte_SPI(com);
        Set_SPIEN_High;
}


void Write_Data(unsigned int data)
{
         Set_SPIEN_Low;
        send_Byte_SPI(DAT);
        send_Byte_SPI(data>>8);
        send_Byte_SPI(data);
                        Set_SPIEN_High;

}
void Write_Register(unsigned int wAddr, unsigned int wData)
{
        Write_Command(wAddr);
        Write_Data(wData);       
}


void Oled_CLear(unsigned int gui_color)
{

    unsigned int m,n;

//   Write_Register(0x0005,0x0000);
    for(m=0;m<320;m++)
        {
                for(n=0;n<240;n++)
                {
               
                        Write_Data(gui_color);
                        //DelayMs(1);
                       
                }                         
        }       
}
void OLED_Draw_bmp(const unsigned char *bmp)
{    unsigned int m,n;

         unsigned int k;
        for(m=0;m<130;m++)
        {
                for(n=0;n<240;n++)
                {
                        k= *bmp<<8;
                        bmp++;
                        k+=        *bmp;
                        bmp++;
                        Write_Data(k);
                        //DelayMs(0);       
                }
        }
}

void Init_Oled(void)
{
       
   Write_Register(0x0005,0x0000);                   //Display  Control1    0-off,1-on
        //===========Gamma Setting ===============//
        Write_Register(0x0070, 0x2400);       
        Write_Register(0x0071, 0x2800);       
        Write_Register(0x0072, 0x2f80);       
        Write_Register(0x0073, 0x1511);       
        Write_Register(0x0074, 0x1c05);       
        Write_Register(0x0075, 0x1a15);
        Write_Register(0x0076, 0x1a14);       
        Write_Register(0x0077, 0x1c18);       
        Write_Register(0x0078, 0x2213);                 
        //gamma setting over here
/*         Write_Register(0x0070, 0x1080);       
        Write_Register(0x0071, 0x1480);       
        Write_Register(0x0072, 0x1b00);       
        Write_Register(0x0073, 0x1010);       
        Write_Register(0x0074, 0x1e12);       
        Write_Register(0x0075, 0x1f14);
        Write_Register(0x0076, 0x1a17);       
        Write_Register(0x0077, 0x1b17);       
        Write_Register(0x0078, 0x2317);                */
        //ENTRY MODE

                 
           Write_Register(0x0018,0x0028);//Oscillator Control
        Write_Register(0x0004,0x0003);//Clock Control
        Write_Register(0x0002,0x2228);//RGB Interface Control

        Write_Register(0x0010,0x0000);//Panel IF Control4
        Write_Register(0x0005,0x0001);//Display  Control1    0-off,1-on
        Write_Register(0x0013,0x1400);//Power Gen2
         Write_Register(0x0003,0x0020);

        //         Write_Register(0x0003,0x0001);//
                  
          //Write_Register(0x0033,40);// PARTIAL SCREEN DRIVING POSITION-start
         //Write_Register(0x0034,100);// PARTIAL SCREEN DRIVING POSITION-end

        //            Write_Register(0x0035,50);        //VERTICAL RAM ADDRESS POSITION-start
//         Write_Register(0x0036,61);                // VERTICAL RAM ADDRESS POSITION-end
//         Write_Register(0x0037,0x3050);// HORIZONTAL RAM ADDRESS POSITION-start end
        //        Write_Register(0x0020,0x0000);//
//        Write_Register(0x0021,0x0000);//                    

//         Write_Register(0x0020,0);        //GRAM ADDRESS SET-L-8BIT
//         Write_Register(0x0021,10);                // GRAM ADDRESS SET-H-8BIT
       
//        Write_Register(0x0035,0);//Vertical RAM Address Position (start)
//          Write_Register(0x0036,319);

         Write_Register(0x0020,0X00EF);        //GRAM ADDRESS SET-L-8BIT
         Write_Register(0x0021,0X0000);               
        //Write_Register(0x0037,0xEF00);
        //SPI_Write_Register(0x0036,319);//Vertical RAM Address Position (end)
        Write_Command(0x0022);//GRAM Write        /Read  
//       
       
        Oled_CLear(GUI_BLACK);
//   Write_Register(0x0030,10);        //GRAM ADDRESS SET-L-8BIT
//         Write_Register(0x0031,70);                // GRAM ADDRESS SET-H-8BIT
/*
         Write_Register(0x0020,10);        //GRAM ADDRESS SET-L-8BIT
         Write_Register(0x0021,10);                // GRAM ADDRESS SET-H-8BIT
        Write_Command(0x0022);//GRAM Write        /Read  
        Write_Data(GUI_WHITE);       
//        Write_Command(0);
                 Write_Data(GUI_WHITE);       
                    Write_Register(0x0020,20);        //GRAM ADDRESS SET-L-8BIT
         Write_Register(0x0021,20);                // GRAM ADDRESS SET-H-8BIT
//        Write_Command(0x0022);//GRAM Write        /Read  
        Write_Data(GUI_WHITE);                */
}





/* ------ LCD5110 Driver End ------ */



int main(void)
{
//         unsigned  char n;
//         n=0;
        // Enable User reset
        AT91F_RSTSetMode(AT91C_BASE_RSTC, AT91C_RSTC_URSTEN);
       
                // enable the clock of the PIO and SPI
                AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, (1 << AT91C_ID_PIOA) | (1 << AT91C_ID_SPI));
               
                // then, we configure the PIO Lines corresponding to LEDs, RES, DC
                // to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
                AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OLED_SPIEN|OLED_POWER1|OLED_POWER2);
               
                // setup PIO pins for SPI bus
                AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA13_MOSI | AT91C_PA14_SPCK | NPCS_NIC | NPCS_EXT_FLASH,
                                                        NPCS_SD | NPCS_OLED);
                AT91F_PIO_CfgPullup(AT91C_BASE_PIOA, AT91C_PA13_MOSI | AT91C_PA14_SPCK | NPCS_NIC | NPCS_EXT_FLASH|
                                                        NPCS_SD | NPCS_OLED);

                // Init SPI
                AT91F_SPI_Reset(AT91C_BASE_SPI);
                AT91F_SPI_Enable(AT91C_BASE_SPI);
               
                // set master mode with:
                //        - SPI master
                //        - no mode fault
                //        - variable peripheral chip select
                AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MODFDIS | AT91C_SPI_PS_VARIABLE | AT91C_SPI_MSTR);
                   //AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MODFDIS  | AT91C_SPI_MSTR);

                // setup OLED PCS
                AT91F_SPI_CfgCs(AT91C_BASE_SPI, PCS_OLED, AT91C_SPI_CPOL | AT91C_SPI_BITS_8  | (SPI_NSCKDIV << 8));
       

               

        // off all LEDs
       
        // reset the devices which are connected to the SPI Bus
        Reset_SPI_Devices();
//send_Byte_SPI(0x000);
        // Init LCD
   Init_Oled();
//         OLED_Draw_bmp(gImage_123);
       
        while(1) {       
//                                  AT91PS_SPI pSPI = AT91C_BASE_SPI;
                // wait for transmit completion/ready
         
                                /*n+=10;
                                DelayMs(1000);
                                Write_Register(0x0032,n);                // GRAM ADDRESS SET-H-8BIT
                                n-=10;
                                DelayMs(1000);
                                Write_Register(0x0032,n);                // GRAM ADDRESS SET-H-8BIT
                                */
                Oled_CLear(GUI_WHITE);
                        Oled_CLear(GUI_RED);
                                Oled_CLear(GUI_GREEN);
                                        Oled_CLear(GUI_BLUE);
         //write_Command(0x21);
               
                // flash the LED to indicate that I am living :-)


        }       

}

出0入0汤圆

发表于 2010-2-3 20:49:24 | 显示全部楼层
要显示大图片的话,必须外扩FLASH,

出0入0汤圆

发表于 2010-2-3 20:59:07 | 显示全部楼层
楼主干嘛,发个重复的贴子,你这样不仅浪费网站的资源,还浪费了广大网友的时间


(原文件名:Snap1.jpg)

出0入0汤圆

发表于 2010-2-4 10:28:10 | 显示全部楼层
void wr_command(uchar data com) //写命令(0-128 行)子程序
{
        EA = 0;
        D_C = 0;                          // D_C=0,数据送至指令寄存器
          CS1_LOW;       //Chip select
        _nop_();               
        _nop_();  
        P0 = com;
        _nop_();                                                                 //用此NOP代替读状态
        _nop_();                                                                 //用此NOP代替读状态
              
        r_w = 0;
        _nop_();
        _nop_();
        r_w = 1;
        _nop_();
        _nop_();
        CS1_HIGH;       //Chip select
        _nop_();
        _nop_();
    EA=1;
}

/*..........................*/
void wr_data(uchar data dat) //写数据(65-128 行)子程序
{
        EA=0;
        D_C = 1;       //D_C=1,数据送至RAM
        CS1_LOW;       //Chip select
        _nop_();
        _nop_();
        P0 = dat;
        _nop_();                                                               //用此NOP代替读状态
        _nop_();                                                               //用此NOP代替读状态

        r_w = 0;
        _nop_();
        _nop_();
        r_w = 1;
        _nop_();
        _nop_();
        CS1_HIGH;       //Chip select
        _nop_();
        _nop_();
    EA=1;
}
/******************************************************************************************/
//         OLED清屏模块
/******************************************************************************************/
void clear_prog()
{
        uchar i,j;
        for(i=0;i<8;i++)
        {
                wr_command(0xb0+i);         //页面地址设置
                wr_command(0x0);   //列地址设置
                wr_command(0x10);  //列地址设置
                for(  j=0; j<128; j++)
                {                                 //RAM清"0"
                        wr_data(0x0);
                }
        }
}

出0入0汤圆

发表于 2010-2-4 10:28:46 | 显示全部楼层
//OLED显示相关
//sbit csa =P3^4;        
//sbit csb =P3^5;        
sbit r_w =P1^4;        
sbit D_C =P1^5;                
sbit en =P1^2;

出0入0汤圆

发表于 2010-2-4 10:29:30 | 显示全部楼层
//****************************************************************************************
//*以下是OLED屏测试函数*
//****************************************************************************************
//****************************************************************************************
void ExBusInit(void)    //初始化P09702OLED显示屏总线
{   
        uint32 temp;
        uint32 i;

    PINSEL1 &= ~(3<<(2 * (DC_PIN_NUM-16)));  
    PINSEL1 &= ~(3<<(2 * (WR_PIN_NUM-16)));
    PINSEL1 &= ~(3<<(2 * (RD_PIN_NUM-16)));
    PINSEL1 &= ~(3<<(2 * (CS_PIN_NUM-16)));//
        PINSEL1 &= ~((unsigned int)3<<(2 * (RES_PIN_NUM-16)));//
       
// 设置引脚方向,所有相关引脚为输出
    temp = 0xff<<AD0_PIN_NUM;
    IO1DIR|=LEDS8;
        IODIR=IODIR|(1<<WR_PIN_NUM)|(1 <<RD_PIN_NUM)|(1<<DC_PIN_NUM)|(1<<CS_PIN_NUM)|((unsigned int)1<<RES_PIN_NUM);
// 设置引脚输出值,除CS_PIN_NUM输出为低电平外,其余均为高电平
    IO0CLR = (1<<CS_PIN_NUM);
    IO0SET = (1<<DC_PIN_NUM)|(1<<WR_PIN_NUM)|(1<<RD_PIN_NUM);
    temp = 0xff<<AD0_PIN_NUM;
    IO1SET=IO1SET|temp;
   
   //复位
  IO0CLR = ((unsigned int)1<<RES_PIN_NUM);                       
  for(i=0; i<5000; i++);
  IO0SET = ((unsigned int)1<<RES_PIN_NUM);   
  for(i=0; i<5000; i++);
}


/************************************************************************************/
//
/************************************************************************************/
uint8 ReadData(void)     //从P09702OLED显示屏读取数据
{   uint32 temp,temp1;
        IRQDisable();
    temp1 = IO1DIR;
    IO1DIR = temp1 & (~(0xff << AD0_PIN_NUM));  // 设置AD0_PIN_NUM为输入
    IOCLR = 1 << RD_PIN_NUM;
    temp = IO1PIN;
    IOSET = 1 << RD_PIN_NUM;
    IO1DIR = temp1 | (0xff << AD0_PIN_NUM);
    temp = temp >> AD0_PIN_NUM;
    return (uint8) temp;
    IRQEnable();
}
/************************************************************************************/
//
/************************************************************************************/
void WriteCommand(uint8 Data)   //写指令代码到P09702OLED显示屏
{   
        IRQDisable();
        IOCLR = 1 << DC_PIN_NUM;
    IO1SET = Data << AD0_PIN_NUM;
    Data = ~Data;
    IO1CLR = Data << AD0_PIN_NUM;
    IOCLR = 1 << WR_PIN_NUM;
    IOSET = 1 << WR_PIN_NUM;
    IOSET = 1 << DC_PIN_NUM;
    IRQEnable();
}
/*************************************************************************************/
//
/*************************************************************************************/
void WriteData(uint8 Data)   //写参数及数据到P09702OLED显示屏
{     
        IO1SET = Data << AD0_PIN_NUM;
    Data = ~Data;
    IO1CLR = Data << AD0_PIN_NUM;
    IOCLR = 1 << WR_PIN_NUM;
    IOSET = 1 << WR_PIN_NUM;
   
}
/*************************************************************************************/
//
/*************************************************************************************/
void clr_oled(void)
{
        int i,j;
        for(i=0;i<8;i++)
        {
                WriteCommand (0xB0+i);    //设置显示位置—行
                WriteCommand (0x02);      //设置显示位置—列低地址
                WriteCommand (0x10);      //设置显示位置—列高地址
                for(j=0;j<128;j++)     
                        WriteData(0x00);        //屏幕显示,全亮
        }
}
/*************************************************************************************/
//
/*************************************************************************************/
void init_oled(void)
{
        WriteCommand(0xAE); //Display off
        WriteCommand(0xAD); //Internal DC-DC off
        WriteCommand(0x8A); // Second byte
        WriteCommand(0xA8); //MUX Ratio
        WriteCommand(0x3F); //64 duty
        WriteCommand(0xD3); //Display offset
        WriteCommand(0x00); //Second byte
        WriteCommand(0x40); //Start line
        WriteCommand(0xA0); //Segment remap                //a0
        WriteCommand(0xC8); //COM remap
        WriteCommand(0xA6); //Set normal/inverse display (0xA6:Normal display)
        WriteCommand(0xA4); //Set entire display on/off (0xA4:Normal display)
        WriteCommand(0x81); //Contrast setting
        WriteCommand(0x5C); //Second byte
        WriteCommand(0xD5); //Frame rate
        WriteCommand(0x60); // 85 Hz
        WriteCommand(0xD8); //Mode setting
        WriteCommand(0x00); //Mono mode
        WriteCommand(0xD9); //Set Pre-charge period
        WriteCommand(0x84); // Second byte
        WriteCommand(0xAF); //Display on
}

出0入0汤圆

发表于 2010-2-4 10:31:50 | 显示全部楼层
上面是两种OLED的程序。
都是单色的。
16色的,就不贴了。
其实道理都一样。
初始化一定要对。

还有51做彩色图片,你想累死它?
还是换32位的吧,起码也得用AVR了。
否则速度,空间都不够,外扩的话,成本也不必32 ARM的便宜。

出0入0汤圆

发表于 2010-6-4 11:04:35 | 显示全部楼层
4.3寸的这款OLED我现在也在做驱动板,楼主若有时间可以一起讨论一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 11:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表