【Start_DSC28034PNT湖人开发板免费体验】中科昊芯Start_DSC28034PNT 使用OLED显示图片 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

[文章]

【Start_DSC28034PNT湖人开发板免费体验】中科昊芯Start_DSC28034PNT 使用OLED显示图片

中科昊芯Start_DSC28034PNT 使用OLED显示图片

上次测验使用DELAY_US();函数有问题,所以这次测试OLED12864选择使用自己编写的延时函数,成功点亮OLED屏幕。

本次测试主要目的是将下边图片,通过OLED显示出来。
1.jpg
显示结果:
3.jpg

代码如下:
main.c文件:

#include "dsc_config.h"
#include <syscalls.h>
#include "IQmathLib.h"
#include "IIC_OLED.h"

unsigned char fox[8][128]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0xBF,0xBF,0xBF,0xBF,0xDF,0x9F,
0x9F,0x1F,0x0F,0x2F,0x0F,0x07,0x63,0x63,0x69,0xF1,0xF1,0x31,0x1D,0x1C,0x11,0x19,
0x19,0x1D,0x91,0xB1,0xC3,0xE3,0xE7,0xC7,0xC7,0xF7,0xEF,0xEF,0xEF,0x6F,0x6F,0x6F,
0x6F,0x6F,0x5F,0x5F,0x5F,0x5F,0xDF,0x8F,0x97,0x87,0x27,0x33,0x33,0x3B,0x23,0x33,
0x33,0x73,0xE3,0x27,0x27,0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3F,0xBF,0xDF,0xCF,0xCF,0x87,0x87,
0x8B,0x8B,0x9D,0x9D,0xBC,0xFC,0xFC,0xFC,0xFC,0xF8,0xF8,0xF9,0x71,0x33,0xB7,0xDF,
0xDF,0xEF,0xE6,0xE2,0xF4,0xF0,0xF0,0x30,0x79,0xFF,0xFF,0xFE,0xFC,0xFC,0xFE,0xFE,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFA,
0xDB,0xDB,0xDA,0xCA,0xC8,0xE8,0x62,0xE2,0xCA,0xCA,0xD3,0xDF,0xDE,0x9E,0x7E,0x7C,
0x78,0xF2,0xF3,0xEA,0xDC,0xBE,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x3F,0x1F,0x27,0x33,0x79,0x70,0x70,0x71,0x71,0xF1,0xF1,0xF1,0xF3,0xF3,
0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0x9F,0x0F,0x27,0xB4,0xB0,0xF9,0xF8,0xFC,
0xFD,0xFD,0xFF,0xFF,0xFF,0x87,0x87,0x1E,0x1C,0x38,0x38,0x31,0x31,0x73,0x73,0x77,
0x67,0x67,0x67,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x9D,0xBF,0xBF,0xFB,
0xF9,0xFB,0xFF,0xFF,0xFF,0x7F,0x3F,0x1E,0xA0,0xA3,0x8D,0xBE,0x32,0xF3,0xFF,0xFF,
0xFF,0xBF,0xFE,0xDE,0xE1,0xBF,0x98,0x48,0x03,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x7F,0x3F,0xBF,0xDF,0x9F,0x0F,0x0F,0x0F,0xFF,0xFF,0xF7,0xF7,0xC7,0x07,
0x07,0xF7,0xF7,0xB7,0x97,0xC7,0xE7,0x67,0x2F,0xAF,0x8F,0x9F,0x9F,0xBF,0x3F,0x3F,
0x03,0x88,0x0C,0x0C,0x1C,0x18,0x1C,0x1C,0x3C,0x3C,0x3C,0x7C,0xFC,0xFC,0xFD,0xFF,
0xFF,0x7F,0xBF,0xBF,0x9F,0xDF,0xCF,0xCF,0xCC,0xC8,0xC8,0xC3,0xC3,0xC7,0xCF,0x8F,
0xAF,0x0F,0x0F,0x8F,0x8C,0x19,0x39,0x39,0x29,0x61,0x41,0x10,0x38,0x78,0x78,0xFD,
0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFC,0x7C,0x01,0xE5,0xFE,0xFE,0xFF,0xFF,0xFF,
0xFF,0x7F,0x8F,0x9F,0x9D,0xAC,0x76,0x7A,0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xE0,0xC0,0xC0,0x82,0x87,0x87,0x87,0x8E,0xC4,0xC7,0xCF,0xC6,0xC0,0xE1,0xE3,
0xE6,0xE3,0xE3,0xE7,0xE1,0xE0,0xE7,0xE7,0xC7,0x81,0x11,0x0F,0x0D,0x0C,0x3E,0x00,
0x00,0x47,0x07,0x07,0xCF,0xCF,0xCF,0xCF,0xCF,0xEF,0xEF,0xFF,0xFF,0xFF,0x3F,0x1F,
0x8F,0xE7,0xF7,0xFF,0x7F,0x7F,0x3F,0xFF,0xF7,0xFB,0xFB,0xB9,0x99,0xDC,0xDC,0xDC,
0xDC,0xDD,0x5E,0x58,0x41,0xC7,0xDF,0xDF,0x3F,0x3E,0xBE,0x0E,0x42,0xF0,0xE8,0xEC,
0xEE,0xF5,0xF5,0xF9,0xFB,0xFB,0xF3,0xF3,0xF3,0xF3,0xF3,0xF7,0xE7,0xE7,0xE7,0xE7,
0xE7,0xE7,0xE7,0xE3,0xE3,0xE3,0xF1,0xF1,0xF8,0xF0,0xF3,0xF3,0xFB,0xF1,0xC5,0x06,
0x42,0x0C,0x0F,0x0F,0x1F,0x9F,0x9F,0xCA,0x40,0x4D,0x1B,0x5B,0x4B,0x47,0x9F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF8,0xF2,
0xE0,0xE0,0xC0,0x00,0x01,0x03,0x07,0x07,0x07,0x67,0x6F,0xEF,0xEF,0xEF,0xE0,0xE0,
0xE7,0x47,0xC3,0xC1,0xC0,0xC0,0xCF,0xCF,0xCF,0x8F,0x8F,0x07,0x1F,0x1F,0xBF,0xBB,
0x93,0x87,0x87,0xD7,0xDA,0xC8,0xE5,0xF0,0xF8,0xC3,0xC3,0x8C,0x3E,0x7F,0x7F,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x1F,0x00,
0x02,0xFC,0xFC,0xF9,0xFD,0xFE,0xFC,0xFD,0xFC,0xFF,0xFD,0xFC,0xFE,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xE0,0xC0,0x40,0x00,0x00,0x00,0x02,
0x02,0x87,0xC7,0xE7,0xE7,0xF7,0xF7,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x3F,0x1F,0x00,0x31,
0x3B,0x77,0x77,0x67,0x6F,0x6F,0x6F,0x6F,0x5F,0x5F,0x5F,0x1F,0x1F,0x1F,0x1F,0x9F,
0x9F,0x9F,0x9F,0x1F,0x4F,0x4F,0x4F,0x67,0x47,0x57,0x53,0x89,0xCC,0xEC,0xF2,0xF8,
0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xEF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xCF,0xCF,0xCF,0xCF,0xC8,0xC0,0xC0,0xC0,0xC0,
0xC1,0xC7,0xC7,0x8F,0x8F,0x9F,0x9F,0x9F,0x8F,0xAF,0xAF,0x67,0x67,0x6F,0x6F,0x1E,
0x1E,0x6E,0x6E,0x6E,0x6E,0x6E,0x48,0x88,0xB0,0xB2,0xA7,0x87,0x8F,0x87,0x87,0x87,
0x8F,0x87,0x87,0x8F,0x89,0x88,0x82,0x80,0x80,0x80,0x80,0x82,0x87,0x87,0x87,0x8F,
0x8F,0x8F,0x8F,0x8F,0x8F,0x8E,0xCE,0xCE,0xCE,0xC6,0xD6,0xD5,0xD5,0xC5,0xD9,0xD3,
0xC3,0xCB,0xE7,0xCF,0xDF,0xDF,0xDF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"D:\Desktop\28034测验\测验报告4\3.bmp",0*/
/* (128 X 64 )*/
};

