当前位置:首页 > MCU > 正文内容

使用ADC+DAC实现程控增益放大器V3.1,基于STC8G单片机 开源页面

chanra1n3年前 (2021-08-28)MCU5243

本项目主要是研究目的,如果希望用于实际用途,还请使用放大器+数字电位器,或者直接使用程控仪表放大器,例如AD603等。

033A414A09F05DBA7284B232429ED4F9.jpg

C524E76838646643E2DF3D4BA33D7179.jpg

原理图:

image.png

image.png

image.png

代码:

//main.c
/*
注意:请不要输入超过5.5V的信号,否则可能会导致芯片永久损坏!
当输入的信号封装为0~0.5V范围时,输出会放大十倍。
当输入的信号封装为0.5V~2.5范围时,输出会放大一倍。
当输入的信号封装为2.5~+∞范围时,输出会衰减一倍。
*/
#include "lib.h"
#include "stc8.h"
#include "oled.h"
#include "intrins.h"

void main()
{
    GPIO_INIT();
    SYSTEM_INIT();//系统校准
    SET_DAC(0);
    SET_ADC_DIV(1);//设置ADC为全速
    ENABLE_ADC_SIG;//注意通道!!!
    ADC_INIT_ENABLE();//使能ADC中断
    ADC_CONTR |= 0x40;                          //启动AD转换

    OLED_Init();
    OLED_Clear();
    OLED_ShowCHinese(0, 0, 0);
    OLED_ShowCHinese(18, 0, 1);
    OLED_ShowCHinese(36, 0, 2);
    OLED_ShowCHinese(54, 0, 3);
    OLED_ShowCHinese(72, 0, 4);
    OLED_ShowCHinese(90, 0, 5);
    OLED_ShowCHinese(108, 0, 6);
    PRINT_WAVE();
    Timer0Init();//定时器0用于光敏电阻采样

    while (1)
    {
        PRINT_DATA();
        //PrintData();
    }
}
//lib.c
#include "lib.h"
#include "oled.h"
#include "intrins.h"

unsigned char WAVE_DATA[3 * 16] = {24, 27, 30, 33, 35, 38, 40, 43, 44, 46, 47, 47, 47, 47, 47, 46, 44, 43, 40, 38, 36, 33, 30, 27, 24, 20, 17, 14, 12, 9, 7, 4, 3, 1, 0, 0, 0, 0, 0, 1, 3, 4, 6, 9, 11, 14, 17, 20}; //用于暂存波形数据
float VMAX = 0; //用于暂存信号峰值电压
float GAIN = 1.0; //用于暂存放大倍数
float OFST = 0.0; //用于暂存输出偏差

unsigned char FREQ = 0; //用于暂存PWM频率
float CALC;//用于暂存光敏电阻采样到的电压

void Timer0Init(void)
{
    TMOD = 0x00;                                //模式0
    TL0 = 0x66;                                 //65536-11.0592M/12/1000
    TH0 = 0xfc;
    TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    EA = 1;
}

void TM0_Isr() interrupt 1
{
    //更换ADC模式到光敏电阻,然后读取数据放到临时变量,再切换回信号输入
    static unsigned char COUNT = 0;
    COUNT++;

    if(COUNT / 100)
    {
        COUNT = 0;
        EADC = 0;//暂时关闭ADC中断
        ENABLE_ADC_FRE;//开启光敏电阻对应ADC电压
        ADC_CONTR |= 0x40;                      //启动AD转换
        _nop_();
        _nop_();

        while (!(ADC_CONTR & 0x20));            //查询ADC完成标志

        ADC_CONTR &= ~0x20;                     //清完成标志
        FREQ = ADC_RES;                           //读取ADC结果
        EADC = 1;//恢复ADC中断
        ENABLE_ADC_SIG;
    }
}

