搜索
bottom↓
回复: 105

悠景双色12864OLED驱动+ZLGGUI简单移植,有图有真相

  [复制链接]

出0入93汤圆

发表于 2009-4-29 20:53:31 | 显示全部楼层 |阅读模式
今天我抽放假前不想干活这段时间,把这个屏驱动了一下,本人水平有限,希望有些参考价值,少走些弯路吧。

用的屏是12864双色,27引脚,内部集成DCDC,驱动IC为SH1101A,这里面提到的所有文件,如果你没有,可以到帖子的末尾下载。

首先说,这个屏是要直接焊到PCB上的,没有对应的插座。还好管脚不是很密,我就直接拿洞洞板上了。0.5的都焊过,这个小意思了。很久没有做这种细致手工活了。焊完还是挺有成就感的。这个屏对应的手册是128X64 27P.pdf,这个文件。但是里面有用的信息有限,示例连接电路第五页还给人误导,使我第一次焊就焊错了。大家重点还是看SH1101A V0.13.pdf,这个驱动IC的手册吧。

由于手工焊,所以选择了串行方式,这样用到的数据管脚是5个,分别是
RST
CS
A0
DIN
CLK
我用的是高温线的单根线芯,小心翼翼将他们分别引出。

正面图,这个是已经全写1以后照的了。卡片机照的,没技术含量,还算清楚。

(原文件名:1.JPG)

然后是电源部分。如果要用内部的DCDC,参照SH1101A V0.13.pdf的13页的图焊完,是没有问题的。我为了节省时间,没有使用内部DCDC,这样电路简单了不少,电源部分只需要把GND和VDD1焊上,VDD1我是和STM32的3.3连在了一起。按照128X64 27P.pdf的第五页的电路焊接了3个钽电容和910K的电阻。电阻实际用680+220=900K。VPP需要连接高压,我外部供了9V的电压。然后上电,就可以写程序了。

这个是完成后的背面图了。不知道从什么时候开始,自己做的实验板都是这个风格的了。估计也是受本论坛某位达人的影响了。

(原文件名:2.JPG)


驱动器的详细寄存器可以看SH1101A V0.13.pdf,但是我没看,照着示例基本就可以操作了。习惯了什么拿来能用就行了,没有刨根揪底,所以成不了高手吧。

先说端口定义,用到5个IO口。我定义成了如下格式,这个看个人习惯了。如果你定义成相同的格式,那么我发的文件你直接拿走就不用修改了。

#define        UGDI_1                GPIO_SetBits(GPIOD, GPIO_Pin_8)
#define        UGDI_0                GPIO_ResetBits(GPIOD, GPIO_Pin_8)

#define        UGCK_1                GPIO_SetBits(GPIOD, GPIO_Pin_10)
#define        UGCK_0                GPIO_ResetBits(GPIOD, GPIO_Pin_10)

#define        UGA0_1                GPIO_SetBits(GPIOD, GPIO_Pin_11)
#define        UGA0_0                GPIO_ResetBits(GPIOD, GPIO_Pin_11)

#define        UGCS_1                GPIO_SetBits(GPIOD, GPIO_Pin_12)
#define        UGCS_0                GPIO_ResetBits(GPIOD, GPIO_Pin_12)

#define        UGRST_1                GPIO_SetBits(GPIOD, GPIO_Pin_9)
#define        UGRST_0                GPIO_ResetBits(GPIOD, GPIO_Pin_9)

底层驱动没有范例,但是模拟SPI,用得太多了。只需要下面两个函数。

void Write_Register(unsigned char Data)
{
        unsigned char i;
       
        UGCS_0;
        UGA0_0;
        for (i=0; i<8; i++)
        {
                UGCK_0;               
                if (Data&0x80)
                        UGDI_1;
                else
                        UGDI_0;
                Data = Data << 1;
                UGCK_1;
        }
        UGA0_1;
        UGCS_1;       
}

void Write_Parameter(unsigned char Data)
{
        unsigned char i;
       
        UGCS_0;
        UGA0_1;
        for (i=0; i<8; i++)
        {
                UGCK_0;               
                if (Data&0x80)
                        UGDI_1;
                else
                        UGDI_0;
                Data = Data << 1;
                UGCK_1;
        }
        UGA0_1;
        UGCS_1;       
}

然后就是初始化代码了。这个就不贴这里了。自己下来看吧。
void Initial_UG12864(void);

这个排线照得清楚些

(原文件名:3.JPG)

驱动到这里基本就完成了。程序开始先初始户然后再UG_Fill就可以填充颜色了。弄完感觉太简单了,力气一点都没用呢。然后想起来前几天在320*240的TFT上移植过ZLGGUI,这个很好移植的,然后想再加个GUI吧。

GUI源程序复制进去,需要移植的函数其实只有四五个,都是很简单的那种。
但是开始写,发现一个问题,就是使用SPI方式驱动,屏幕只可以写,不能读,这样就没法移植了。后来想,反正屏小,STM32内存大,开辟内存缓冲区吧,以前没这样弄过,试验结果还是很简单的,甚至比直接写屏还要简单。

