OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4460|回复: 5

0.96寸oled屏光标设置问题?

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2020-4-26
在线时间
9 小时
发表于 2020-5-28 18:27:48 | 显示全部楼层 |阅读模式
5金钱
有哪位大神能讲一下oled设置光标的代码,代码如下:
/*
函数功能: 设置光标位置
函数参数: x列的起始位置(0~127)
                                  y页的起始位置(0~7)
比如: 0x8  高4位0000   低4位1000
*/
void oled_setpos(unsigned char x,unsigned char y)
{
                OLED_WR_Byte(0xB0+y,OLED_CMD);                                         //设置页地址
          
                OLED_WR_Byte((x&0xF0)>>4|0x10,OLED_CMD);
                OLED_WR_Byte((x&0x0F)|0x00,OLED_CMD);                         
}

完整代码如下


#include "oled.h"
#include "codetab.h"

void OLED_WR_Byte(unsigned char dat,OLED_WR_MODE cmd)
{       
        uint8_t write[2] = {0};
        write[1] = dat;
        switch(cmd)
        {
                case OLED_CMD:
                        write[0] = 0x00;       
                        break;
                case OLED_DATA:
                        write[0] = 0x40;
                        break;
        }   
       
        HAL_I2C_Master_Transmit(&hi2c1, 0x78, write, 2, HAL_MAX_DELAY);
}

void oled_init(void)
{
        HAL_Delay(1000);//Ñóê±1s
       
        OLED_WR_Byte(0xAE, OLED_CMD);//Set Display ON/OFF (AEh/AFh)
       
       
                OLED_WR_Byte(0x20, OLED_CMD);
        OLED_WR_Byte(0x10, OLED_CMD);//Set Higher Column Start Address for Page Addressing Mode (10h~1Fh)
        OLED_WR_Byte(0xB0, OLED_CMD);//Set Display Start Line (40h~7Fh)
        OLED_WR_Byte(0xC8, OLED_CMD);//Set COM Output Scan Direction (C0h/C8h)
       
        OLED_WR_Byte(0x00, OLED_CMD);//Set Lower Column Start Address for Page Addressing Mode (00h~0Fh)

        OLED_WR_Byte(0x10, OLED_CMD);
        OLED_WR_Byte(0x40, OLED_CMD);//Set Memory Addressing Mode (20h/21/22h)
        OLED_WR_Byte(0x81, OLED_CMD);//Set Contrast Control for BANK0 (81h)
        OLED_WR_Byte(0xA1, OLED_CMD);//Set Segment Re-map (A0h/A1h)
        OLED_WR_Byte(0xA6, OLED_CMD);//Entire Display ON (A4h/A5h)
        OLED_WR_Byte(0xA8, OLED_CMD);//Set Normal/Inverse Display (A6h/A7h)
        OLED_WR_Byte(0x3F, OLED_CMD);//Set Multiplex Ratio (A8h)
       
        OLED_WR_Byte(0xA4, OLED_CMD);//Set Lower Column Start Address for Page Addressing Mode (00h~0Fh)

        OLED_WR_Byte(0xD3, OLED_CMD);//Set Display Offset (D3h)
        OLED_WR_Byte(0x00, OLED_CMD);
        OLED_WR_Byte(0xD5, OLED_CMD);//Set Display Clock Divide Ratio/ Oscillator Frequency (D5h)
        OLED_WR_Byte(0x80, OLED_CMD);//Set Pre-charge Period (D9h)
        OLED_WR_Byte(0xD9, OLED_CMD);//Set COM Pins Hardware Configuration (DAh)
        OLED_WR_Byte(0x1F, OLED_CMD);//Set VCOMH Deselect Level (DBh)
       
        OLED_WR_Byte(0xDA, OLED_CMD);
        OLED_WR_Byte(0x12, OLED_CMD);
        OLED_WR_Byte(0xDB, OLED_CMD);
        OLED_WR_Byte(0x30, OLED_CMD);
        OLED_WR_Byte(0x8D, OLED_CMD);
        OLED_WR_Byte(0x10, OLED_CMD);
        /*
        OLED_WR_Byte(0xAE, OLED_CMD);//Set Display ON/OFF (AEh/AFh)
       
       
        OLED_WR_Byte(0x00, OLED_CMD);//Set Lower Column Start Address for Page Addressing Mode (00h~0Fh)
        OLED_WR_Byte(0x10, OLED_CMD);//Set Higher Column Start Address for Page Addressing Mode (10h~1Fh)
        OLED_WR_Byte(0x20, OLED_CMD);//Set Memory Addressing Mode (20h/21/22h)
        OLED_WR_Byte(0x40, OLED_CMD);//Set Display Start Line (40h~7Fh)
        OLED_WR_Byte(0x81, OLED_CMD);//Set Contrast Control for BANK0 (81h)
        OLED_WR_Byte(0xA1, OLED_CMD);//Set Segment Re-map (A0h/A1h)
        OLED_WR_Byte(0xA4, OLED_CMD);//Entire Display ON (A4h/A5h)
        OLED_WR_Byte(0xA6, OLED_CMD);//Set Normal/Inverse Display (A6h/A7h)
        OLED_WR_Byte(0xA8, OLED_CMD);//Set Multiplex Ratio (A8h)
       
        OLED_WR_Byte(0xC8, OLED_CMD);//Set COM Output Scan Direction (C0h/C8h)
        OLED_WR_Byte(0xD3, OLED_CMD);//Set Display Offset (D3h)
        OLED_WR_Byte(0xD5, OLED_CMD);//Set Display Clock Divide Ratio/ Oscillator Frequency (D5h)
        OLED_WR_Byte(0xD9, OLED_CMD);//Set Pre-charge Period (D9h)
        OLED_WR_Byte(0xDA, OLED_CMD);//Set COM Pins Hardware Configuration (DAh)
        OLED_WR_Byte(0xDB, OLED_CMD);//Set VCOMH Deselect Level (DBh)
*/       
        //OLED_WR_Byte(0x00, OLED_CMD);//-not offset
/*
        OLED_WR_Byte(0x02, OLED_CMD);//
        OLED_WR_Byte(0x12, OLED_CMD);
        OLED_WR_Byte(0x14, OLED_CMD);//--set(0x10) disable
        OLED_WR_Byte(0x3f, OLED_CMD);//--1/64 duty
        OLED_WR_Byte(0x40, OLED_CMD);//Set VCOM Deselect Level
        OLED_WR_Byte(0x80, OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
        OLED_WR_Byte(0x8D, OLED_CMD);//--set Charge Pump enable/disable
        OLED_WR_Byte(0xCF, OLED_CMD); // Set SEG Output Current Brightness
        OLED_WR_Byte(0xF1, OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
*/
        OLED_WR_Byte(0xAF, OLED_CMD); //Set Display ON/OFF (AEh/AFh)
       
       
}