int main(void)
{

InitSysCtrl();  //Initializes the System Control registers to a known state.
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
OLED_Init();
while(1){

OLED_ShowBMP(0,0,8,128,fox);

}
return 0;

}

IIC_OLED.h文件:

#ifndef __IIC_OLED_H
#define __IIC_OLED_H

#include "dsc_config.h"

#define OLED_SIZE_13   1
#define OLED_SIZE_096  0

extern void delay_Xus(Uint16 X);

//IIC所有操作函数(驱动程序)
void IICA_Init(void);                //初始化IIC的IO口
void IIC_Start(void);               //发送IIC开始信号
void IIC_Stop(void);                //发送IIC停止信号
void IIC_Send_Byte(unsigned char txd);          //IIC发送一个字节
unsigned char IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
unsigned char IIC_Wait_Ack(void);               //IIC等待ACK信号
void IIC_Ack(void);                 //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号
//OLED通讯程序
extern void OLED_WriteCommand(unsigned char Command);//OLED写命令
extern void OLED_WriteData(unsigned char Data);//OLED写数据

extern void OLED_Init(void);//初始化
extern void OLED_Clear(void);//清屏

extern void OLED_ShowBMP(Uint16 Line0, Uint16 Column0, Uint16 Line1, Uint16 Column1, unsigned char BMP[]);//显示图片(起始行,起始列,结束行,结束列,图片数组)


