CC2530之OLED12864程序详解

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

#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][i]);  
        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++]);            
        }
    }
}
### 回答1: OLED 128x64 显示器是一种小型的显示器,它可以用于各种嵌入式系统和Arduino项目中。下面是一个基本的OLED 128x64显示程序编程过程: 1. 首先需要安装 Adafruit 的 GFX 和 SSD1306 库,这些库提供了与OLED显示器通信的函数和方法。 2. 在代码的开头,需要引入这些库: ``` #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> ``` 3. 接下来需要定义OLED显示器的引和初始化显示器: ``` #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 初始化OLED显示器 display.clearDisplay(); // 清空显示器 } ``` 4. 在 loop() 函数中,可以使用 Adafruit 的 GFX 库提供的各种图形函数来绘制图形、文本、线条等: ``` void loop() { display.clearDisplay(); // 清空显示器 // 绘制文本 display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(20, 20); display.print("Hello, World!"); // 绘制图形 display.drawCircle(64, 32, 30, WHITE); display.display(); // 显示图像 } ``` 5. 最后,需要在代码的结尾加上延时函数,以便给显示器足够的时间来更新和显示图像: ``` void loop() { // 绘制图像 display.display(); // 显示图像 delay(100); // 延时 } ``` 以上就是一个基本的OLED 128x64显示程序编程过程。当然,你可以在程序中添加更多的功能和图形来满足你的需求。 ### 回答2: OLED 12864显示程序的编程过程需要经过以下步骤: 1. 借助适当的编程语言,如C或C++,创建一个新的项目或文件。 2. 导入必要的库或头文件,以便能够与OLED 12864进行通信和控制。这些库通常由OLED制造商提供,可以在其官方网站上或开源项目中找到。 3. 初始化OLED 12864显示。通过调用特定的函数或方法,可以设置液晶显示参数,如显示模式、行列数、亮度等。 4. 清除OLED幕上的所有内容,以确保开始时幕是空白的。这可以通过调用清除显示函数来实现。 5. 编写绘制图形和文本的代码。OLED 12864显示程序通常提供用于在幕上绘制直线、矩形、圆形和文本等元素的函数。通过调用这些函数,可以在幕上绘制想要显示的内容。 6. 更新OLED幕。在绘制完成后,需要调用刷新显示函数,以便将缓冲区中的内容复制到OLED 12864显示上。这样,才能在幕上看到实际的图形和文本。 7. 配置图形和文本属性。OLED 12864显示程序通常提供一些选项,允许更改图形和文本的颜色、字体和大小等属性。可以根据需要调整这些属性,以获得所需的显示效果。 8. 运行程序。当一切准备就绪后,可以将代码上传到目标设备上,然后运行程序。此时,OLED 12864显示应该能够显示所需的图形和文本。 总结起来,OLED 12864显示程序的编程过程包括初始化幕、绘制图形和文本、更新显示以及配置属性等步骤。通过这些步骤,可以实现在OLED 12864显示上显示各种图形和文本的功能。 ### 回答3: OLED12864显示程序的编程过程包括以下步骤: 1. 初始化:首先,需要初始化OLED幕。这包括设置幕的分辨率、I/O引连接、通信协议等。通常会使用特定的库函数或者框架来进行初始化。 2. 创建画面:在OLED幕上显示内容之前,需要先创建一个画面。可以使用图形库或者编程语言提供的绘制函数,创建各种形状、图标、文字等,将它们添加到画面中。 3. 显示画面:将创建好的画面显示在OLED幕上。可以使用特定的库函数或者框架提供的API来进行显示。通常会通过指定要显示的画面的位置和大小来决定在幕上的显示位置。 4. 功能实现:实现特定的功能或者效果。这包括对画面进行更新、滚动、翻页等操作,以及对按键、触摸等外部输入设备的响应。 5. 调试和测试:在编程过程中,需要不断地进行调试和测试。可以使用调试工具或者模拟器来检查程序中是否有错误或者潜在的问题,并进行必要的修改和优化。 6. 循环更新:根据需要,可以将显示程序设计为循环更新,以实现动态变化的画面效果。可以使用定时器、循环结构等方式来实现画面的不断更新和刷新。 编程OLED12864显示程序时,需要了解OLED幕的特性和通信协议,选择合适的库函数或者框架进行开发。同时,需要结合具体的需求和实现目标,设计合理的代码结构和逻辑,保证程序的可靠性和效率。不断的调试和测试,可以帮助发现和解决问题,确保程序的正确性和稳定性。最后,根据实际情况,可以对程序进行优化和改进,提高性能和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值