/*
函数功能: 设置光标位置
函数参数: x列的起始位置(0~127)
                                  y页的起始位置(0~7)
比如: 0x8  高4位0000   低4位1000
*/
void oled_setpos(unsigned char x,unsigned char y)
{
                OLED_WR_Byte(0xB0+y,OLED_CMD);                                         //设置页地址
          
                OLED_WR_Byte((x&0xF0)>>4|0x10,OLED_CMD);
                OLED_WR_Byte((x&0x0F)|0x00,OLED_CMD);                         
}


void oled_fill(unsigned char fill_data)
{
        unsigned char m,n;
        for(m=0;m<8;m++)
        {
                OLED_WR_Byte(0xb0+m, OLED_CMD);//éè&#214;&#195AGEμ&#216;&#214;·(0~7)
                OLED_WR_Byte(0x00, OLED_CMD);//éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;£&#172;áDμíμ&#216;&#214;·
                OLED_WR_Byte(0x10, OLED_CMD);//éè&#214;&#195;&#207;&#212;ê&#190;&#206;&#187;&#214;&#195;£&#172;áD&#184;&#223;μ&#216;&#214;·
               
                for(n=0;n<128;n++)
                {
                        OLED_WR_Byte(fill_data, OLED_DATA);
                }
        }
}
//&#199;&#229;&#198;&#189;
void oled_cls(void)
{
        oled_fill(0x00);
}
//′ó&#203;ˉ&#195;&#223;&#214;D&#187;&#189;D&#209;oled
void oled_on(void)
{
        OLED_WR_Byte(0x8d, OLED_CMD);//set dcdc&#195;üá&#238;  μ&#231;oé±&#195;
        OLED_WR_Byte(0x14, OLED_CMD);//dcdc  on   &#191;a&#198;&#244;μ&#231;oé±&#195;
        OLED_WR_Byte(0xAF, OLED_CMD);//display  on   oled&#187;&#189;D&#209;
}
//è&#195;OLEDDY&#195;&#223;
void oled_off(void)
{
        OLED_WR_Byte(0X8D, OLED_CMD);//éè&#214;&#195;μ&#231;oé±&#195;
        OLED_WR_Byte(0X10, OLED_CMD);//1&#216;±&#213;μ&#231;oé±&#195;
        OLED_WR_Byte(0XAE, OLED_CMD);//OLEDDY&#195;&#223;
}
//&#207;&#212;ê&#190;codetable.h&#214;Dμ&#196;ascii×&#214;·&#251;£&#172;óD6*8oí8*16&#191;é&#209;&#161;&#212;&#241;
void oled_showstr(unsigned char x,unsigned char y, unsigned char ch[],unsigned char text_size)
{
        unsigned char c = 0,i = 0,j = 0;
        switch(text_size)
        {
                case 1:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 126)
                                {
                                        x = 0;
                                        y++;
                                }
                                oled_setpos(x,y);
                                for(i=0;i<6;i++)
                                        OLED_WR_Byte(F6x8[c][i], OLED_DATA);
                                x += 6;
                                j++;
                        }
                }break;
                case 2:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 120)
                                {
                                        x = 0;
                                        y++;
                                }
                                oled_setpos(x,y);
                                for(i=0;i<8;i++)
                                        OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
                                oled_setpos(x,y+1);
                                for(i=0;i<8;i++)
                                        OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
                                x += 8;
                                j++;
                        }
                }break;
        }
}
/**
  * @brief  OLED_ShowCN£&#172;&#207;&#212;ê&#190;codetab.h&#214;Dμ&#196;oo×&#214;,16*16μ&#227;&#213;ó
  * @param  x,y: &#198;eê&#188;μ&#227;×&#248;±ê(x:0~127, y:0~7);
        *                                        No×&#214;&#212;úcodetab.h&#214;Dμ&#196;&#203;÷òy
                                                adder&#206;aêy×é&#207;&#194;±êN&#184;&#246;oo×&#214;£&#172;êy×é′óD&#161;&#190;í&#206;aN*32
        * @retval &#206;T
  */
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
        unsigned char wm=0;
        unsigned int  adder=32*N;
       
                oled_setpos(x , y);
                for(wm = 0;wm < 16;wm++)
                {
                        OLED_WR_Byte(PF16x16[adder],OLED_DATA);
                        adder += 1;
                }
                oled_setpos(x,y + 1);
                for(wm = 0;wm < 16;wm++)
                {
                        OLED_WR_Byte(PF16x16[adder],OLED_DATA);
                        adder += 1;
                }
       
       
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

172

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3141
金钱
3141
注册时间
2014-11-29
在线时间
183 小时
发表于 2020-5-28 20:52:30 | 显示全部楼层
lutigers
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8207
金钱
8207
注册时间
2020-5-11
在线时间
3702 小时
发表于 2020-5-29 16:26:41 | 显示全部楼层
这个估计要结合器件手册才好理解。
其实就是设置坐标,然后输入的数据(1字节8位就是8个点,排成列)就在这个坐标显示,然后x坐标可能在器件内自动加1,就是往右边走。
专治疑难杂症
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2020-5-29 16:30:18 | 显示全部楼层
画调竖线自己实现位置
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2019-8-5
在线时间
33 小时
发表于 2020-6-1 20:05:05 | 显示全部楼层
三叶草 发表于 2020-5-29 16:30
画调竖线自己实现位置

我不信求分享
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-6-2 01:29:18 | 显示全部楼层
dierba 发表于 2020-6-1 20:05
我不信求分享自己写
自己写咯
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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