void SET_DAC(unsigned char DAC_TEMP)
{
//    unsigned char TEMP;
//    DAC_TEMP = DAC_TEMP * 5.0 / 256.0;
//    TEMP = DAC_TEMP;
    DAC0_PIN = GET_BIT(DAC_TEMP, 0);
    DAC1_PIN = GET_BIT(DAC_TEMP, 1);
    DAC2_PIN = GET_BIT(DAC_TEMP, 2);
    DAC3_PIN = GET_BIT(DAC_TEMP, 3);

    DAC4_PIN = GET_BIT(DAC_TEMP, 4);
    DAC5_PIN = GET_BIT(DAC_TEMP, 5);
    DAC6_PIN = GET_BIT(DAC_TEMP, 6);
    DAC7_PIN = GET_BIT(DAC_TEMP, 7);
}

void GPIO_INIT()
{
    P1M0 = 0xFF;
    P1M1 = 0x00;
    P3M0 = 0x00;                                //设置P3.3 P3.4为ADC口
    P3M1 = 0x1C;
}

void ADC_Isr() interrupt 5
{
    float Temp;
    ADC_CONTR &= ~0x20;                         //清中断标志
    Temp = GAIN * ADC_RES;
    SET_DAC(Temp);                           //读取ADC结果

    Temp = ADC_RES / 51.2;

    if(Temp > VMAX)VMAX = Temp;

    ADC_CONTR |= 0x40;                          //继续AD转换
}

//void PrintData()
//{
//    OLED_ShowNum(50, 6, ADC_RES, 3, 16);
//}

void ADC_INIT_ENABLE()
{
    EADC = 1;                                   //使能ADC中断
    EA = 1;
}

void SET_ADC_DIV(unsigned char Temp)
{
    ADCCFG = Temp % 16;
}

void PRINT_POINT(unsigned char x, unsigned char y, unsigned char status)
{
    //status=1时点亮对应点
    OLED_Set_Pos(x, (63 - y) / 8);
    OLED_WR_Byte(status << ((63 - y) % 8), OLED_DATA);
}

void PRINT_WAVE()
{
    //绘制波形
    int PRINT_WAVE_TEMP_X = 1, PRINT_WAVE_TEMP_Y = 1;

    //清空波形
//    for(PRINT_WAVE_TEMP_X = 0; PRINT_WAVE_TEMP_X < 16 * 3; PRINT_WAVE_TEMP_X++)
//        for(PRINT_WAVE_TEMP_Y = 0; PRINT_WAVE_TEMP_Y < 64 - 16; PRINT_WAVE_TEMP_Y++)
//            PRINT_POINT(PRINT_WAVE_TEMP_X, PRINT_WAVE_TEMP_Y, 0);

    for(PRINT_WAVE_TEMP_X = 0; PRINT_WAVE_TEMP_X < 16 * 3; PRINT_WAVE_TEMP_X++)
        for(PRINT_WAVE_TEMP_Y = 0; PRINT_WAVE_TEMP_Y < 64 - 16; PRINT_WAVE_TEMP_Y++)
        {
            if(PRINT_WAVE_TEMP_Y == WAVE_DATA[PRINT_WAVE_TEMP_X])
                PRINT_POINT(PRINT_WAVE_TEMP_X, PRINT_WAVE_TEMP_Y, 1);
        }
}

void CHANGE_GAIN()
{
    if(VMAX < GAIN_HIGH_LEVEL)
    {
        if(VMAX < GAIN_LOW_LEVEL)
            GAIN = 10; //当输入电压小于GAIN_LOW_LEVEL的时候,放大倍数为10倍
        else
            GAIN = 2; //当输入电压小于GAIN_HIGH_LEVEL的时候,放大倍数为2倍
    }
    else
        GAIN = 0.5; //当输入电压大于GAIN_HIGH_LEVEL的时候,放大倍数为0.5倍
}

