栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

S3C2440裸机------SPI

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

S3C2440裸机------SPI

目录

1.oledfont.h

2.gpio_spi.h

3.gpio_spi.c

4.oled.h

5.oled.c


1.oledfont.h
#ifndef __OLEDFONT_H
#define __OLEDFONT_H 	   
const unsigned char oled_asc2_8x16[95][16]=
{
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},// 0
    {0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},//!1
    {0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"2
    {0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},//#3
    {0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},//$4
    {0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},//%5
    {0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},//&6
    {0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//'7
    {0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},//(8
    {0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},//)9
    {0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/

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

    
    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();
}

4.oled.h
#ifndef _OLED_H
#define  _OLED_H

void OLEDInit(void);
void OLEDPrint(int page, int col, char *str);
void OLEDPutChar(int page, int col, char c);

#endif

5.oled.c
#include "oledfont.h"
#include "gpio_spi.h"
#include "s3c24xx.h"

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

static void OLED_Set_CS(char val)
{
    if (val)
        GPFDAT |= (1<<1);
    else
        GPFDAT &= ~(1<<1);
}

static void OLEDWriteCmd(unsigned char cmd)
{
    OLED_Set_DC(0); 
    OLED_Set_CS(0); 

    SPISendByte(cmd);

    OLED_Set_CS(1); 
    OLED_Set_DC(1); 
}

static void OLEDWriteDat(unsigned char dat)
{
    OLED_Set_DC(1); 
    OLED_Set_CS(0); 

    SPISendByte(dat);

    OLED_Set_CS(1); 
    OLED_Set_DC(1); 
}

static void OLEDSetPageAddrMode(void)
{
    OLEDWriteCmd(0x20);
    OLEDWriteCmd(0x02);
}

static void OLEDSetPos(int page, int col)
{
    OLEDWriteCmd(0xB0 + page); 

    OLEDWriteCmd(col & 0xf);   
    OLEDWriteCmd(0x10 + (col >> 4));   
}


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)
{
    
    OLEDWriteCmd(0xAE);  
    OLEDWriteCmd(0x00);  
    OLEDWriteCmd(0x10);  
    OLEDWriteCmd(0x40);  
    OLEDWriteCmd(0xB0);  
    OLEDWriteCmd(0x81);  
    OLEDWriteCmd(0x66);  
    OLEDWriteCmd(0xA1);  
    OLEDWriteCmd(0xA6);  
    OLEDWriteCmd(0xA8);  
    OLEDWriteCmd(0x3F);  
    OLEDWriteCmd(0xC8);  
    OLEDWriteCmd(0xD3);  
    OLEDWriteCmd(0x00); 
    OLEDWriteCmd(0xD5);  
    OLEDWriteCmd(0x80); 
    OLEDWriteCmd(0xD9);  
    OLEDWriteCmd(0x1f); 
    OLEDWriteCmd(0xDA);  
    OLEDWriteCmd(0x12); 
    OLEDWriteCmd(0xdb);  
    OLEDWriteCmd(0x30); 
    OLEDWriteCmd(0x8d);  
    OLEDWriteCmd(0x14); 

    OLEDSetPageAddrMode();

    OLEDClear();
    
    OLEDWriteCmd(0xAF);     
}



void OLEDPutChar(int page, int col, char c)
{
    int i = 0;
    
    const unsigned char *dots = oled_asc2_8x16[c - ' '];

    
    OLEDSetPos(page, col);
    
    for (i = 0; i < 8; i++)
        OLEDWriteDat(dots[i]);

    OLEDSetPos(page+1, col);
    
    for (i = 0; i < 8; i++)
        OLEDWriteDat(dots[i+8]);

}



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++;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号