创建缓冲区。
unsigned char GUIBUF[128][8] = {0};
使用128行8列的二维数组,写点也好写直线也好,都是修改这个数组,然后统一刷屏就行了。

大概写一下,详细的下载附件程序看吧。
比如在x,y写点,这样操作就可以了
        GUIBUF[x][y / 8] |= (1 << (y % 8));
读点
        if((GUIBUF[x][y / 8] & (1<<(y % 8))) == 0)
                *ret = 0;
        else
                *ret = 1;
画x0,y0,x1的横线
        for(i=x0; i<x1; i++)
        {
                GUIBUF[y0 / 8] |= (1<<(y0 % 8));
        }

画竖线,这个稍微麻烦点,大概移植了一遍,用了下,没发现太大错误。不过画很短的竖线可能会出错。画窗体竖线有断裂,不知道是不是这里的问题了。也没有检查。再仔细理一遍完善一下应该就好了。看着有点乱。

void  GUI_RLine(uint16 x0, uint16 y0, uint16 y1, TCOLOR color)
{
        unsigned char temp1,temp2,temp3,temp4,i;
        temp1 = y0 / 8;
        temp2 = y0 % 8;
        temp3 = y1 / 8;
        temp4 = y1 % 8;
       
        if(color)
        {
                GUIBUF[x0][temp1] |= (0xff - (1<<temp2) + 1);
                GUIBUF[x0][temp3] |= (1<<temp4 + 1<<temp4 - 1);
                for(i=temp1+1; i<temp3; i++)
                {
                        GUIBUF[x0] = 0xff;
                }
        }
        else
        {
                GUIBUF[x0][temp1] &= ~(0xff - (1<<temp2) + 1);
                GUIBUF[x0][temp3] &= ~(1<<temp4 + 1<<temp4 - 1);
                for(i=temp1+1; i<temp3; i++)
                {
                        GUIBUF[x0] = 0;
                }
        }
}

现在还只是写内存,还不是写屏。所以在使用GUI的时候每次操作以后需要加一个函数GUI_Exec(),就是画图。函数名字偷得UCGUI得,呵呵。
void GUI_Exec()
{
        unsigned char x,y;
        for(y=0;y<8;y++)
        {
                Write_Register(0x02);    /*set lower column address ' 04*/      
                Write_Register(0x10);    /*set higher column address ' 12*/     
                Write_Register(0xB0+y);    /*set page address*/
               
                for(x=0;x<128;x++)
                {
                        Write_Parameter(GUIBUF[x][y]);
                }
        }  
}


然后在main里面就可以测试了。

        WINDOWS  demow;
       
        Initial_UG12864();

        GUI_SetColor(1,0);
       
        demow.x = 0;
        demow.y = 0;
        demow.with = 64;
        demow.hight = 64;
        demow.title = (uint8 *) "Mini";
        demow.state = (uint8 *)"Bar";
        GUI_WindowsDraw(&demow);
       
        GUI_Button_OK(70, 0);       
       
        GUI_Button_OK(70,32);       

        GUI_Exec();

效果就是这个图片了。上两张吧,忙活半天呢。

(原文件名:4.JPG)


(原文件名:5.JPG)


总之,这个屏使用还算方便,就是太小了,还好还算便宜吧。

菜鸟所做,高手勿喷。

----------------------------------------------------------------------------------------
屏的手册下载
点击此处下载 ourdev_440987.pdf(文件大小:1.74M) (原文件名:UG-2864AMBAG01.pdf)
----------------------------------------------------------------------------------------
驱动IC数据手册
点击此处下载 ourdev_440988.pdf(文件大小:425K) (原文件名:SH1101A.pdf)
----------------------------------------------------------------------------------------
本示例完整的工程,基于STM32,IAR4.42,其他单片机可从中提取自己所需文件和程序
点击此处下载 ourdev_440989.rar(文件大小:1.23M) (原文件名:UG2864.rar)

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入4汤圆

发表于 2009-4-29 21:01:33 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2009-4-29 21:03:02 | 显示全部楼层
不错,照片拍的也好。这个屏多少钱?

出0入0汤圆

发表于 2009-4-29 21:31:31 | 显示全部楼层
这个是不是一般MP3上用的那种...虽然是双色..但其实是两种颜色 ?

出0入0汤圆

发表于 2009-4-29 22:23:50 | 显示全部楼层
oled显示效果比TFT就是要好.

出0入0汤圆

发表于 2009-4-29 22:33:29 | 显示全部楼层
最近也做了个OLED的温度计,方案是
ZLG Easy ARM1138+18B20+2.4OLED双色屏+LT3465
本来想等CP2102的USB转串口做完,可以在电脑上记录分析温度以后才传方案,
现在既然楼主先贴了,那我也来凑凑热闹吧。