void PRINT_DATA()
{
    unsigned int temp;
    //OLED_Clear();//会导致闪烁,影响体验
    PRINT_WAVE();
    OLED_ShowCHinese(0, 0, 0);
    OLED_ShowCHinese(18, 0, 1);
    OLED_ShowCHinese(36, 0, 2);
    OLED_ShowCHinese(54, 0, 3);
    OLED_ShowCHinese(72, 0, 4);
    OLED_ShowCHinese(90, 0, 5);
    OLED_ShowCHinese(108, 0, 6);
    OLED_ShowString(54, 2, "VMAX:", 12);
    OLED_ShowString(54, 3, "GAIN:", 12);
    OLED_ShowString(54, 4, "OFST:", 12);
    OLED_ShowString(54, 5, "MYFPGA.CN", 12);
    OLED_ShowString(54, 6, "LIGH:", 12);
    OLED_ShowString(54, 7, "CALC:", 12);
    //输出实时数据
    temp = VMAX * 100;
    OLED_ShowNum(92, 2, temp, 5, 12); //显示ASCII字符的码值
    temp = GAIN * 100;
    OLED_ShowNum(92, 3, temp, 4, 12); //显示ASCII字符的码值
    OLED_ShowChar(127 - 11, 3, ' ' + 5, 12); //显示%
    temp = OFST * 100;
    OLED_ShowNum(92, 4, temp, 4, 12); //显示ASCII字符的码值
    OLED_ShowChar(127 - 11, 4, ' ' + 5, 12); //显示%

    OLED_ShowNum(92, 6, FREQ, 5, 12); //显示ASCII字符的码值
    CALC = FREQ / 51.2;
    temp = CALC * 100;
    OLED_ShowNum(92, 7, temp, 5, 12); //显示ASCII字符的码值
    CHANGE_GAIN();
}

void Delay5ms()		//@12.000MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 78;
	j = 233;
	do
	{
		while (--j);
	} while (--i);
}

void SYSTEM_INIT()
{
    //输出DAC,并使用ADC采集,将两个数据显示到屏幕
    unsigned char TEMP_DAC, TEMP_ADC;
		float TEMP_OFST;
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0, 0, "MYFPGA.CN", 16);
    OLED_ShowString(0, 2, "Calibrating...", 12);
    SET_ADC_DIV(1);//设置ADC为全速
    ENABLE_ADC_V;

    for(TEMP_DAC = 0; TEMP_DAC < 255; TEMP_DAC++)
    {
        SET_DAC(TEMP_DAC);//设置电压
        ADC_CONTR |= 0x40;                          //启动AD转换
        _nop_();
        _nop_();
        while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
        ADC_CONTR &= ~0x20;                     //清完成标志
        TEMP_ADC = ADC_RES;                           //读取ADC结果
				OLED_ShowNum(45, 4, TEMP_DAC, 5, 12); //DAC
				OLED_ShowNum(45, 5, TEMP_ADC, 5, 12); //DAC
				
				if(TEMP_DAC>TEMP_ADC)
					TEMP_OFST=(TEMP_DAC-TEMP_ADC)/TEMP_ADC;
				else if(TEMP_DAC<TEMP_ADC)
					TEMP_OFST=(TEMP_ADC-TEMP_DAC)/TEMP_DAC;
				
				if(TEMP_OFST<1)
				if(TEMP_OFST>OFST)OFST=TEMP_OFST;
				Delay5ms();
    }
}
//lib.h
#include "STC8.H"

#define ADC_SIG 10
#define ADC_V 	11
#define ADC_FRE 12
#define ADC_REF 15

#define GAIN_HIGH_LEVEL 2.5
#define GAIN_LOW_LEVEL 0.5

#define ENABLE_ADC_SIG	 ADC_CONTR = 0x8A;
#define ENABLE_ADC_V		 ADC_CONTR = 0x8B;
#define ENABLE_ADC_FRE	 ADC_CONTR = 0x8C;
#define ENABLE_ADC_REF	 ADC_CONTR = 0x8F;

#define START_ADC_SIG	 	 ADC_CONTR = 0x4A;
#define START_ADC_V			 ADC_CONTR = 0x4B;
#define START_ADC_FRE		 ADC_CONTR = 0x4C;
#define START_ADC_REF		 ADC_CONTR = 0x4F;