#endif

IIC_OLED.c文件:

#include "IIC_OLED.h"

#define IIC_SCL_SETH (GpioDataRegs.GPBSET.bit.GPIO33=1)
#define IIC_SCL_SETL (GpioDataRegs.GPBCLEAR.bit.GPIO33=1)

#define IIC_SDA_SETH (GpioDataRegs.GPBSET.bit.GPIO32=1)
#define IIC_SDA_SETL (GpioDataRegs.GPBCLEAR.bit.GPIO32=1)

#define READ_SDA (GpioDataRegs.GPBDAT.bit.GPIO32)



void delay_Xus(Uint16 X)//dely1.2us
{
	static Uint16 i=0;
	while(X--)
	{
		for(i=0;i<1;i++){}
	}
}

/**
  * [url=home.php?mod=space&uid=2666770]@Brief[/url]  OLED写命令
  * [url=home.php?mod=space&uid=3142012]@param[/url]  Command 要写入的命令
  * @retval 无
  */
void OLED_WriteCommand(unsigned char Command)
{
    IIC_Start();
    IIC_Send_Byte(0x78);        //从机地址
    IIC_NAck();
    IIC_Send_Byte(0x00);        //写命令
    IIC_NAck();
    IIC_Send_Byte(Command);
    IIC_NAck();
    IIC_Stop();
}

/**
  * @brief  OLED写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void OLED_WriteData(unsigned char Data)
{
    IIC_Start();
    IIC_Send_Byte(0x78);        //从机地址
    IIC_NAck();
    IIC_Send_Byte(0x40);        //写数据
    IIC_NAck();
    IIC_Send_Byte(Data);
    IIC_NAck();
    IIC_Stop();
}

/**
  * @brief  OLED设置光标位置
  * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
  * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
  * @retval 无
  */
void OLED_SetCursor(unsigned char Y, unsigned char X)
{
    if(OLED_SIZE_13==1)
    {
        OLED_WriteCommand(0xB0 | Y);                    //设置Y位置
        OLED_WriteCommand(0x10 | (((X+2) & 0xF0) >> 4));    //设置X位置高4位
        OLED_WriteCommand(0x00 | ((X+2) & 0x0F));           //设置X位置低4位
    }
    if(OLED_SIZE_096==1)
    {
        OLED_WriteCommand(0xB0 | Y);                    //设置Y位置
        OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));    //设置X位置高4位
        OLED_WriteCommand(0x00 | (X & 0x0F));           //设置X位置低4位
    }

}



/**
  * @brief  OLED清屏
  * @param  无
  * @retval 无
  */
