中科昊芯Start_DSC28034PNT 使用OLED显示图片
上次测验使用DELAY_US();函数有问题,所以这次测试OLED12864选择使用自己编写的延时函数,成功点亮OLED屏幕。
本次测试主要目的是将下边图片,通过OLED显示出来。
显示结果:
代码如下:
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;
}
显示其他图片,只用更新数组内容就可以。
更多回帖