#define DAC7_PIN P17
#define DAC6_PIN P16
#define DAC5_PIN P15
#define DAC4_PIN P11
#define DAC3_PIN P12
#define DAC2_PIN P13
#define DAC1_PIN P14
#define DAC0_PIN P10


#define	GET_BIT(x, bit)	((x & (1 << bit)) >> bit)

void SYSTEM_INIT();
void PRINT_WAVE();
void PRINT_DATA();
void GPIO_INIT();
//void PrintData();
void Timer0Init(void);
void ADC_INIT_ENABLE();
void SET_ADC_DIV(unsigned char Temp);
void SET_DAC(unsigned char DAC_TEMP);
void PRINT_POINT(unsigned char x, unsigned char y, unsigned char status);
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//中景园电子
//店铺地址:http://shop73023976.taobao.com/?spm=2013.1.0.0.M4PqC2
//
//  文 件 名   : oled.c
//  版 本 号   : v2.0
//  作    者   : HuangKai
//  生成日期   : 2014-0101
//  最近修改   :
//  功能描述   : OLED 4接口演示例程(51系列)
//              说明:
//              ----------------------------------------------------------------
//              GND    电源地
//              VCC  接5V或3.3v电源
//              D0   P1^0(SCL)
//              D1   P1^1(SDA)
//              RES  接P12
//              DC   接P13
//              CS   接P14
//              ----------------------------------------------------------------
// 修改历史   :
// 日    期   :
// 作    者   : HuangKai
// 修改内容   : 创建文件
//版权所有,盗版必究。
//Copyright(C) 中景园电子2014/3/16
//All rights reserved
//******************************************************************************/。
#include "oled.h"
//#include "stdlib.h"
#include "oledfont.h"
//#include "delay.h"
//OLED的显存
//存放格式如下.
//[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127
//void delay_ms(unsigned int ms)
//{
//    unsigned int a;

//    while(ms)
//    {
//        a = 1800;

//        while(a--);

//        ms--;
//    }

//    return;
//}
/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{

    OLED_SCLK_Set() ;
    OLED_SDIN_Set();
    OLED_SDIN_Clr();
    OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
    OLED_SCLK_Set() ;
//	OLED_SCLK_Clr();
    OLED_SDIN_Clr();
    OLED_SDIN_Set();

}

void IIC_Wait_Ack()
{

    //GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为上拉输入模式
    //GPIOB->CRH |= 0x00080000;
//	OLED_SDA = 1;
//	delay_us(1);
    //OLED_SCL = 1;
    //delay_us(50000);
    /*	while(1)
    	{
    		if(!OLED_SDA)				//判断是否接收到OLED 应答信号
    		{
    			//GPIOB->CRH &= 0XFFF0FFFF;	//设置PB12为通用推免输出模式
    			//GPIOB->CRH |= 0x00030000;
    			return;
    		}
    	}
    */
    OLED_SCLK_Set() ;
    OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/

void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    unsigned char m, da;
    da = IIC_Byte;
    OLED_SCLK_Clr();

    for(i = 0; i < 8; i++)
    {
        m = da;
        //	OLED_SCLK_Clr();
        m = m & 0x80;

        if(m == 0x80)
        {
            OLED_SDIN_Set();
        }
        else OLED_SDIN_Clr();

        da = da << 1;
        OLED_SCLK_Set();
        OLED_SCLK_Clr();
    }


}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
    IIC_Start();
    Write_IIC_Byte(0x78);            //Slave address,SA0=0
    IIC_Wait_Ack();
    Write_IIC_Byte(0x00);			//write command
    IIC_Wait_Ack();
    Write_IIC_Byte(IIC_Command);
    IIC_Wait_Ack();
    IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
    IIC_Start();
    Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
    IIC_Wait_Ack();
    Write_IIC_Byte(0x40);			//write data
    IIC_Wait_Ack();
    Write_IIC_Byte(IIC_Data);
    IIC_Wait_Ack();
    IIC_Stop();
}
void OLED_WR_Byte(unsigned dat, unsigned cmd)
{
    if(cmd)
    {

        Write_IIC_Data(dat);

    }
    else
    {
        Write_IIC_Command(dat);

    }


}

