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);//清除中断标志
}
|
|