(原文件名:Photo_0001.jpg)


(原文件名:Photo_0003.jpg)


几个比较关键的代码:
OLED屏幕定义,完全根据ZLG的TFT驱动来搞,没有更改,RS接A0的位置,其他都能对上号。
/*********************************************************************************************************
硬件相关接口定义
*********************************************************************************************************/

#define  LCD_PERI               SYSCTL_PERIPH_GPIOA | SYSCTL_PERIPH_GPIOB

#define  LCD_RS_BASE            GPIO_PORTB_BASE                         /* RS - PB0                     */
#define  LCD_RS_PIN             GPIO_PIN_0

#define  LCD_CS_BASE            GPIO_PORTB_BASE                         /* CS - PB1                     */
#define  LCD_CS_PIN             GPIO_PIN_1

#define  LCD_WR_BASE            GPIO_PORTB_BASE                         /* WR - PB2                     */
#define  LCD_WR_PIN             GPIO_PIN_2

#define  LCD_RD_BASE            GPIO_PORTB_BASE                         /* RD - PB3                     */
#define  LCD_RD_PIN             GPIO_PIN_3

#define  LCD_RST_BASE           GPIO_PORTB_BASE                         /* RST - PB4                    */
#define  LCD_RST_PIN            GPIO_PIN_4

#define  DATA_PORT_BASE         GPIO_PORTA_BASE                         /* DATA[7:0] - PA[7:0]          */
#define  DATA_PORT_PIN          0xFF

/*********************************************************************************************************
硬件相关的定义
*********************************************************************************************************/
#define  LCD_CS_BASE_PIN        LCD_CS_BASE,LCD_CS_PIN
#define  LCD_WR_BASE_PIN        LCD_WR_BASE,LCD_WR_PIN
#define  LCD_RS_BASE_PIN        LCD_RS_BASE,LCD_RS_PIN
#define  LCD_RD_BASE_PIN        LCD_RD_BASE,LCD_RD_PIN
#define  LCD_RST_BASE_PIN       LCD_RST_BASE,LCD_RST_PIN
#define  DATA_PORT_BASE_PIN     DATA_PORT_BASE,DATA_PORT_PIN

/*********************************************************************************************************
硬件相关的位操作定义
*********************************************************************************************************/
#define  LCD_RS                 HWREG(LCD_RS_BASE + (GPIO_O_DATA + (LCD_RS_PIN << 2)))
#define  LCD_CS                 HWREG(LCD_CS_BASE + (GPIO_O_DATA + (LCD_CS_PIN << 2)))
#define  LCD_WR                 HWREG(LCD_WR_BASE + (GPIO_O_DATA + (LCD_WR_PIN << 2)))
#define  LCD_RD                 HWREG(LCD_RD_BASE + (GPIO_O_DATA + (LCD_RD_PIN << 2)))
#define  LCD_RST                HWREG(LCD_RST_BASE + (GPIO_O_DATA + (LCD_RST_PIN << 2)))
#define  DATA_PORT              HWREG(DATA_PORT_BASE + (GPIO_O_DATA + (DATA_PORT_PIN << 2)))
#define  DATA_PROT_INPUT_SET()  HWREG(DATA_PORT_BASE + GPIO_O_DIR) = 0  /* 设置数据口为输入方向         */
#define  DATA_PROT_OUTPUT_SET() HWREG(DATA_PORT_BASE + GPIO_O_DIR) = 0xFF
                                                                        /* 设置数据口为输出方向         */
/*********************************************************************************************************
** 函数名称: __writeData8
** 功能描述: (向当前地址的寄存器)写8位数据
** 输   入: ucData 要写入液晶的8位数据
** 输   出: 无
** 全局变量: 无
** 调用模块: 无
** 返    回:无
** 作   者:
** 日   期:
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void __writeData8(INT8U ucData)       /* 写8位数据函数  */
{
    LCD_RS = 0xFF;                    /* 拉高RS         */   
    LCD_CS = 0x00;                    /* 拉低CS         */
    LCD_WR = 0x00;                    /* 拉低WR         */
    DATA_PORT = ucData;               /* 写数据         */
    LCD_WR = 0xFF;                    /* 拉高WR         */
    LCD_CS = 0xFF;                    /* 拉高CS         */
    LCD_RS = 0x00;                    /* 拉低RS         */
}

/*********************************************************************************************************
** 函数名称: __writeCommand
** 功能描述: 写命令函数
** 输   入: unsigned char data  输入的命令
** 输   出: 无
** 全局变量: 无
** 调用模块: 无
** 返    回:无
** 作   者:
** 日   期:
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void __writeCommand(unsigned char data)
{
    // 写8位地址
    LCD_RS = 0x00;                                                      /* 拉低RS    */
    LCD_CS = 0x00;
    LCD_WR = 0x00;
    DATA_PORT = data;
    LCD_WR = 0xFF;
    LCD_CS = 0xFF;
}