//坐标设置

void OLED_Set_Pos(unsigned char x, unsigned char y)
{
    OLED_WR_Byte(0xb0 + y, OLED_CMD);
    OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);
    OLED_WR_Byte((x & 0x0f), OLED_CMD);
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
    u8 i, n;

    for(i = 0; i < 8; i++)
    {
        OLED_WR_Byte (0xb0 + i, OLED_CMD); //设置页地址(0~7)
        OLED_WR_Byte (0x00, OLED_CMD);     //设置显示位置—列低地址
        OLED_WR_Byte (0x10, OLED_CMD);     //设置显示位置—列高地址

        for(n = 0; n < 128; n++)OLED_WR_Byte(0, OLED_DATA);
    } //更新显示
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 16/12
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 Char_Size)
{
    unsigned char c = 0, i = 0;
    c = chr - ' '; //得到偏移后的值

    if(x > Max_Column - 1)
    {
        x = 0;
        y = y + 2;
    }

    if(Char_Size == 16)
    {
        OLED_Set_Pos(x, y);

        for(i = 0; i < 8; i++)
            OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);

        OLED_Set_Pos(x, y + 1);

        for(i = 0; i < 8; i++)
            OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);
    }
    else
    {
        OLED_Set_Pos(x, y);

        for(i = 0; i < 6; i++)
            OLED_WR_Byte(F6x8[c][i], OLED_DATA);

    }
}
//m^n函数
u32 oled_pow(u8 m, u8 n)
{
    u32 result = 1;

    while(n--)result *= m;

    return result;
}
//显示2个数字
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size2)
{
    u8 t, temp;
    u8 enshow = 0;

    for(t = 0; t < len; t++)
    {
        temp = (num / oled_pow(10, len - t - 1)) % 10;

        if(enshow == 0 && t < (len - 1))
        {
            if(temp == 0)
            {
                OLED_ShowChar(x + (size2 / 2)*t, y, ' ', size2);
                continue;
            }
            else enshow = 1;

        }

        OLED_ShowChar(x + (size2 / 2)*t, y, temp + '0', size2);
    }
}
//显示一个字符号串
void OLED_ShowString(u8 x, u8 y, u8 *chr, u8 Char_Size)
{
    unsigned char j = 0;

    while (chr[j] != '\0')
    {
        OLED_ShowChar(x, y, chr[j], Char_Size);
        x += 8;

        if(x > 120)
        {
            x = 0;
            y += 2;
        }

        j++;
    }
}
//显示汉字
void OLED_ShowCHinese(u8 x, u8 y, u8 no)
{
    u8 t, adder = 0;
    OLED_Set_Pos(x, y);

    for(t = 0; t < 16; t++)
    {
        OLED_WR_Byte(Hzk[2 * no][t], OLED_DATA);
        adder += 1;
    }

    OLED_Set_Pos(x, y + 1);

    for(t = 0; t < 16; t++)
    {
        OLED_WR_Byte(Hzk[2 * no + 1][t], OLED_DATA);
        adder += 1;
    }
}
///***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
//void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
//{
//    unsigned int j = 0;
//    unsigned char x, y;

//    if(y1 % 8 == 0) y = y1 / 8;
//    else y = y1 / 8 + 1;

//    for(y = y0; y < y1; y++)
//    {
//        OLED_Set_Pos(x0, y);

//        for(x = x0; x < x1; x++)
//        {
//            OLED_WR_Byte(BMP[j++], OLED_DATA);
//        }
//    }
//}

