久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2739|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STC51單片機(jī)OLED 屏幕8八針源碼程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:411564 發(fā)表于 2018-10-18 10:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
OLED 屏幕.c文件

ulong  fontaddr = 0;


void Write_Command_OLED(int data1)
{
    char i;
    OLED_DC = 0;
    OLED_CLK = 0;
    for(i = 0; i < 8; i++)
    {

        if(data1 & 0x80)
        {
            OLED_MOS = 1;
        }
        else
        {
            OLED_MOS = 0;
        }
        OLED_CLK = 1;
        _nop_();
        OLED_CLK = 0;
        data1 <<= 1;
    }
}


void Write_Data_OLED(int data1)
{
    char i;
    OLED_DC = 1;
    OLED_CLK = 0;
    for(i = 0; i < 8; i++)
    {

        if(data1 & 0x80)
        {
            OLED_MOS = 1;
        }
        else
        {
            OLED_MOS = 0;
        }
        OLED_CLK = 1;
        _nop_();
        OLED_CLK = 0;
        data1 <<= 1;
    }
}


void Delay_Nms(int n_ms)
{
    int j, k;
    for(j = 0; j < n_ms; j++)
    {
        for(k = 0; k < 110; k++);
    }
}


void Write_Address_OLED(uchar page, uchar column)
{
    Write_Command_OLED(0xb0 + column);  
    Write_Command_OLED((((page + 2) & 0xf0) >> 4) | 0x10);       
    Write_Command_OLED(((page + 2) & 0x0f) | 0x00);
}