/*********************************************************************************************************
** 函数名称: tftLcdInit
** 功能描述: 液晶初始化
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 调用模块: __writeCommand()、
** 返    回:无
** 作   者:
** 日   期:
**------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void tftLcdInit(void)                                                   /* 初始化函数                   */
{
    SysCtlPeriEnable(LCD_PERI);                                         /* 使能相应的GPIO               */
    GPIOPinTypeOut(LCD_CS_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(LCD_WR_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(LCD_RS_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(LCD_RD_BASE_PIN);                                    /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(LCD_RST_BASE_PIN);                                   /* 设置相应的控制管脚为输出     */
    GPIOPinTypeOut(DATA_PORT_BASE_PIN);                                 /* 设置相应的数据管脚为输出     */
   
    LCD_RS = 0xFF;                                                      /* 初始化输出为高电平           */
    LCD_CS = 0xFF;                                                      /* 初始化输出为高电平           */
    LCD_WR = 0xFF;;                                                     /* 初始化输出为高电平           */
    LCD_RD = 0xFF;                                                      /* 初始化输出为高电平           */
    LCD_RST = 0xFF;                                                     /* 初始化输出为高电平           */
    DATA_PORT = 0xFF;
   
    LCD_RST = 0x00;                                                     /* 拉低复位引脚                 */
    SysCtlDelay(10 * SysCtlClockGet() / 3000);
    LCD_RST = 0xFF;                                                     /* 拉高复位引脚                 */
    SysCtlDelay(10 * SysCtlClockGet() / 3000);
   
    //initializing funciton 1
   
   
    __writeCommand(0xAE);    //display off
    __writeCommand(0x02);    //set lower column address
    __writeCommand(0x10);    //set higher column address   
    __writeCommand(0x40);    //set display start line
    __writeCommand(0xB0);    //set page address
    __writeCommand(0x81);    //contract control
    __writeCommand(0x80);    //128
    __writeCommand(0xA1);    //set segment remap
    __writeCommand(0xA4);    //normal display
    __writeCommand(0xA6);    //normal / reverse
    __writeCommand(0xA8);    //multiplex ratio
    __writeCommand(0x3F);    //duty = 1/64  
    __writeCommand(0xC8);    //Com scan direction
    __writeCommand(0xD3);    //set display offset
    __writeCommand(0x00);
    __writeCommand(0xD5);    //set osc division
    __writeCommand(0x00);
    __writeCommand(0xD8);    //set area color mode off
    __writeCommand(0x05);
    __writeCommand(0xDA);    // set COM pins
    __writeCommand(0x12);
    __writeCommand(0xDB);    //
    __writeCommand(0x40);
    __writeCommand(0xAF);    //display ON
}

这个是从原版的OLED驱动改过来的,hdat和ldat没有用,只是让它黑屏
void fill(unsigned char hdat,unsigned char ldat)
{
    unsigned char x,y;
   

      for(y=0;y<8;y++)   /*8行
        {
           __writeCommand(0x02);    /*set lower column address ' 04*/      
           __writeCommand(0x10);    /*set higher column address ' 12*/     
           __writeCommand(0xB0+y);    /*set page address*/
           
           for(x=0;x<64;x++)
             {
              __writeData8(0);
              __writeData8(0);
             }
       }
     
}

写半角西文
void disc(unsigned char X,unsigned char Y,unsigned char c)
{
  
  unsigned m,n;

          for(n=0;n<3;n++)
     {      
           __writeCommand(0xB0|(n+Y));    /*set page address*/
          __writeCommand(0x00+X%16);                // Set Lower Column Start Address for Page Addressing Mode
                                                //   Default => 0x00
          __writeCommand(0x10+X/16);                // Set Higher Column Start Address for Page Addressing Mode
                                                //   Default => 0x10
           
           
           for(m=0;m<12;m++)
              __writeData8(dig[m+c*36+n*12]);
     }
}

写汉字

void dishz(unsigned char X,unsigned char Y,unsigned char h)
{
  
  unsigned m,n;

          for(n=0;n<3;n++)
     {      
           __writeCommand(0xB0|(n+Y));    /*set page address*/
          __writeCommand(0x00+X%16);                // Set Lower Column Start Address for Page Addressing Mode
                                                //   Default => 0x00
          __writeCommand(0x10+X/16);                // Set Higher Column Start Address for Page Addressing Mode
                                                //   Default => 0x10
           
           
           for(m=0;m<24;m++)
              __writeData8(hz[m+h*72+n*24]);
     }
}

/*********************************************************************************************************
** 定时器的中断服务函数
** 每毫秒中断一次
*********************************************************************************************************/
void  Timer0A_ISR(void)
{
    TimerIntClear(T0_A_INT_TIMEOUT);                                    /* 清除定时器超时中断,重要!   */
    if (GulDelayMs < 0xFFFFFFFFUL) {
        GulDelayMs++;                                                   /* 在delayMs()函数中清零,用于  */
                                                                        /* 精确延时                     */
    }
}


/*********************************************************************************************************
精确延时函数 GulDelayMs由定时器中断每1ms加1
*********************************************************************************************************/
void  delayMs(unsigned long  ulVal)
{
    GulDelayMs = 0;
    while (GulDelayMs < ulVal);
}



/*********************************************************************************************************
定时器初始化
*********************************************************************************************************/
void  timer0Init(void)
{
    IntRegister(INT_TIMER0A, Timer0A_ISR);                              /* 注册中断服务函数             */
   
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0);                             /* 使能定时器模块               */
    TimerConfigure(T0_CFG_32_PER);                                      /* 配置定时器为32位周期定时器   */
    TimerLoadSet(T0_A , GulSysClock/1000);                              /* 设置定时器初值               */
    TimerIntEnable(T0_A_INT_TIMEOUT);                                   /* 使能定时器超时中断           */
    IntEnable(INT_TIMER0A);                                             /* 使能定时器中断               */
    IntMasterEnable();                                                  /* 使能处理器中断               */
    GulDelayMs = 0;
    TimerEnable(T0_A);                                                  /* 使能定时器计数               */
}

/*********************************************************************************************************
** 定时器的中断服务函数
** 每微秒中断一次
*********************************************************************************************************/
void  Timer1A_ISR(void)
{
    TimerIntClear(T1_A_INT_TIMEOUT);                                    /* 清除定时器超时中断,重要!   */
    if (GulDelayUs < 0xFFFFFFFFUL) {
        GulDelayUs++;                                                   /* 在delayUs()函数中清零,用于  */
                                                                        /* 精确延时                     */
    }
}


/*********************************************************************************************************
精确延时函数 GulDelayMs由定时器中断每1ms加1
*********************************************************************************************************/
void  delayUs(unsigned long  ulVal)
{
    GulDelayUs = 0;
    IntEnable(INT_TIMER1A);
    while (GulDelayUs < ulVal);
    IntDisable(INT_TIMER1A);
}


/*********************************************************************************************************
定1时器初始化
*********************************************************************************************************/
void  timer1Init(void)
{
    IntRegister(INT_TIMER1A, Timer1A_ISR);                              /* 注册中断服务函数             */
   
    SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1);                             /* 使能定时器模块               */
    TimerConfigure(T1_CFG_32_PER);                                      /* 配置定时器为32位周期定时器   */
    TimerLoadSet(T1_A , GulSysClock/1000000);                              /* 设置定时器初值               */
    TimerIntEnable(T1_A_INT_TIMEOUT);                                   /* 使能定时器超时中断           */
   // IntEnable(INT_TIMER1A);                                             /* 使能定时器中断               */
    TimerEnable(T1_A);                                                  /* 使能定时器计数               */
}

