文章
博客 网店

 TM1650使用经验总结


TM1650真的是个非常好用的芯片,它不仅可以将单片机从按键扫描和LED驱动时序中解放出来,还在硬件上省去了不少的三极管和电阻;

以下是我在使用TM1650时的一些经验,由于手册上没有说明这些细节,只能自己测试验证
1.当使用7段驱动时,DP/KP引脚是输出按键中断信号的,也就是KP;这个在中断检测按键时是非常有用的;KP引脚平时是高电平,当有按键时KP引脚变成低电平,读取按键值后变回高电平;

2.如果你的应用不需要驱动LED,而只用于KEY时,TM1650仍然需要用显示命令来开启按键扫描;这时显示值不重要,重要的显示命令中的显示开,显示关这个位;并且要注意的是上电后需要延时一段时间设置;


//tm1650.c

#include "CAFrame.h"

#define DIS_LEVEL 6  //亮度等级 0:8级 1~7对应1~7级

//设置显示值
void TmDisplayOn(uint8_t addr,uint8_t val)
{
  iic2_start();
  iic2_writebyte(0x48); //发送写显示缓冲区命令
  iic2_writebyte((DIS_LEVEL<<4)|0X09);//7段显示打开
  iic2_stop();
  
  iic2_start();
  iic2_writebyte(addr);
  iic2_writebyte(val);
  iic2_stop();
}

//关闭显示
void TmDisplayOff(void)
{
  iic2_start();
  iic2_writebyte(0x48);
  iic2_writebyte(0x71);
  iic2_stop();
}

//读按键码
uint8_t TmReadKey(void)
{
  uint8_t key;
  
  iic2_start();
  iic2_writebyte(0x49);//命令
  key=iic2_readbyte(IIC_ACK);//按键码
  iic2_stop();
  
  return key;
}

void TmInit(void)
{
   //注:在这个初始化前应使能GPIOA的时钟!
  GPIO_InitTypeDef  GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;        //EXTI初始化结构定义
  NVIC_InitTypeDef NVIC_InitStructure;

   //IRQ引脚初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化

  //使能GPIO中断功能
  EXTI_ClearITPendingBit(EXTI_Line15);//清除中断标志
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);//管脚选择
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式
  EXTI_InitStructure.EXTI_Line = EXTI_Line15; //线路选择
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断
  EXTI_Init(&EXTI_InitStructure);//初始化

  //中断设置
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;       //通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //启动
  NVIC_Init(&NVIC_InitStructure);              //初始化
}

//KEY_INT中断(PA15)处理函数
void EXTI15_10_IRQHandler(void)
{
   frm_set_event(EVENT_KEY_ID);
   EXTI_ClearITPendingBit(EXTI_Line15);//清除中断标志
}


芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved