X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
瑞萨电子MCU
[原创] 【R7F0C809】简易电子锁密码校验与时间显示功能已实现
wgsxsm
2015-11-15 22:28
楼主
接上贴:
https://bbs.eeworld.com.cn/thread-476175-1-1.html
在添加完AD按键和OLED显示功能的情况下,现在加入了RTC时钟显示和EEPROM存储电子锁密码的功能。 通过模拟IIC来实现,在一组IIC线上外挂一个PCF8563和一个AT24C02,通过设定PCF8563每秒一次的中断来更新时间; 通过对AT24C02进行数据的读取与存储来进行密码的管理。 ~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.硬件部分
IIC_SCL--P02 IIC_SDA--P03 PCF_INT--P00
R7F0C809主控板通过杜邦线与各模块相连。 需要说明的是:PCF8563通过配置寄存器0E和0F来产生每秒钟进行INT pin一次中断, 由于模块电路忘记对该PIN进行加上拉电阻,软件里不得不配置该PIN脚P00为上拉输入。
2.软件部分
贴上来部分代码并给予说明
static void IIC_SW_IO_Config(void)
{
PMC0 &= 0xf3; /* P0.2&P0.3:Digital I/O */
POM0 &= 0xf3; /* P0.2&P0.3:Normal output mode.*/
P0 |= 0x0c; /* P0.2&P0.3:set 1*/
PM0 &= 0xf3; /* P0.2&P0.3:Output mode */
}
void IIC_Init(void)
{
IIC_SW_IO_Config();
}
更新INTC_Create函数,因为PCF_INF采用了外部中断方式.
void INTC_Create(void)
{
PMK0 = 1U; /* disable INTP0 operation */
PIF0 = 0U; /* clear INTP0 interrupt flag */
PMK1 = 1U; /* disable INTP1 operation */
PIF1 = 0U; /* clear INTP1 interrupt flag */
PMK2 = 1U; /* disable INTP2 operation */
PIF2 = 0U; /* clear INTP2 interrupt flag */
PMK3 = 1U; /* disable INTP3 operation */
PIF3 = 0U; /* clear INTP3 interrupt flag */
PMK4 = 1U; /* disable INTP4 operation */
PIF4 = 0U; /* clear INTP4 interrupt flag */
PMK5 = 1U; /* disable INTP5 operation */
PIF5 = 0U; /* clear INTP5 interrupt flag */
/* Set INTP1/5 priority */
PPR11 = 0U; //priority-->0
PPR01 = 0U;
PPR15 = 0U; //priority-->1
PPR05 = 1U;
EGN0 = 0x22U; //INTP1/5--Falling edge.
EGP0 = 0x02U; //INTP1--Rising edge.
}
另外说明的是,K1按键也即是P11-INTP1脚采用的是双边沿检测, 其功能是按下后,蜂鸣器叫,一直到松开按键后,蜂鸣器停止发声。 这样按键K1也即是起到了门铃作用。
__interrupt void INTC1_Interrupt(void)
{
/* Waiting about 10ms for rejection */
while (!TMIF00)
{
HALT(); /* Waiting of TM00 interrupt request */
}
TMIF00 = 0U; /* INTTM00 interrupt request clear */
LED_Toggle();
/* After 10ms or more from when the SW is turned ON */
/* check the status of the SW again */
if (P1.1==0) /* Is SW really ON ? */
{
BUZ_On();
}
else if (P1.1==1)
{
BUZ_Off();
}
PIF0 = 0U; /* INTP0 interrupt request clear */
/* End user code. Do not edit comment generated here */
}
PCF_INT PIN每秒产生一次中断,通过该中断告知设置的定时器到了,将更新时间标志位置位。
__interrupt void INTC5_Interrupt(void)
{
if (P0.0==0)
{
time_Refresh=1;
PCF8563_WriteAdress(CTRL_BUF2,0x01); //TF-->0,w to clear:timer flag is cleared
}
PIF5 = 0U; /* INTP5 interrupt request clear */
}
为了得到更好的体验,将MCU的TAU0_Channel0配置为间隔时间为4ms的定时器,这样对模拟输入引脚的电压进行 6 次 A/D 采集,去掉最大、最小值并求平均。重复上述操作,如果两次获得的平均值相同,即确认当前按键。因此按键按下的确认时间为 4×6×2=48ms.此时的AD按键输入性能才能达到最佳。
void TAU0_Create(void)
{
TAU0EN = 1U; /* supplies input clock */
TPS0 |= 0x04U; /* 1.25MHz */
/* Stop all channels */
TT0 |= 0x0FU;
/* Mask channel 0 interrupt */
TMMK00 = 1U; /* disable INTTM00 interrupt */
TMIF00 = 0U; /* clear INTTM00 interrupt flag */
/* Set INTTM00 low priority */
TMPR100 = 1U;
TMPR000 = 1U;
/* Channel 0 used as interval timer */
TMR00H = 0x00U;
TMR00L = 0x00U;
/* 4ms interval compare value */
TDR00H = 0x13U; //1250*4-1=4999
TDR00L = 0x87U;
TO0 &= 0x0EU;
TOE0 &= 0x0EU;
}
EEPROM操作部分在上电时会进行检测,是否为新的AT24C02,如果是,将对该新器件进行写入密码初始值(151122--作品最晚提交日期),并将给密码进行打包,包头为0x55,包尾为0xAA,以进行下次开机时读取判定。
void EEReadPassword(void)
{
uint8_t i;
for(i=0;i<8;i++)
{
EEBuffer[i]= AT24CXX_ReadOneByte(i);
}
/*The flag of valid password*/
if(EEBuffer[0]==0x55 && EEBuffer[7]==0xAA)
{
NewDevice_Sign=0;
for(i=0;i<8;i++)
{
PassWords[i]= EEBuffer[i];
}
}
else
{
NewDevice_Sign=1;
}
}
void EEWritePassword(void)
{
uint8_t i;
for(i=0;i<8;i++)
{
AT24CXX_WriteOneByte( i, PassWords[i]);
}
}
AD按键操作处,处于实时进行检测,密码输入完毕后,以#为结尾进行通知进行校验,检测到第七位为#则进行比对密码,其余则认为密码无效,即便输入了正确密码;密码比对成功,则提示“密码正确”;否则,则表示密码错误。
if(g_Last_AD_Key_Code != g_Live_AD_Key_Code) /* Current key update? */
{
g_Last_AD_Key_Code = g_Live_AD_Key_Code;
if(g_Live_AD_Key_Code!=13) /*valid key*/
{
if(NoticeTimeDelay!=0) return;
if(KeyWordShowPosition==6)
{
if(g_Live_AD_Key_Code==12)
{
/*compare*/
if( KeyWords[0]==PassWords[1] && KeyWords[1]== PassWords[2]
&&KeyWords[2]==PassWords[3] && KeyWords[3]==PassWords[4]
&&KeyWords[4]==PassWords[5] && KeyWords[5]==PassWords[6] ) /* correct key */
{
NoticeKeywordStatus(STATUS_OK);
/*
OPEN THE DOOR!
*/
BUZ_Call_Long(1500); /*1.5s*/
}
else /* error key */
{
NoticeKeywordStatus(STATUS_ERROR);
BUZ_Call(2); /*call 2 times*/
}
NoticeTimeDelay=500;
}
else
{
/* invalid key */
NoticeKeywordStatus(STATUS_INVALID);
NoticeTimeDelay=300;
BUZ_Call(2); /*call 2 times*/
}
KeyWordShowPosition=0;
}
else
{
KeyWords[KeyWordShowPosition]=g_Live_AD_Key_Code;
KeyValue_Display(40+KeyWordShowPosition*8,2,g_Live_AD_Key_Code);
KeyWordShowPosition++;
}
}
}
由于硬件上AD按键没有给出各按键的标识“123456789*0#”,因此在OLED上显示出按键值来进行录像,否则无法观看处效果。
3.操作演示
本帖最后由 wgsxsm 于 2015-11-15 22:47 编辑
点赞
回复评论
暂无评论,赶紧抢沙发吧
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
2010年智能手机市场5大预测
电源上磁珠怎么取值?
关于串口DMA发送问题
在ARM逻辑上实现TCP/IP协议的简单方法
剪切应力对取向硅钢片铁损的影响
在verilog hdl中,既然while,repeat,forever语句不能被综合,那还有什么用呢?
WEBENCH设计怎么修改元件参数?
奇葩的一万亿次,who cares?
新手求助,谢了
分析 I2C不通,可能的原因分析
C# .NET2.0 WINCE 下使用serialport 类开发串口程序 ?
无线电2.4G和5G哪个更好
MSP430G2 在CCSV4中debug出错(已解决)
阅读并了解是德科技汽车电子、物联网(IOT) 精彩专题,答题赢好礼!活动开始啦!
VC5509A 用DMA向MCBSP0发送时只进入一次中断,然后再也没有进入过,而接收时用中断...
自己做的STM32 板
说电感器、变压器检测
【TI首届低功耗设计大赛】鹰眼——汇总贴
DSP+FPGA+ASIC的实时图像处理架构设计
【邀请函】参观慕尼黑电子展,领略ST万物智能技术
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复