/*********************************************************************************************************
** 18B02初始化
** DQ:D2
*********************************************************************************************************/
unsigned char T18B02Int(void)
{   
    unsigned char DQdata;
    DQoutput(DQ);                                       //  设置DQ脚为输出
    DQhigh(DQ);                                         //拉高总线
    delayUs(5);
    DQlow(DQ);                                           //拉底总线
    delayUs(600);                                       //延时大于480us
    DQinput(DQ);
    delayUs(40);
    DQdata=GPIOPinRead(DQ);                            //读取DQ值
    delayUs(500);                                       //延时20us
    return(DQdata);
}

/**********************************************************************
读DS18B20一个字节
**********************************************************************/

unsigned char read_bit(void)         
{
    static unsigned char dataDQ;
    DQoutput(DQ);
    delayUs(2);
    DQhigh(DQ);
    delayUs(2);
    DQlow(DQ);
    delayUs(5);
    DQinput(DQ);
    dataDQ=GPIOPinRead(DQ);
    delayUs(60);
    return(dataDQ);
}

/**********************************************************************
写DS18B20一个字节
**********************************************************************/

void write_bit(unsigned char bitval)   
{     
    DQoutput(DQ);                                       //  设置DQ脚为输出
   delayUs(2);
    DQhigh(DQ);
    delayUs(2);
    DQlow(DQ);                                           //拉底总线
   delayUs(5);

    if (bitval==1)   
    {
         DQhigh(DQ);

    }

     delayUs(55);
}

/**********************************************************************
读DS18B20一个字节
**********************************************************************/
unsigned char readByteDS18B20(void)
{
    unsigned char i;
    unsigned char j;
    unsigned char value=0;
   
     
    for (i=0;i<8;i++)
    {
        j=read_bit();     //调读位函数
      
        if (j)               //如果是 1 置1
        {
            value|=(0x01<<i);  //先读低位,再读高位
           delayUs(3);
        }
    }                         //否则置 0
    return(value);           
}


