打印

【转】CC2530之OLED12864程序详解

[复制链接]
1868|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
说书先生|  楼主 | 2016-12-30 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


暂时先贴上程序:(我再整理整理)


#include "code_tab.h"



#define  LCD_SCL   P0_4  

// 串行时钟输入  


#define  LCD_SDA   P0_5  

// 串行数据输入


#define  LCD_RST   P0_6  

// 复位输入端


#define  LCD_DC    P0_7  

// 数据/命令控制


#define XLevelL      

0x00


#define XLevelH      

0x10


#define XLevel       ((XLevelH&

0x0F)*16
+ XLevelL)

#define Max_Column   

132


#define Max_Row      

32


#define Brightness   

0xCF

#define X_WIDTH      

132


#define Y_WIDTH      

32


#define   oledWrDat(val)    spiWriteByte(val,

1
)   

#define   oledWrCmd(val)    spiWriteByte(val,

0
)



void
delay_ms(uint ms)

{
    unsigned

int
a;

   

while
(ms)

    {

        a =

1800
;

        

while
(a--);

        ms--;

    }
   

return
;

}


/**

* OLED SSD1306初始化

*/

void lcdInit(void
)     

{  
    P0DIR =

0xF0;      // 设置相关端口


    LCD_SCL =

1
;

    LCD_RST =

0
;

    delay_ms(

50
);

    LCD_RST =

1;        // 从上电到下面开始初始化要有足够的时间,即等待RC复位完毕   


    oledWrCmd(

0xae);    // turn off oled panel


    oledWrCmd(

0x00);    // set low column address


    oledWrCmd(

0x10);    // set high column address


    oledWrCmd(

0x40);    // set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)


    oledWrCmd(

0x81);    // set contrast control register


    oledWrCmd(

0x8f);    // Set SEG Output Current Brightness


    oledWrCmd(

0xa1);    // Set SEG/Column Mapping     0xa0左右反置 0xa1正常


    oledWrCmd(

0xc8);    // Set COM/Row Scan Direction   0xc0上下反置 0xc8正常


    oledWrCmd(

0xa6);    // set normal display


    oledWrCmd(

0xa8);    // set multiplex ratio(1 to 64)


    oledWrCmd(

0x1f);    // 1/32 duty


    oledWrCmd(

0xd3);    // set display offset   Shift Mapping RAM Counter (0x00~0x3F)


    oledWrCmd(

0x00);    // not offset


    oledWrCmd(

0xd5);    // set display clock divide ratio/oscillator frequency


    oledWrCmd(

0x80);    // set divide ratio, Set Clock as 100 Frames/Sec


    oledWrCmd(

0xd9);    // set pre-charge period


    oledWrCmd(

0xf1);    // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock


    oledWrCmd(

0xda);    // set com pins hardware configuration


    oledWrCmd(

0x02
);

    oledWrCmd(

0xdb);    // set vcomh


    oledWrCmd(

0x40);    // Set VCOM Deselect Level


    oledWrCmd(

0x20);    // Set Page Addressing Mode (0x00/0x01/0x02)


    oledWrCmd(

0x02);    //


    oledWrCmd(

0x8d);    // set Charge Pump enable/disable


    oledWrCmd(

0x14);    // set(0x10) disable


    oledWrCmd(

0xa4);    // Disable Entire Display On (0xa4/0xa5)


    oledWrCmd(

0xa6);    // Disable Inverse Display On (0xa6/a7)


    oledWrCmd(

0xaf);    // --turn on oled panel


    oledFill(

0x00);     //初始清屏


    oledSetPos(

0,0
);   

}


/**

* 串行数据总线传输一字节数据

* @param[in] byte:传输的数据

* @param[in] sel:0-写命令,1-写数据

*/

static void spiWriteByte(uchar byte
, uchar sel)

{


    uchar i;
    LCD_DC =

0
;  

   

if(sel == 1)  LCD_DC = 1
;  

   

for (i=0; i<8; i++) {   // 发送一个八位数据


        

if((byte << i) & 0x80
)

            LCD_SDA  =

1
;

        

else

            LCD_SDA  =

0
;

        LCD_SCL =

0
;

        LCD_SCL =

1
;

    }

}


/**

* 设置显示坐标

*/

void
oledSetPos(uchar x, uchar y)

{
    x +=

4
;

    oledWrCmd(

0xb0
+y);

    oledWrCmd(((x&

0xf0)>>4)|0x10
);

    oledWrCmd((x&

0x0f)|0x01
);

}


/**

* 全屏

*/

void
oledFill(uchar bmp_dat)

{
    unsigned

char
y, x;

   

for (y=0; y<8
; y++) {

        oledWrCmd(

0xb0
+y);

        oledWrCmd(

0x01
);

        oledWrCmd(

0x10
);

        

for(x=0
; x<X_WIDTH; x++)

            oledWrDat(bmp_dat);

    }}


/**

* 复位清屏

*/

void oledClear(void
)

{
    uchar y, x;

   

for (y=0; y<8
; y++) {

        oledWrCmd(

0xb0
+y);

        oledWrCmd(

0x01
);

        oledWrCmd(

0x10
);

        

for(x=0
; x<X_WIDTH; x++)

            oledWrDat(

0
);

    }

}


/**

* 描述:显示6*8一组标准ASCII字符串,显示的坐标(x,y),y为页范围0~7

*/

void
lcdP6x8Str(uchar x, uchar y, uchar ch[])

{
    unsigned

char c=0, i=0, j=0
;  

   

while (ch[j] != '\0'
) {   

        c = ch[j]-

32
;

        

if(x>126) {x=0
; y++;}

        oledSetPos(x,y);   

        

for(i=0; i<6
; i++)     

            oledWrDat(F6x8[c]);  

        x +=

6
;

        j++;

    }}


/**

* 描述:显示8*16一组标准ASCII字符串,显示的坐标(x,y),y为页范围0~7

*/

void
lcdP8x16Str(uchar x, uchar y, uchar ch[])

{
    unsigned

char c=0,i=0,j=0
;

   

while (ch[j] != '\0'
) {   

        c = ch[j]-

32
;

        

if (x>120
) {

           x =

0
;

           y++;

        }
        oledSetPos(x,y);   

        

for(i=0;i<8
;i++)     

            oledWrDat(F8X16[c*

16
+i]);

        oledSetPos(x,y+

1
);   

        

for(i=0; i<8
; i++)     

            oledWrDat(F8X16[c*

16+i+8
]);  

        x+=

8
;

        j++;

    }}


/**

* 描述:显示显示BMP图片128×64起始点坐标(x0, y0),x的范围0~127,y为页的范围0~7

*/

void
lcdDrawBMP(uchar x0, uchar y0, uchar x1, uchar y1, uchar BMP[])

{   
    uint j=

0
;

    uchar x, y;

   

if(y1%8 == 0) y = y1/8
;      

   

else y = y1/8+1
;

   

for
(y=y0; y<y1; y++) {

        oledSetPos(x0,y);               

        

for
(x=x0; x<x1; x++) {      

            oledWrDat(BMP[j++]);            

        }    }
}

相关帖子

沙发
dzfansman| | 2016-12-31 16:54 | 只看该作者
能不能弄个工程文件。

使用特权

评论回复
板凳
dzfansman| | 2016-12-31 16:56 | 只看该作者
这个程序看着太散,太费事了。

使用特权

评论回复
地板
lvyunhua| | 2017-1-6 13:50 | 只看该作者
不明真相得吃瓜群众路过此地。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

191

帖子

0

粉丝