void OLED_Clear(void)
{  
    unsigned char i, j;
    for (j = 0; j < 8; j++)
    {
        OLED_SetCursor(j, 0);
        for(i = 0; i < 128; i++)
        {
            OLED_WriteData(0x00);
        }
    }
}

/**
  * @brief  OLED显示一个图片
  * @param  Line0,Column0:图片左上角起点显示位置坐标
  * @param  Line0,Column0:图片右上角起点显示位置坐标
  * @param  BMP:图片数组
  * @retval Line0起始点为页(行)坐标,范围0-7,Column0为起始点列坐标
  *         Line1,Column1要比图片宽度高度大1
  *         比如图片尺寸128*64,则Line和Column为128*8
  */
void OLED_ShowBMP(Uint16 Line0, Uint16 Column0, Uint16 Line1, Uint16 Column1, unsigned char BMP[])
{
    Uint16 j=0;
    Uint16 Column,Line;

//     if(Line1%8==0) Line1=Line1/8;
//     else Line1=Line1/8+1;
       for(Line=Line0;Line<Line1;Line++)
       {
           OLED_SetCursor(Line,Column0);
           for(Column=Column0;Column<Column1;Column++)
           {
               OLED_WriteData(BMP[j++]);
           }
       }
}
/**
  * @brief  OLED初始化
  * @param  无
  * @retval 无
  */
void OLED_Init(void)
{
	IICA_Init();            //端口初始化

    unsigned int i, j;

    for (i = 0; i < 1000; i++)          //上电延时
    {
        for (j = 0; j < 1000; j++);
    }



    OLED_WriteCommand(0xAE);    //关闭显示

    OLED_WriteCommand(0x20);    //设置内存地址模式
    OLED_WriteCommand(0x02);    //00水平地址模式,01垂直地址模式,02页面地址模式

    OLED_WriteCommand(0x00);    //设置列起始低位,0x10设置列起始高位

    OLED_WriteCommand(0x40);    //设置显示开始行:显存中的第几行作为屏幕的第一行
    OLED_WriteCommand(0xB0);    //设置目标显存位置页起始地址:B0-B7

    OLED_WriteCommand(0xD5);    //设置显示时钟分频比/振荡器频率
    OLED_WriteCommand(0x80);

    OLED_WriteCommand(0xA8);    //设置多路复用率(0-63)
    OLED_WriteCommand(0x3F);    //00-3F

    OLED_WriteCommand(0xD3);    //设置屏幕上下偏移
    OLED_WriteCommand(0x00);    //00-FF

    OLED_WriteCommand(0xA1);    //设置左右镜像,0xA1正常 0xA0左右反置
    OLED_WriteCommand(0xC8);    //设置上下镜像,0xC8正常 0xC0上下反置

    OLED_WriteCommand(0xDA);    //设置COM引脚硬件配置
    OLED_WriteCommand(0x12);

    OLED_WriteCommand(0x81);    //设置对比度控制
    OLED_WriteCommand(0xCF);    //00-FF,256级

    OLED_WriteCommand(0xD9);    //设置预充电周期
    OLED_WriteCommand(0xF1);

    OLED_WriteCommand(0xDB);    //设置VCOMH取消选择级别
    OLED_WriteCommand(0x30);

    OLED_WriteCommand(0xA4);    //A4显示显存内容,A5无视显存内容点亮全屏

    OLED_WriteCommand(0xA6);    //正常显示0xA6/整体反显0xA7

    OLED_WriteCommand(0x8D);    //设置充电泵
    OLED_WriteCommand(0x14);

    OLED_WriteCommand(0xAF);    //开启显示

    OLED_Clear();               //OLED清屏
}