//初始化SSD1306
void OLED_Init(void)
{

    OLED_WR_Byte(0xAE, OLED_CMD); //--display off
    OLED_WR_Byte(0x00, OLED_CMD); //---set low column address
    OLED_WR_Byte(0x10, OLED_CMD); //---set high column address
    OLED_WR_Byte(0x40, OLED_CMD); //--set start line address
    OLED_WR_Byte(0xB0, OLED_CMD); //--set page address
    OLED_WR_Byte(0x81, OLED_CMD); // contract control
    OLED_WR_Byte(0xFF, OLED_CMD); //--128
    OLED_WR_Byte(0xA1, OLED_CMD); //set segment remap
    OLED_WR_Byte(0xA6, OLED_CMD); //--normal / reverse
    OLED_WR_Byte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64)
    OLED_WR_Byte(0x3F, OLED_CMD); //--1/32 duty
    OLED_WR_Byte(0xC8, OLED_CMD); //Com scan direction
    OLED_WR_Byte(0xD3, OLED_CMD); //-set display offset
    OLED_WR_Byte(0x00, OLED_CMD); //

    OLED_WR_Byte(0xD5, OLED_CMD); //set osc division
    OLED_WR_Byte(0x80, OLED_CMD); //

    OLED_WR_Byte(0xD8, OLED_CMD); //set area color mode off
    OLED_WR_Byte(0x05, OLED_CMD); //

    OLED_WR_Byte(0xD9, OLED_CMD); //Set Pre-Charge Period
    OLED_WR_Byte(0xF1, OLED_CMD); //

    OLED_WR_Byte(0xDA, OLED_CMD); //set com pin configuartion
    OLED_WR_Byte(0x12, OLED_CMD); //

    OLED_WR_Byte(0xDB, OLED_CMD); //set Vcomh
    OLED_WR_Byte(0x30, OLED_CMD); //

    OLED_WR_Byte(0x8D, OLED_CMD); //set charge pump enable
    OLED_WR_Byte(0x14, OLED_CMD); //

    OLED_WR_Byte(0xAF, OLED_CMD); //--turn on oled panel
}
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//中景园电子
//店铺地址:http://shop73023976.taobao.com/?spm=2013.1.0.0.M4PqC2
//
//  文 件 名   : oled.h
//  版 本 号   : v2.0
//  作    者   : HuangKai
//  生成日期   : 2014-0101
//  最近修改   :
//  功能描述   : OLED 4接口演示例程(51系列)
//              说明:
//              ----------------------------------------------------------------
//              GND    电源地
//              VCC  接5V或3.3v电源
//              D0   P1^0(SCL)
//              D1   P1^1(SDA)
//              RES  接P12
//              DC   接P13
//              CS   接P14
//              ----------------------------------------------------------------
// 修改历史   :
// 日    期   :
// 作    者   : HuangKai
// 修改内容   : 创建文件
//版权所有,盗版必究。
//Copyright(C) 中景园电子2014/3/16
//All rights reserved
//******************************************************************************/
#include <STC8.H>
#ifndef __OLED_H
#define __OLED_H
//#include "sys.h"
//#include "stdlib.h"
#define  u8 unsigned char
#define  u32 unsigned int
#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据
#define OLED_MODE 0


sbit OLED_SCL = P3 ^ 7; //时钟 D0(SCLK?
sbit OLED_SDIN = P3 ^ 6; //D1(MOSI) 数据


#define OLED_CS_Clr()  OLED_CS=0
#define OLED_CS_Set()  OLED_CS=1

#define OLED_RST_Clr() OLED_RST=0
#define OLED_RST_Set() OLED_RST=1

#define OLED_DC_Clr() OLED_DC=0
#define OLED_DC_Set() OLED_DC=1

#define OLED_SCLK_Clr() OLED_SCL=0
#define OLED_SCLK_Set() OLED_SCL=1

#define OLED_SDIN_Clr() OLED_SDIN=0
#define OLED_SDIN_Set() OLED_SDIN=1





//OLED模式设置
//0:4线串行模式
//1:并行8080模式

#define SIZE 16
#define XLevelL		0x02
#define XLevelH		0x10
#define Max_Column	128
#define Max_Row		64
#define	Brightness	0xFF
#define X_WIDTH 	128
#define Y_WIDTH 	64
//-----------------OLED端口定义----------------

void delay_ms(unsigned int ms);


