spi裸板程序

/oled.c

#include "oledfont.h"
#include "gpio_spi.h"
#include "s3c24xx.h"


static void OLED_Set_DC(char val) //输出的是命令还是数据
{
    if (val)
        GPGDAT |= (1<<4); //DC口输出1
    else
        GPGDAT &= ~(1<<4);//DC输出0
}


static void OLED_Set_CS(char val)
{
    if (val)
        GPFDAT |= (1<<1);//OLED片选信号输出1
    else
        GPFDAT &= ~(1<<1);//片选信号输出0
}


static void OLEDWriteCmd(unsigned char cmd)
{
    OLED_Set_DC(0); /* command *///写命令时DC为0
    OLED_Set_CS(0); /* select OLED */ //片选为0表示选中


    SPISendByte(cmd);//发送命令


    OLED_Set_CS(1); /* de-select OLED */ //发送后DC和CS都设置为初始值1
    OLED_Set_DC(1); /*  */
}


static void OLEDWriteDat(unsigned char dat)
{
    OLED_Set_DC(1); /* data */
    OLED_Set_CS(0); /* select OLED */


    SPISendByte(dat);


    OLED_Set_CS(1); /* de-select OLED */
    OLED_Set_DC(1); /*  */   //DC的初始值就是1,默认输出数据
}


static void OLEDSetPageAddrMode(void) //设置页地址模式
{
    OLEDWriteCmd(0x20);
    OLEDWriteCmd(0x02);
}


static void OLEDSetPos(int page, int col)
{
    OLEDWriteCmd(0xB0 + page); /* page address */ //先发送第几页


    OLEDWriteCmd(col & 0xf);   /* Lower Column Start Address *///再发送第几列,且先发送列的低四位,后发送列的高四位
    OLEDWriteCmd(0x10 + (col >> 4));   /* Lower Higher Start Address */
}




static void OLEDClear(void)
{
    int page, i;
    for (page = 0; page < 8; page ++)//清除时按页来进行清除
    {
        OLEDSetPos(page, 0);//清除的起始位置
        for (i = 0; i < 128; i++)
            OLEDWriteDat(0);
    }
}


void OLEDInit(void)
{
    /* 向OLED发命令以初始化 */
    OLEDWriteCmd(0xAE); /*display off*/ 
    OLEDWriteCmd(0x00); /*set lower column address*/ 
    OLEDWriteCmd(0x10); /*set higher column address*/ 
    OLEDWriteCmd(0x40); /*set display start line*/ 
    OLEDWriteCmd(0xB0); /*set page address*/ 
    OLEDWriteCmd(0x81); /*contract control*/ 
    OLEDWriteCmd(0x66); /*128*/ 
    OLEDWriteCmd(0xA1); /*set segment remap*/ 
    OLEDWriteCmd(0xA6); /*normal / reverse*/ 
    OLEDWriteCmd(0xA8); /*multiplex ratio*/ 
    OLEDWriteCmd(0x3F); /*duty = 1/64*/ 
    OLEDWriteCmd(0xC8); /*Com scan direction*/ 
    OLEDWriteCmd(0xD3); /*set display offset*/ 
    OLEDWriteCmd(0x00); 
    OLEDWriteCmd(0xD5); /*set osc division*/ 
    OLEDWriteCmd(0x80); 
    OLEDWriteCmd(0xD9); /*set pre-charge period*/ 
    OLEDWriteCmd(0x1f); 
    OLEDWriteCmd(0xDA); /*set COM pins*/ 
    OLEDWriteCmd(0x12); 
    OLEDWriteCmd(0xdb); /*set vcomh*/ 
    OLEDWriteCmd(0x30); 
    OLEDWriteCmd(0x8d); /*set charge pump enable*/ 
    OLEDWriteCmd(0x14); 


    OLEDSetPageAddrMode();


    OLEDClear();
    
    OLEDWriteCmd(0xAF); /*display ON*/    
}




/* page: 0-7
 * col : 0-127
 * 字符: 8x16象素
 */
void OLEDPutChar(int page, int col, char c)
{
    int i = 0;
    /* 得到字模 */
    const unsigned char *dots = oled_asc2_8x16[c - ' '];


    /* 发给OLED */
    OLEDSetPos(page, col);
    /* 发出8字节数据 */
    for (i = 0; i < 8; i++)
        OLEDWriteDat(dots[i]);


    OLEDSetPos(page+1, col);
    /* 发出8字节数据 */
    for (i = 0; i < 8; i++)
        OLEDWriteDat(dots[i+8]);


}




/* page: 0-7
 * col : 0-127
 * 字符: 8x16象素
 */
void OLEDPrint(int page, int col, char *str)
{
    int i = 0;
    while (str[i])
    {
        OLEDPutChar(page, col, str[i]);
        col += 8;
        if (col > 127)
        {
            col = 0;
            page += 2;
        }
        i++;
    }

}


gpio_spi.c

#include "s3c24xx.h"


/* 用GPIO模拟SPI */


static void SPI_GPIO_Init(void)
{
    /* GPF1 OLED_CSn output */
    GPFCON &= ~(3<<(1*2));
    GPFCON |= (1<<(1*2));
    GPFDAT |= (1<<1);


    /* GPG2 FLASH_CSn output
    * GPG4 OLED_DC   output
    * GPG5 SPIMISO   input
    * GPG6 SPIMOSI   output
    * GPG7 SPICLK    output
    */
    GPGCON &= ~((3<<(2*2)) | (3<<(4*2)) | (3<<(5*2)) | (3<<(6*2)) | (3<<(7*2)));
    GPGCON |= ((1<<(2*2)) | (1<<(4*2)) | (1<<(6*2)) | (1<<(7*2)));
    GPGDAT |= (1<<2);
}


static void SPI_Set_CLK(char val)
{
    if (val)
        GPGDAT |= (1<<7);
    else
        GPGDAT &= ~(1<<7);
}


static void SPI_Set_DO(char val)
{
    if (val)
        GPGDAT |= (1<<6);
    else
        GPGDAT &= ~(1<<6);
}


void SPISendByte(unsigned char val)
{
    int i;
    for (i = 0; i < 8; i++)
    {
        SPI_Set_CLK(0);
        SPI_Set_DO(val & 0x80);
        SPI_Set_CLK(1);
        val <<= 1;
    }
    
}


void SPIInit(void)
{
    /* 初始化引脚 */
    SPI_GPIO_Init();
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值