void Initial_OLED(void)
{
    OLED_CS1 = 0;
    Rom_CS = 1;
    //        OLED_reset=0;        
    Delay_Nms(20);
    //OLED_reset=1;                  
    Delay_Nms(20);

    Write_Command_OLED(0xAE);  //display off
    Write_Command_OLED(0x20);        //Set Memory Addressing Mode
    Write_Command_OLED(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
    Write_Command_OLED(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
    Write_Command_OLED(0xc8);        //Set COM Output Scan Direction

    Write_Command_OLED(0x02);        //---set low column address
    Write_Command_OLED(0x10);        //---set high column address
    Write_Command_OLED(0x40);        //--set start line address
    Write_Command_OLED(0x81);        //--set contrast control register
    Write_Command_OLED(0x7f);

    Write_Command_OLED(0xa1);        //--set segment re-map 0 to 127
    Write_Command_OLED(0xa6);        //--set normal display
    Write_Command_OLED(0xa8);        //--set multiplex ratio(1 to 64)
    Write_Command_OLED(0x3F);        //
    Write_Command_OLED(0xa4);        //0xa4,Output follows RAM content;0xa5,Output ignores RAM content

    Write_Command_OLED(0xd3);        //-set display offset
    Write_Command_OLED(0x00);        //-not offset
    Write_Command_OLED(0xd5);        //--set display clock divide ratio/oscillator frequency
    Write_Command_OLED(0xf0);        //--set divide ratio
    Write_Command_OLED(0xd9);        //--set pre-charge period

    Write_Command_OLED(0x22);         //
    Write_Command_OLED(0xda);        //--set com pins hardware configuration
    Write_Command_OLED(0x12);
    Write_Command_OLED(0xdb);        //--set vcomh
    Write_Command_OLED(0x20);        //0x20,0.77xVcc

    Write_Command_OLED(0x8d);        //--set DC-DC enable
    Write_Command_OLED(0x14);        //
    Write_Command_OLED(0xaf);        //--turn on OLED panel
    OLED_CS1 = 1;
}

void OLED_CLEAR(void)
{
    unsigned char i, j;
    OLED_CS1 = 0;
    Rom_CS = 1;
    for(i = 0; i < 8; i++)
    {
        Write_Command_OLED(0xb0 + i);
        Write_Command_OLED(0x02);
        Write_Command_OLED(0x10);
        for(j = 0; j < 132; j++)
        {
            Write_Data_OLED(0x00);
        }
    }
    OLED_CS1 = 1;
}


void OLED_Display_Graphic_16x16(uint page, uint column, uchar *dp)
{
    uint i, j;
    OLED_CS1 = 0;
    Rom_CS = 1;
    for(j = 2; j > 0; j--)
    {
        Write_Address_OLED(column, page);
        for (i = 0; i < 16; i++)
        {
            Write_Data_OLED(*dp);                               
            dp++;
        }
        page++;
    }
    OLED_CS1 = 1;
}
void OLED_Display_Graphic_8x16(uint page, uchar column, uchar *dp)
{
    uint i, j;
    OLED_CS1 = 0;
    for(j = 2; j > 0; j--)
    {
        Write_Address_OLED(column, page);
        for (i = 0; i < 8; i++)
        {
            Write_Data_OLED(*dp);                                       
        }
        page++;
    }
    OLED_CS1 = 1;
}
void Write_Command_ROM( uchar datu )
{
    uchar i;
    for(i = 0; i < 8; i++ )
    {
        if(datu & 0x80)
        {
            OLED_MOS = 1;
        }
        else
        {
            OLED_MOS = 0;
        }
        datu = datu << 1;
        OLED_CLK = 0;
        OLED_CLK = 1;
    }
}
uchar Read_Data_From_ROM(void)
{

    uchar i;
    uchar ret_data = 0;
    OLED_CLK = 1;
    for(i = 0; i < 8; i++)
    {
        Rom_OUT = 1;
        OLED_CLK = 0;
        ret_data = ret_data << 1;
        if( Rom_OUT )
        {
            ret_data = ret_data + 1;
        }
        else
        {
            ret_data = ret_data + 0;
        }
        OLED_CLK = 1;
    }
    return(ret_data);
}
void Read_N_Bytes_Data_From_ROM(uchar addrHigh, uchar addrMid, uchar addrLow, uchar *pBuff, uchar DataLen )
{
    uchar i;
    Rom_CS = 0;
    OLED_CS1 = 1;
    OLED_CLK = 0;
    Write_Command_ROM(0x03);
    Write_Command_ROM(addrHigh);
    Write_Command_ROM(addrMid);
    Write_Command_ROM(addrLow);
    for(i = 0; i < DataLen; i++ )
    {
        *(pBuff + i) = Read_Data_From_ROM();
    }
    Rom_CS = 1;
}

/******************************************************************/
void OLED_Display_String(uchar y, uchar x, uchar *text)
{
    uchar i = 0;
    uchar addrHigh, addrMid, addrLow ;
    uchar fontbuf[32];
    while((text[i] > 0x00))
    {
        if(((text[i] >= 0xb0) && (text[i] <= 0xf7)) && (text[i + 1] >= 0xa1))
        {
                       fontaddr = (text[i] - 0xb0) * 94;
            fontaddr += (text[i + 1] - 0xa1) + 846;
            fontaddr = (ulong)(fontaddr * 32);

            addrHigh = (fontaddr & 0xff0000) >> 16;
            addrMid = (fontaddr & 0xff00) >> 8;
            addrLow = fontaddr & 0xff;         
            Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 32 );
            OLED_Display_Graphic_16x16(y, x, fontbuf);
            i += 2;
            x += 16;
        }
        else if(((text[i] >= 0xa1) && (text[i] <= 0xa3)) && (text[i + 1] >= 0xa1))
        {
                     fontaddr = (text[i] - 0xa1) * 94;
            fontaddr += (text[i + 1] - 0xa1);
            fontaddr = (ulong)(fontaddr * 32);

            addrHigh = (fontaddr & 0xff0000) >> 16;
            addrMid = (fontaddr & 0xff00) >> 8;
            addrLow = fontaddr & 0xff;
            Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 32 );
            OLED_Display_Graphic_16x16(y, x, fontbuf);
            i += 2;
            x += 16;
        }
        else if((text[i] >= 0x20) && (text[i] <= 0x7e))
        {
            unsigned char fontbuf[16];
            fontaddr = (text[i] - 0x20);
            fontaddr = (unsigned long)(fontaddr * 16);
            fontaddr = (unsigned long)(fontaddr + 0x3cf80);
            addrHigh = (fontaddr & 0xff0000) >> 16;
            addrMid = (fontaddr & 0xff00) >> 8;
            addrLow = fontaddr & 0xff;

            Read_N_Bytes_Data_From_ROM(addrHigh, addrMid, addrLow, fontbuf, 16 );

            OLED_Display_Graphic_8x16(y, x, fontbuf);
            i += 1;
            x += 8;
        }
        else
        {
            i++;
        }
    }

}