/**********************************************************************
写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(unsigned char val)
{
    unsigned char i;
    unsigned char temp;
   
   
    for (i=0;i<8;i++)
    {
        temp=val>>i;
        temp&=0x01;
        write_bit(temp);   //调写位函数
         
    }
    delayUs(3);   
}






/**********************************************************************
读DS18B20温度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
        unsigned char tempL,tempH;
        unsigned int x;
        while(T18B02Int());
        writeByteDS18B20(0xcc);         //跳过ROM
        writeByteDS18B20(0x44);                //启动温度转换
        DQinput(DQ);
        while(!GPIOPinRead(DQ));
        while(T18B02Int());
        delayUs(5);
        writeByteDS18B20(0xcc);                //跳过ROM
        writeByteDS18B20(0xbe);                //读数据
        tempL=readByteDS18B20();
        tempH=readByteDS18B20();
        x=(tempH<<8)|tempL;
        return(x);
}


/**********************************************************************
读DS18B20 ID
**********************************************************************/
unsigned int readIDDS18B20(void)
{
        unsigned char tempL,tempH;
        unsigned int x;
        while(T18B02Int());
        writeByteDS18B20(0x33);                //读ID
        tempL=readByteDS18B20();
        tempH=readByteDS18B20();
        x=(tempH<<8)|tempL;
        return(x);
}

这条程序很眼熟吧,是在论坛的一位高手的程序挖过来的。
/************************************************************************************
                              把浮点数拆开存储指针型数据  
                                                          输入浮点数,方式0:设定值,1:检测值  
************************************************************************************/
void chai(float x,unsigned char y)  
{
        uint i;
        for(i = 0;i < 7;i ++)
                GOUT = 0;
        if(y == 0)
        {
                i = x / 10;
                if(i == 0)
                        GOUT[0] = ' ';
                else
                        GOUT[0]        = i + '0';
                GOUT[1] = (int)x % 10 + '0';
                x = x * 10;
                GOUT[3] = (int)x % 10 + '0';

                x = x * 10;
                if(((int)x % 10) >= 5 )// 防止后面大于4的数被舍去  
                {GOUT[3] = GOUT[3] + 1;}
                else
                {;}

                GOUT[4] = ' ';
                GOUT[5] = ' ';
        }
        else
        {
                i = x / 10;
                if(i == 0)
                        GOUT[0] = ' ';
                else
                        GOUT[0] = i + '0';
                GOUT[1] = (int)x % 10 + '0';
                x = x * 10;
                GOUT[3] = (int)x % 10 + '0';
                x = x * 10;
                GOUT[4] = (int)x % 10 + '0';
                x = (x * 10);
                GOUT[5] = (unsigned int)x % 10 + '0';
        }
        GOUT[2] =  '.';
        GOUT[6] =  '\0';
}



int  main(void)
{
    unsigned char n;
    unsigned int Tem=0x00000000;
    float Temperature=0.0;
    jtagWait();                                                       /* 防止JTAG失效,重要!         */
    GulSysClock  =  clockInit();                                        /* 获取系统时钟,单位:Hz       */
    timer0Init();                                                       /* 定时器初始化                 */
    timer1Init();
    tftLcdInit();
    fill(255,255);
    dishz(0,5,0);
    dishz(24,5,1);
    disc(55,5,0);
    disc(67,5,0);
    disc(79,5,10);
    disc(91,5,0);
    dishz(103,5,2);
    ledInit();
    SysCtlPeriEnable(DQ_PERI);
    while (1) {
      Tem=readTempDS18B20();
       Temperature=0.0;
       if(Tem&0x0001)
       {
         Temperature+=0.0625;
       }
       if(Tem&0x0002)
       {
         Temperature+=0.125;
       }
       if(Tem&0x0004)
       {
         Temperature+=0.25;
       }
       if(Tem&0x0008)
       {
         Temperature+=0.5;
       }
       if(Tem&0x0010)
       {
         Temperature+=1;
       }
       if(Tem&0x0020)
       {
         Temperature+=2;
       }
       if(Tem&0x0040)
       {
         Temperature+=4;
       }
       if(Tem&0x0080)
       {
         Temperature+=8;
       }
       if(Tem&0x0100)
       {
         Temperature+=16;
       }
       if(Tem&0x0200)
       {
         Temperature+=32;
       }
       if(Tem&0x0400)
       {
         Temperature+=64;
       }
       if(Tem&0x0800)
       {
         Temperature*=(-1);
       }
       chai(Temperature,1);
       disc(55,5,GOUT[0]-'0');
       disc(67,5,GOUT[1]-'0');
       disc(91,5,GOUT[3]-'0');
    }
}

出0入0汤圆

发表于 2009-4-29 23:36:45 | 显示全部楼层
恭喜^_^LZ终于做好了,这个屏上面固定显示黄色,下面固定显示蓝色的,颜色不可以改,也可以看成假双色,呵呵

出0入93汤圆

 楼主| 发表于 2009-4-30 06:52:17 | 显示全部楼层
【6楼】 little Monkey
对呀,本来就是这样的。要不也不会这么便宜了。呵呵。

出0入0汤圆

发表于 2009-4-30 08:53:03 | 显示全部楼层
qiang

