第一位0x68的
第二位0x6A的
第三位0x6C的
第四位0x6E的
系统指令0x48的
总图
#define NUM_L 0x38
#define NUM_O 0x3F
#define NUM_V 0x7E
#define NUM_E 0x79
#define LEDDOT 0x80//小数点
uint8_t i;
//主函数处理,系统资源管理线程独占阻塞模式
int main(void)
{
systick_config();
myGPIO_init();
delay_ms(10);
i2c_init();
while(1)
{
GN1650_display();
delay_ms(1000);
GN1650_display_D();
delay_ms(1000);
}
}
/********** 数码管显示 **********/
void GN1650_display(void)
{
//love
GN1650_Wrt_RAM(0x68,NUM_L);
GN1650_Wrt_RAM(0x6A,NUM_O);
GN1650_Wrt_RAM(0x6C,NUM_V);
GN1650_Wrt_RAM(0x6E,NUM_E);
GN1650_Wrt_RAM(0x48,0x01);
}
/********** 数码管无显示 **********/
void GN1650_display_D(void)
{
GN1650_Wrt_RAM(0x48,0x00);
}
/********** IIC初始化 *********/
void i2c_init(void)
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOB);
/* enable I2C0 clock */
rcu_periph_clock_enable(RCU_I2C0);
/* connect PB6 to I2C0_SCL */
//gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6);
/* connect PB7 to I2C0_SDA */
// gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_6);//PB6_42 I2C0_SCL
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43 I2C0_SDA
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
/* configure I2C0 clock */
//i2c_clock_config(I2C0,60000,I2C_DTCY_2);
/* enable I2C0 */
i2c_enable(I2C0);
/* enable acknowledge */
i2c_ack_config(I2C0,I2C_I2CMODE_ENABLE);
/* 空闲状态 */
gpio_bit_write(GPIOB,GPIO_PIN_6,1);
gpio_bit_write(GPIOB,GPIO_PIN_7,1);
GN1650_Wrt_RAM(0x48,0x00);//关闭显示
}
void SDA_Rx(void) //主机recv from 从机
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
}
void SDA_Tx(void) //主机 send to 从机
{
/* enable GPIOB clock */
rcu_periph_clock_enable(RCU_GPIOB);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43 I2C0_SDA
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
}
void IIC_SCL(uint8_t n)
{
gpio_bit_write(GPIOB,GPIO_PIN_6,n);
}
void IIC_SDA(uint8_t n)
{
gpio_bit_write(GPIOB,GPIO_PIN_7,n);
}
static void IIC_Delay(void)
{
__IO uint16_t cnt=1;
while(cnt--);
}
/*********************模拟IIC通信****************/
/*
*函数功能:IIC起始
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Start1(void)
{
SDA_Tx();
//2、SCL 1
IIC_SCL(1);
//3、SDA 1
IIC_SDA(1);
//延时5us
IIC_Delay();
//4、SCL 0
IIC_SDA(0);
//延时5us
IIC_Delay();
//5、SDA 0
IIC_SCL(0);
//延时5us
IIC_Delay();
}
/*
*函数功能:IIC结束
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Stop1(void)
{
//2、SCL 1
IIC_SCL(1);
//3、SDA 0
IIC_SDA(0);
//延时5us
IIC_Delay();
//4、SDA 1
IIC_SDA(1);
//延时5us
IIC_Delay();
}
/*
*函数功能:IIC应答
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
void IIC_ACK(void)
{
SDA_Rx();
IIC_SCL(0);
IIC_Delay();
IIC_SDA(0); //
IIC_Delay();
IIC_SCL(1);
IIC_Delay();
IIC_SCL(0);
IIC_Delay();
SDA_Tx();
IIC_SDA(0);
IIC_Delay();
}
/****************模拟IIC通信**************/
// write to RAM
void GN1650_Wrt_RAM(uint8_t Address, uint8_t Data)
{
IIC_Start1();
IIC_Wrt_Byte(Address);
IIC_ACK();
IIC_Wrt_Byte(Data);
IIC_ACK();
IIC_Stop1();
}
// IIC write one byte data
void IIC_Wrt_Byte(uint8_t data)
{
int i;
IIC_SCL(0); //拉低时钟开始数据传输
for(i = 0;i < 8;i++)
{
//IIC_SDA((data & 0x80)>0 ); //check bit0
//data >>= 1;
IIC_SDA((data & 0x80)>0 ); //check bit7
data <<= 1;
IIC_Delay(); //这三个延时都是必须的
IIC_SCL(1);
IIC_Delay();
IIC_SCL(0);
IIC_Delay();
}
}
注意void SDA_Tx(void)这个函数可有可无,因为I2c_init()里初始化默认PB7是OUTPUT;此外,这三句注释不注释,都没有影响
/* connect PB6 to I2C0_SCL */
//gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6);
/* connect PB7 to I2C0_SDA */
// gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7);
/* configure I2C0 clock */
//i2c_clock_config(I2C0,60000,I2C_DTCY_2);
void GN1650_display(void)
{
static uint16_t value=0;
GN1650_Wrt_RAM(0x68,LEDENCODE[value/1000%10]);//high
GN1650_Wrt_RAM(0x6A,LEDENCODE[value/100%10] ); // | LEDDOT);
GN1650_Wrt_RAM(0x6C,LEDENCODE[value/10%10]);
GN1650_Wrt_RAM(0x6E,LEDENCODE[value%10]); //low
GN1650_Wrt_RAM(0x48,0x01);//0x48 系统指令,调节亮度 ,0x01现在是最亮 // 0x41//4级亮度 8段显示 显示开
value++;
if(value>9999) value=0;
}
只要IIC模拟出来了,GN1650数码管能点亮了,至于显示什么,怎么显示,都大同小异了。
视频中数码管亮度不是很亮的原因是,数码管的电路串了电阻;
GN1650
//IIC_SDA((data & 0x01)>0 ); //check bit0
// data >>= 1;
注意GN1650是先传高位再传低位,我之前就是先传的低位,所以数码管不显示,此外要观察芯片对应的时序图,比如开始条件是SCL和SDA都为高电平,SDA先为低电平,SCL再为低电平,结束条件反之亦然;还有延时函数之前用的系统的delay_us(); 后来封装了一个简短的 IIC_Delay();时序的频率会更快;
如有不清楚的可以看看《调试篇》的三篇IIC合集