void OLED_Display_Number(uchar y, uchar x, ulong Number)
{
    uchar Number_String[10][2] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    if(Number < 10)
    {
        OLED_Display_String(y, x, Number_String [Number]);
    }
    else if(Number < 100)
    {
        OLED_Display_String(y, x, Number_String[ Number / 10 % 10]);
        OLED_Display_String(y, x + 8, Number_String[Number % 10]);
    }
    else if(Number < 1000)
    {
        OLED_Display_String(y, x, Number_String[Number / 100 % 10]);
        OLED_Display_String(y, x + 1 * 8, Number_String [Number / 10 % 10]);
        OLED_Display_String(y, x + 2 * 8, Number_String [Number % 10]);
    }
    else if(Number < 10000)
    {
        OLED_Display_String(y, x, Number_String [Number / 1000 % 10]);
        OLED_Display_String(y, x + 1 * 8, Number_String [Number / 100 % 10]);
        OLED_Display_String(y, x + 2 * 8, Number_String [Number / 10 % 10]);
        OLED_Display_String(y, x + 3 * 8, Number_String [Number % 10]);
    }
    else if(Number < 100000)
    {
        OLED_Display_String(y, x, Number_String [Number / 10000 % 10]);
        OLED_Display_String(y, x + 1 * 8, Number_String [Number / 1000 % 10]);
        OLED_Display_String(y, x + 2 * 8, Number_String [Number / 100 % 10]);
        OLED_Display_String(y, x + 3 * 8, Number_String [Number / 10 % 10]);
        OLED_Display_String(y, x + 4 * 8, Number_String [Number % 10]);
    }
    else if(Number < 1000000)
    {
        OLED_Display_String(y, x, Number_String [Number / 100000 % 10]);
        OLED_Display_String(y, x + 1 * 8, Number_String [Number / 10000 % 10]);
        OLED_Display_String(y, x + 2 * 8, Number_String [Number / 1000 % 10]);
        OLED_Display_String(y, x + 3 * 8, Number_String [Number / 100 % 10]);
        OLED_Display_String(y, x + 4 * 8, Number_String [Number / 10 % 10]);
        OLED_Display_String(y, x + 5 * 8, Number_String [Number % 10]);
    }
}

void OLED_Display_Timer_Data(uchar y, uchar x, ulong Number)
{
    uchar Number_String[10][2] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    OLED_Display_String(y, x, Number_String[ Number / 10 % 10]);
    OLED_Display_String(y, x + 8, Number_String[Number % 10]);
}

OLED 屏幕.h文件
#include<STC89C5xRC.H>
#include<intrins.h>

#ifndef __OLED_H__
#define __OLED_H__



#define uchar unsigned char
#define uint         unsigned int
#define ulong unsigned long

#define OLED_CLK  P20       
#define        OLED_MOS         P21       
#define        OLED_DC                P22       
#define        OLED_CS1        P23
#define        Rom_OUT         P24        
#define        Rom_CS                P25        

void Send_Command_To_OLED(int data1);
void Send_Data_To_OLED(int data1);
void Delay_Nms(int n_ms);
void Initial_OLED();
void Send_Address_To_OLED(uchar page, uchar column);
void OLED_Clear();
void OLED_OLED_Display_Graphic_16x16(uint page, uint column, uchar *dp);
void OLED_OLED_Display_Graphic_8x16(uint page, uchar column, uchar *dp);
void Send_Command_To_ROM( uchar datu );
uchar Get_data_From_ROM( );
void Get_N_Bytes_Data_From_ROM(uchar addrHigh, uchar addrMid, uchar addrLow, uchar *pBuff, uchar DataLen );
void OLED_Display_String(uchar y, uchar x, uchar *text);
void Display_GB2312_One_String(uchar y, uchar x, uchar *text);
void OLED_Display_Timer_Data(uchar y, uchar x, ulong Number);
void OLED_Display_Number(uchar y, uchar x, ulong Number);

#endif


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2018-10-18 14:42 | 只看該作者
補(bǔ)全原理圖或者詳細(xì)說(shuō)明一下電路連接即可獲得100+黑幣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人成人一区二区在线观看 | 久热国产在线 | 久久久新视频 | 一级黄色影片在线观看 | 亚洲精久 | 伦理午夜电影免费观看 | 亚洲黄色一区二区三区 | www.99热这里只有精品 | 久久午夜精品 | 日韩在线免费电影 | 日韩欧美久久 | 国产精品视频一二三区 | 欧美jizzhd精品欧美巨大免费 | jav成人av免费播放 | 一区二区免费在线观看 | 99爱在线观看 | 国精产品一区一区三区免费完 | 久久国产成人精品国产成人亚洲 | 欧美三级免费观看 | 亚洲欧美v | 99精品电影 | 一级片av | 九色.com | 亚洲喷水 | 国产成人99久久亚洲综合精品 | 中文字幕亚洲精品 | 一二区视频 | 国产精品国产精品国产专区不片 | 精品亚洲一区二区三区四区五区 | www.youjizz.com日韩 | 欧美一区在线视频 | 91久久综合亚洲鲁鲁五月天 | 欧美一级片在线 | 成人精品毛片 | 国产精品久久久久久中文字 | 精品麻豆剧传媒av国产九九九 | 午夜成人免费视频 | 免费一区| 久久大陆| 亚洲精品9999 | 日韩中文在线观看 |