出0入0汤圆

发表于 2009-4-30 14:56:26 | 显示全部楼层
我也有二块这个OLED屏。不错。

出0入0汤圆

发表于 2009-5-1 21:57:04 | 显示全部楼层
很好,呵呵,屏可以选更大点的,320240,好像论坛有卖 的。。。

出0入0汤圆

发表于 2009-5-4 16:29:56 | 显示全部楼层
MARKKKKKKKKKKKKK

出0入0汤圆

发表于 2009-5-24 17:15:29 | 显示全部楼层
看看

出0入0汤圆

发表于 2009-5-24 20:22:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-5-31 17:41:53 | 显示全部楼层
楼主 ,这个屏和那种lcd黑白的屏幕驱动程序一样吗?

出0入0汤圆

发表于 2009-6-2 15:48:10 | 显示全部楼层
额,偶手里都是维信诺的OLED。

出0入0汤圆

发表于 2009-8-25 15:01:14 | 显示全部楼层
TO  HL1200AA
你的这个应该可以做成带温湿度显示的吧,最近我也在做这方面的开发主要是应用0.84的小屏,有兴趣可以一起做研究下。

出0入0汤圆

发表于 2009-9-13 12:25:02 | 显示全部楼层
楼主的焊功相当厉害啊!!这款液晶价值多少啊??好像比得上TFT了!!

出0入0汤圆

发表于 2009-9-22 06:55:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-3 00:38:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-2 23:25:19 | 显示全部楼层
标记
头像被屏蔽

出0入0汤圆

发表于 2010-1-26 11:34:25 | 显示全部楼层
以下蓝色文字由坛主:armok 于:2010-01-26,11:34:25 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[3033]燕山大学无线电爱好者协会
即将移去的分区:[3020]STM32/STM8 技术讨论区
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>
头像被屏蔽

出0入0汤圆

发表于 2010-1-26 11:34:36 | 显示全部楼层
顶,好资料。

出0入0汤圆

发表于 2010-1-26 12:24:49 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-1-26 12:30:35 | 显示全部楼层
O(∩_∩)O谢谢。。。

出0入0汤圆

发表于 2010-1-26 12:40:15 | 显示全部楼层
不错。百花齐放。

出0入0汤圆

发表于 2010-1-26 15:36:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-26 19:46:30 | 显示全部楼层
楼主是受无机酸影响吧

出0入0汤圆

发表于 2010-4-21 21:14:16 | 显示全部楼层
bucuo

出0入0汤圆

发表于 2010-4-21 21:54:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-21 22:27:41 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-4-21 23:00:55 | 显示全部楼层
我也mark!

出0入0汤圆

发表于 2010-4-21 23:41:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-21 23:48:21 | 显示全部楼层
有没有不需要7V电源的屏,比如可以用5V的话就可以直接用在USB设备上了,而不用升压

出0入0汤圆

发表于 2010-4-22 13:12:56 | 显示全部楼层
去年就用这块屏作了个万年历,算是伪双色的,呵呵~

出0入0汤圆

发表于 2010-4-22 15:25:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-23 13:40:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-23 23:05:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-23 23:52:42 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-6-22 12:22:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-5 13:00:47 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-7-11 15:55:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-12 19:53:47 | 显示全部楼层
这个OLED尺寸有点小,我用过一个大的效果也不错

出0入0汤圆

发表于 2010-7-12 19:59:58 | 显示全部楼层
非常感谢

出0入0汤圆

发表于 2010-7-19 02:32:29 | 显示全部楼层
记录一下

出0入0汤圆

发表于 2010-7-19 22:22:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-20 17:02:33 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-20 16:50:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 17:10:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-24 15:22:35 | 显示全部楼层

出0入0汤圆

发表于 2010-10-31 23:09:11 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-11-8 13:50:13 | 显示全部楼层
卖不卖???QQ:358154006

出0入0汤圆

发表于 2010-11-28 22:41:28 | 显示全部楼层
OLED就是漂亮啊!不知道12864的价格怎么样?

出0入0汤圆

发表于 2011-3-1 17:28:19 | 显示全部楼层
楼主,你用的是什么线呀?难道是导线?

出0入0汤圆

发表于 2011-4-11 19:06:19 | 显示全部楼层
强烈的顶高手啊!

出0入0汤圆

发表于 2011-4-11 19:57:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-13 16:23:40 | 显示全部楼层
MARK

出0入147汤圆

发表于 2011-5-13 16:51:09 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2011-5-14 10:48:38 | 显示全部楼层
如果屏尺寸不同。应该怎么改代码?

出0入0汤圆

发表于 2011-5-14 10:55:15 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-15 14:05:35 | 显示全部楼层
非常漂亮啊。
我是新手,刚入门的。看到这个OLED也非常喜欢,网上定了二块。想用I2C,因为用的线比较少。

我想问一下,你的这个屏,是I2C通信吗?我想用在AVR上,比如手上的是ATMEGA328P,可以用的吗?怎么用?

