小学生
最后登录1970-1-1
在线时间 小时
注册时间2021-8-2
|
本帖最后由 罗辑 于 2024-4-14 20:04 编辑
/*
*函数功能:TM1650初始化
*提 示:tm1650挂载4个按键,外部中断挂载两个按键
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void TM1650_Init(void)
{
IIC_Init();
delay_ms(20);
TM1650_Wr_RAM(0x48,0x71);//7段显示
}
/*
*函数功能:挂载在tm1650上按键扫描
*提 示:无
*输入参数:
*输出参数:无
*返回值 :无
*/
static u8 KEYtm_Scan(void)
{
u8 Temp = 0;
/*读取按键值*/
IIC_Start();
IIC_Wr_Byte(0x4f);
IIC_Wait_Ack();
Temp = IIC_Rd_Byte();
IIC_Ack();
IIC_Stop();
return Temp;
}
/*
*函数功能:按键扫描
*提 示:无
*输入参数:
*输出参数:无
*返回值 :u8:检测到的按价值
*/
u8 KEY_Read(void)
{
u8 Temp = 0;
if(KEY_EXTI != 0)
{
Temp = KEY_EXTI;
KEY_EXTI = 0;
return Temp;
}
Temp = KEYtm_Scan();
if(Temp != 0)
{
return Temp;
}
return 0;
}
/*
*函数功能:TM1650通讯IIC初始化
*提 示:tm1650挂载4个按键,外部中断挂载两个按键
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*IO初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*空闲状态*/
SCL_Set;
SDA_Set;
}
/*
*函数功能:IIC起始
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Start(void)
{
SCL_Set;
// delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
SDA_Reset;
delay_ms(IIC_uS);
SCL_Reset;
delay_ms(IIC_uS);
}
/*
*函数功能:IIC结束
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Stop(void)
{
SCL_Reset;
delay_ms(IIC_uS);
SDA_Reset;
delay_ms(IIC_uS);
SCL_Set;
delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
}
/*
*函数功能:IIC响应
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Ack(void)
{
SCL_Reset;
delay_ms(IIC_uS);
SDA_Reset;
delay_ms(IIC_uS);
SCL_Set;
delay_ms(3);
SCL_Reset;
delay_ms(IIC_uS);
}
/*
*函数功能:IIC非响应
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_NoAck(void)
{
SCL_Reset;
delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
SCL_Set;
delay_ms(IIC_uS);
SCL_Reset;
}
/*
*函数功能:IIC等待响应
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
#define Wait_uS 20
static u8 IIC_Wait_Ack(void)
{
u8 uS = 0;
SCL_Reset;
delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
SCL_Set;
delay_ms(IIC_uS);
while(SDA_Read == 1)
{
delay_ms(10);
uS++;
if(uS >= Wait_uS)
{
IIC_Stop();
delay_ms(IIC_uS);
return 1;
}
}
SCL_Reset;
delay_ms(IIC_uS);
return 0;
}
/*
*函数功能:IIC写字节
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void IIC_Wr_Byte(u8 Data)
{
u8 i = 0;
for(i = 0; i < 8; i++)
{
SCL_Reset;
delay_ms(IIC_uS);
if(Data >> 7)
{
SDA_Set;
}
else
{
SDA_Reset;
}
Data <<= 1;
delay_ms(IIC_uS);
SCL_Set;
delay_ms(IIC_uS);
}
SCL_Reset;
delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
}
/*
*函数功能:IIC读字节
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static u8 IIC_Rd_Byte(void)
{
u8 i = 0;
u8 Temp = 0;
GPIO_InitTypeDef GPIO_InitStructure;
/*IO初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SCL_Reset;
delay_ms(IIC_uS);
SDA_Set;
delay_ms(IIC_uS);
for(i = 0; i < 8; i++)
{
SCL_Reset;
delay_ms(IIC_uS);
Temp <<= 1;
Temp += SDA_Read;
SCL_Set;
delay_ms(IIC_uS);
}
SCL_Reset;
delay_ms(IIC_uS);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
return Temp;
}
u8 ack=0;
/*
*函数功能:写显存
*提 示:
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void TM1650_Wr_RAM(u8 Address, u8 Data)
{
IIC_Start();
IIC_Wr_Byte(Address);
ack=IIC_Wait_Ack();
IIC_Wr_Byte(Data);
IIC_Wait_Ack();
IIC_Stop();
}
|
-
|