STM32F103C8T6 使用TM1668编写的按键遥控程序

//DIO PA0 
#define DIO_L            GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define DIO_H            GPIO_SetBits  (GPIOA,GPIO_Pin_0)    
#define DATA_READ     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

//CLK PC15
#define CLK_L            GPIO_ResetBits(GPIOC,GPIO_Pin_15)
#define CLK_H            GPIO_SetBits  (GPIOC,GPIO_Pin_15)

//STB PC14
#define STB_L        GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define STB_H        GPIO_SetBits  (GPIOC,GPIO_Pin_14)


void DIO_GPIO_OUT_Init(void);
void DIO_GPIO_IN_Init(void);
void CLK_GPIO_OUT_Init(void);
void STB_GPIO_OUT_Init(void);

void TM1668_Start(void);
void TM1668_End(void);
void Write_Byte(uint8_t byte);
void send_command(uint8_t cmd );  //发送命令字节
void display(void);
void  display1 (void);
void  display2 (void);

void read_bite(void);
void read_key1(void);

以上是.H文件

结构体配置

void DIO_GPIO_OUT_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStructure);        
}
void DIO_GPIO_IN_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStructure);        
        
}
void CLK_GPIO_OUT_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOC, &GPIO_InitStructure);        
}
void STB_GPIO_OUT_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_Init(GPIOC, &GPIO_InitStructure);        
}


    void TM1668_Start(void)
{
    CLK_H;
 DIO_H;
 STB_L;
    DHT11_DELAY_US(2);
}

void TM1668_End(void)
{
CLK_H;
DIO_H;
STB_H;
DHT11_DELAY_US(2);
}

/***************发送8bit数据,从低位开始**************/
void Write_Byte(uint8_t byte){
    uint8_t i=0;
 CLK_H;
    for(i=0;i<8;i++)
 {
        CLK_L;
        if(byte&0x01)
   {
            DIO_H;
         }
  else
     {
                DIO_L;
           }
    DHT11_DELAY_US(1);
        CLK_H;
     DHT11_DELAY_US(3);
        byte>>=1;
    }
 DHT11_DELAY_US(1);
}

/******************发送控制命令***********************/
void send_command(uint8_t cmd )  //发送命令字节
{
 
 STB_H;     //STB置高
 DHT11_DELAY_US(2);
 STB_L;                          //STB置低
  DHT11_DELAY_US(2);
 Write_Byte(cmd);
DHT11_DELAY_US(2); //发送8bit数据
}

void  display (void)   //显示关闭程序
{
 DIO_GPIO_OUT_Init();
 CLK_GPIO_OUT_Init();
 STB_GPIO_OUT_Init();
 TM1668_Start();
  send_command(0x80);        
  STB_H;
TM1668_End( );
}

void  display1 (void)   //固定地址显示A
{
 DIO_GPIO_OUT_Init();
 CLK_GPIO_OUT_Init();
 STB_GPIO_OUT_Init();
 TM1668_Start();
// uint8_t i;
send_command(0x00);     
send_command(0x44);    

 //数码管1
 send_command(0xC0);
Write_Byte(0x77);
 send_command(0xC1);
 Write_Byte(0x00); 
  send_command(0xC2);    
Write_Byte(0x77);
 send_command(0xC3);
 Write_Byte(0x00); 
  send_command(0xC4);    
Write_Byte(0x77);
 send_command(0xC5);
 Write_Byte(0x00); 
  send_command(0xC6);
Write_Byte(0x77);
 send_command(0xC7);
 Write_Byte(0x00); 
  send_command(0xC8);    
Write_Byte(0xFF);
 send_command(0xC9);
 Write_Byte(0x00); 
  send_command(0xCA);    
Write_Byte(0xFF);
 send_command(0xCB);
 Write_Byte(0x00); 
  send_command(0xCC);    
Write_Byte(0x00);
 send_command(0xCD);
 Write_Byte(0x00); 

  send_command(0x8D);        
  STB_H;
TM1668_End( );
}
void  display2 (void)    //固定地址显示2
{
 DIO_GPIO_OUT_Init();
 CLK_GPIO_OUT_Init();
 STB_GPIO_OUT_Init();
 TM1668_Start();
// uint8_t i;
send_command(0x00);     
send_command(0x44);   

 //数码管1  
  send_command(0xC0);    
Write_Byte(0x5B);
 send_command(0xC1);
 Write_Byte(0x00); 
 
  send_command(0xC2);    
Write_Byte(0x5B);
 send_command(0xC3);
 Write_Byte(0x00); 
  send_command(0xC4);    
Write_Byte(0x5B);
 send_command(0xC5);
 Write_Byte(0x00); 
  send_command(0xC6);    
Write_Byte(0x5B);
 send_command(0xC7);
 Write_Byte(0x00); 
  send_command(0xC8);    
Write_Byte(0xFF);
 send_command(0xC9);
 Write_Byte(0x00); 
  send_command(0xCA);    
Write_Byte(0x00);
 send_command(0xCB);
 Write_Byte(0x00); 
  send_command(0xCC);    
Write_Byte(0x00);
 send_command(0xCD);
 Write_Byte(0x00); 

  send_command(0x8F);        
  STB_H;
TM1668_End( );
}

uint8_t key[5]={0};
void read_bite(void)//按键读取,读取5个字节的数据,这个按键读取注意延时时间
{
u8 i,j;
send_command(0x42);
DIO_H;
 for(j=0;j<5;j++)
 {
 for(i=0;i<8;i++)    
 {
   CLK_L;
   key[j]=key[j]>>1;
   CLK_H;
   if(DATA_READ)
    key[j]= key[j]|0x80;
   DHT11_DELAY_US(3);
 }
 DHT11_DELAY_US(5);
 }

TM1668_End();

}

void read_key1(void)//12个按键的按键对应程序
{
 read_bite(); 
if(key[0]==0x01) {display1();}
if(key[0]==0x02) {display2();}
if(key[0]==0x08){display();}
if(key[0]==0x10){display1();}
if(key[1]==0x01) {display1();}
if(key[1]==0x02) {display2();}
if(key[1]==0x08){display();}
if(key[1]==0x10){display1();}
if(key[2]==0x01) {display1();}
if(key[2]==0x08){display2();}
if(key[3]==0x01) {display1();}
if(key[3]==0x08){display2();}

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CXD1994CXD

谢谢各位小主

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值