麻烦你了。能否QQ:172436738 ,请教你。谢谢。。。

出0入0汤圆

发表于 2011-5-15 21:28:45 | 显示全部楼层
收藏。

出0入0汤圆

发表于 2011-5-25 23:20:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-26 08:48:47 | 显示全部楼层
这种屏的效果不错,但目前好像还挺贵的(相对TFT来说)。

出0入0汤圆

发表于 2011-5-26 08:59:06 | 显示全部楼层
这个是工业产品上用的
耐得住低温
呵呵
正好用上
谢谢

出0入0汤圆

发表于 2011-6-5 22:56:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 21:00:01 | 显示全部楼层
mark~~~~

出0入0汤圆

发表于 2011-11-2 11:50:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 12:51:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 13:22:36 | 显示全部楼层
很爽,,看的很激动。。。
但我还是想问问。。为什么我看很多牛人用洞洞板焊电路,
在下边走线全是用焊锡直接堆的。。。
为什么不直接用裸线走?
是个人习惯,还是其他呢。。

出0入0汤圆

发表于 2011-11-25 20:50:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-20 17:12:49 | 显示全部楼层
楼主能不能说一下,这个用什么取字模啊

出0入0汤圆

发表于 2012-4-20 17:28:40 | 显示全部楼层
我也有一个12864,还没有用过

出0入0汤圆

发表于 2012-4-20 20:36:27 | 显示全部楼层
显示漂亮,就是屏小点

出0入0汤圆

发表于 2012-4-20 21:09:06 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2012-4-21 00:06:05 | 显示全部楼层
学习学习~

出0入0汤圆

发表于 2012-4-21 13:31:12 | 显示全部楼层
good good!!!!

出0入0汤圆

发表于 2013-2-2 11:15:49 | 显示全部楼层
大哥,你如何焊接TFT的条状的到洞洞板上面?我想学习一下啊,买带转接的不经济

出0入0汤圆

发表于 2013-6-29 22:53:51 | 显示全部楼层
mark...................................................

出0入0汤圆

发表于 2013-6-30 00:52:06 | 显示全部楼层
还行呢,我手头上好像有几片这种屏

出0入0汤圆

发表于 2013-7-21 01:21:13 | 显示全部楼层
顶好顶好的·~~~哈哈 zlggui就是资料太少了

出0入0汤圆

发表于 2013-7-31 20:47:25 | 显示全部楼层
oled,gui谢谢

出0入0汤圆

发表于 2013-7-31 23:05:15 | 显示全部楼层
这个屏多少钱

出0入0汤圆

发表于 2013-8-5 18:54:32 | 显示全部楼层
mark!

出0入0汤圆

发表于 2013-8-15 17:37:06 来自手机 | 显示全部楼层
mark…
顶一个…

出0入4汤圆

发表于 2013-10-30 15:49:28 | 显示全部楼层
不错。。。。。。。。。。。。。

出0入0汤圆

发表于 2013-11-9 17:20:35 | 显示全部楼层
不错Mark

出0入0汤圆

发表于 2013-12-23 10:11:08 | 显示全部楼层
oled zlggui

出0入85汤圆

发表于 2013-12-23 11:06:13 | 显示全部楼层
这个OLED老化问题严重不?

出0入0汤圆

发表于 2014-2-21 04:20:16 | 显示全部楼层
美女圖

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-2-21 21:32:29 来自手机 | 显示全部楼层
非常感谢分享。向楼主学习

出0入0汤圆

发表于 2014-3-27 11:07:48 | 显示全部楼层
不错。。好资料

出0入0汤圆

发表于 2014-3-27 15:15:49 | 显示全部楼层
顶一下。

出0入0汤圆

发表于 2014-11-21 17:56:11 | 显示全部楼层
正好要用这个功能,谢谢前人种的树了

出0入0汤圆

发表于 2015-2-13 22:01:30 | 显示全部楼层
不错,哈哈

出0入0汤圆

发表于 2015-2-14 20:22:36 | 显示全部楼层
hl1200aa 发表于 2009-4-29 22:33
最近也做了个OLED的温度计,方案是
ZLG Easy ARM1138+18B20+2.4OLED双色屏+LT3465
本来想等CP2102的USB转 ...

这个屏颜色蛮好看的,比led好看

出0入0汤圆

发表于 2015-2-16 17:11:21 | 显示全部楼层
呵呵,头一阶段做了一半,因有其他事情,放在一边了,先收藏,后面学习

出0入0汤圆

发表于 2015-2-16 20:27:13 | 显示全部楼层
mark

出0入42汤圆

发表于 2016-1-11 17:18:05 | 显示全部楼层
写的不错  屏的效果就是很好 谢谢楼主  

出0入0汤圆

发表于 2016-12-7 09:15:02 | 显示全部楼层
how do you mount the flexible connector? just solder them directly to the PCB?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 01:40

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

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