/*******************************************************************************
* 函 数 名         : IIC_Init
* 函数功能         : IIC初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IICA_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
    GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;     //上拉
    GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;     // 输出端口
    GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;    // IO口
    GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 2;   // 不同步

    GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;     //上拉
    GpioCtrlRegs.GPBDIR.bit.GPIO33 = 1;     // 输出端口
    GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0;    // IO口
    GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 2;   // 不同步
    EDIS;
}

/*******************************************************************************
* 函 数 名         : SDA_OUT
* 函数功能         : SDA输出配置
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void SDA_OUT(void)
{
    EALLOW;
    GpioCtrlRegs.GPBDIR.bit.GPIO32=1;       //Output. SDA
    EDIS;
}

/*******************************************************************************
* 函 数 名         : SDA_IN
* 函数功能         : SDA输入配置
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void SDA_IN(void)
{
    EALLOW;
    GpioCtrlRegs.GPBDIR.bit.GPIO32=0;       //Input, SDA
    EDIS;
}

//void IIC_SDA_SETH()
//{
//
//}
/*******************************************************************************
* 函 数 名         : IIC_Start
* 函数功能         : 产生IIC起始信号
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IIC_Start(void)
{
    SDA_OUT();     //sda线输出
    IIC_SDA_SETH;
    IIC_SCL_SETH;
    delay_Xus(5);
    IIC_SDA_SETL;//START:when CLK is high,DATA change form high to low
    delay_Xus(6);
    IIC_SCL_SETL;//钳住I2C总线,准备发送或接收数据
}

/*******************************************************************************
* 函 数 名         : IIC_Stop
* 函数功能         : 产生IIC停止信号
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL_SETL;
    IIC_SDA_SETL;//STOP:when CLK is high DATA change form low to high
    IIC_SCL_SETH;
    delay_Xus(6);
    IIC_SDA_SETH;//发送I2C总线结束信号
    delay_Xus(6);
}

/*******************************************************************************
* 函 数 名         : IIC_Wait_Ack
* 函数功能         : 等待应答信号到来
* 输    入         : 无
* 输    出         : 1,接收应答失败
                     0,接收应答成功
*******************************************************************************/
unsigned char IIC_Wait_Ack(void)
{
    unsigned char tempTime=0;

    IIC_SDA_SETH;
    delay_Xus(1);
    SDA_IN();      //SDA设置为输入
    IIC_SCL_SETH;
    delay_Xus(1);
    while(READ_SDA)
    {
        tempTime++;
        if(tempTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL_SETL;//时钟输出0
    return 0;
}

/*******************************************************************************
* 函 数 名         : IIC_Ack
* 函数功能         : 产生ACK应答
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IIC_Ack(void)
{
    IIC_SCL_SETL;
    SDA_OUT();
    IIC_SDA_SETL;
    delay_Xus(2);
    IIC_SCL_SETH;
    delay_Xus(5);
    IIC_SCL_SETL;
}

/*******************************************************************************
* 函 数 名         : IIC_NAck
* 函数功能         : 产生NACK非应答
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IIC_NAck(void)
{
    IIC_SCL_SETL;
    SDA_OUT();
    IIC_SDA_SETH;
    delay_Xus(2);
    IIC_SCL_SETH;
    delay_Xus(5);
    IIC_SCL_SETL;
}

/*******************************************************************************
* 函 数 名         : IIC_Send_Byte
* 函数功能         : IIC发送一个字节
* 输    入         : txd:发送一个字节
* 输    出         : 无
*******************************************************************************/
void IIC_Send_Byte(unsigned char txd)
{
    unsigned char t;
    SDA_OUT();
    IIC_SCL_SETL;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {
        if((txd&0x80)>0) //0x80  1000 0000
            IIC_SDA_SETH;
        else
            IIC_SDA_SETL;
        txd<<=1;
        delay_Xus(2);   //对TEA5767这三个延时都是必须的
        IIC_SCL_SETH;
        delay_Xus(2);
        IIC_SCL_SETL;
        delay_Xus(2);
    }
}

/*******************************************************************************
* 函 数 名         : IIC_Read_Byte
* 函数功能         : IIC读一个字节
* 输    入         : ack=1时,发送ACK,ack=0,发送nACK
* 输    出         : 应答或非应答
*******************************************************************************/
unsigned char IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
    {
        IIC_SCL_SETL;
        delay_Xus(2);
        IIC_SCL_SETH;
        receive<<=1;
        if(READ_SDA)receive++;
        delay_Xus(1);
    }
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK
    return receive;
}

显示其他图片,只用更新数组内容就可以。

更多回帖

×
发帖