//OLED控制用函数
void OLED_WR_Byte(unsigned dat, unsigned cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x, u8 y, u8 t);
void OLED_Fill(u8 x1, u8 y1, u8 x2, u8 y2, u8 dot);
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 Char_Size);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size);
void OLED_ShowString(u8 x, u8 y, u8 *p, u8 Char_Size);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(u8 x, u8 y, u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]);
void Picture();
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
void Write_IIC_Byte(unsigned char IIC_Byte);
void IIC_Wait_Ack();
#endif
#ifndef __OLEDFONT_H
#define __OLEDFONT_H
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
/************************************6*8的点阵************************************/
const unsigned char code F6x8[][6] =
{
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
    0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
    0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
    0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
    0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
    0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
    0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
    0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
    0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
    0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
    0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
    0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
    0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
    0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
    0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
    0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
    0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
    0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
    0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
    0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
    0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
    0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
    0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
    0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
    0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
    0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
    0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
    0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
    0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
    0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
    0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
    0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
    0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
    0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
    0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
    0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
    0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
    0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
    0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
    0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
    0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
    0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
    0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
    0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
    0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
    0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
    0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
    0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
    0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
    0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
    0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
    0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
    0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
    0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
    0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
    0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
    0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
    0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
    0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
    0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
    0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
    0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
    0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
    0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
    0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
    0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
    0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
    0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
    0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
    0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
    0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
    0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
    0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
    0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
    0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
    0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
    0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
    0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
    0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
    0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
    0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
    0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
    0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
    0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
    0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
    0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
    0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
    0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
    0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
    0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
    0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
    0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
/****************************************8*16的点阵************************************/
const unsigned char code F8X16[] =
{
    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, //* 10
    0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14
    0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15
    0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, //0 16
    0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //1 17
    0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, //2 18
    0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //3 19
    0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, //4 20
    0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, //5 21
    0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //6 22
    0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, //7 23
    0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, //8 24
    0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, //9 25
    0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26
    0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27
    0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29
    0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30
    0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31
    0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32
    0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, //A 33
    0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, //B 34
    0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, //C 35
    0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //D 36
    0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, //E 37
    0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, //F 38
    0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, //G 39
    0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, //H 40
    0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //I 41
    0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, //J 42
    0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, //K 43
    0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, //L 44
    0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, //M 45
    0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, //N 46
    0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, //O 47
    0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, //P 48
    0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, //Q 49
    0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, //R 50
    0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, //S 51
    0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //T 52
    0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //U 53
    0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, //V 54
    0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, //W 55
    0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, //X 56
    0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, //Y 57
    0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, //Z 58
    0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59
    0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60
    0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61
    0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63
    0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64
    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, //a 65
    0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, //b 66
    0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, //c 67
    0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, //d 68
    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, //e 69
    0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //f 70
    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, //g 71
    0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //h 72
    0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //i 73
    0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, //j 74
    0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, //k 75
    0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, //l 76
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, //m 77
    0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, //n 78
    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, //o 79
    0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, //p 80
    0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, //q 81
    0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, //r 82
    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, //s 83
    0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, //t 84
    0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, //u 85
    0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, //v 86
    0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, //w 87
    0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, //x 88
    0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, //y 89
    0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, //z 90
    0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91
    0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92
    0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93
    0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94
};
unsigned char code Hzk[][32] =
{

    {0x24, 0x24, 0xA4, 0xFE, 0x23, 0x22, 0x00, 0x3E, 0x22, 0x22, 0x22, 0x22, 0x22, 0x3E, 0x00, 0x00},
    {0x08, 0x06, 0x01, 0xFF, 0x01, 0x06, 0x40, 0x49, 0x49, 0x49, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00}, /*"程",0*/
    /* (16 X 16 , 宋体 )*/

    {0x10, 0x10, 0x10, 0xFF, 0x90, 0x20, 0x98, 0x48, 0x28, 0x09, 0x0E, 0x28, 0x48, 0xA8, 0x18, 0x00},
    {0x02, 0x42, 0x81, 0x7F, 0x00, 0x40, 0x40, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x40, 0x00}, /*"控",1*/
    /* (16 X 16 , 宋体 )*/

    {0x20, 0x20, 0xFF, 0x20, 0x20, 0xF8, 0x09, 0x2A, 0x48, 0xF8, 0x48, 0x2A, 0x09, 0xF8, 0x00, 0x00},
    {0x10, 0x30, 0x1F, 0x08, 0x08, 0x01, 0xFD, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFD, 0x01, 0x00, 0x00}, /*"增",2*/
    /* (16 X 16 , 宋体 )*/

    {0x08, 0x08, 0x88, 0x49, 0x2A, 0x08, 0x08, 0x08, 0x08, 0x08, 0x2A, 0x49, 0x88, 0x08, 0x08, 0x00},
    {0x40, 0x41, 0x7E, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x7E, 0x41, 0x40, 0x00}, /*"益",3*/
    /* (16 X 16 , 宋体 )*/

    {0x08, 0x08, 0xF9, 0x4A, 0x48, 0xC8, 0x48, 0x20, 0xD8, 0x17, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x00},
    {0x40, 0x30, 0x0F, 0x20, 0x40, 0x3F, 0x80, 0x40, 0x21, 0x16, 0x08, 0x16, 0x21, 0x40, 0x80, 0x00}, /*"放",4*/
    /* (16 X 16 , 宋体 )*/

    {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00},
    {0x80, 0x80, 0x40, 0x20, 0x10, 0x0C, 0x03, 0x00, 0x03, 0x0C, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00}, /*"大",5*/
    /* (16 X 16 , 宋体 )*/

    {0x80, 0x80, 0x9E, 0x92, 0x92, 0x92, 0x9E, 0xE0, 0x80, 0x9E, 0xB2, 0xD2, 0x92, 0x9E, 0x80, 0x00},
    {0x08, 0x08, 0xF4, 0x94, 0x92, 0x92, 0xF1, 0x00, 0x01, 0xF2, 0x92, 0x94, 0x94, 0xF8, 0x08, 0x00}, /*"器",6*/
    /* (16 X 16 , 宋体 )*/

};

#endif

目前项目已经实现所有功能。

可下载的hex文件:

main.hex

单片机频率设置为12Mhz的时候可以使用OLED显示,设置为35Mhz的时候能够获得最大的带宽,请根据实际应用选择!

项目工程文件:

ADC.7z

ADC无校准.7z


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://www.myfpga.cn/index.php/post/212.html

分享给朋友:

“使用ADC+DAC实现程控增益放大器V3.1,基于STC8G单片机 开源页面” 的相关文章

STC8G1K08 解决P5.5无法使用的问题

STC8G1K08 解决P5.5无法使用的问题

在STC8G系列上电之后,需要初始化P5口端口寄存器代码如下:P5M0 = 0x00;                &...

温控风扇控制板 最大支持十路输出 Tip:类似深度学习实现自动控制

温控风扇控制板 最大支持十路输出 Tip:类似深度学习实现自动控制

电路尺寸:2.7*2.9cm在一般情况下,风扇被设置为:温度超过控制板温度10度时启动风扇,在检测温度大于80度时满速,其中的速度正比与温度你也可以通过串口发送AT指令控制阈值,以及改变模式三种工作模式:1、使用板载温度湿度传感器,可以将板上SIG排座连接至PWM控制风扇的控制引脚2、使用一半的SI...

TI-TM4C123x系列单片机编程救急宝典(持续更新中...)

TI-TM4C123x系列单片机编程救急宝典(持续更新中...)

前言TI-TM4C123x系列单片机的编程有种面向过程的感觉,无论是时钟设置,端口配置,还是操作外设都是采样的函数调用方式。这种方式有很强的结构化感觉,也便于初学者学习。下面作者将从多个角度介绍。本手册更接近应用,跳过了大多的理论和原理,大篇幅讲述如何快速入门和使用起来该单片机,作者更建议读者认真阅...