sc7461_0831.c
来自「红外遥控键盘的驱动程序 由凌阳单片机SPCE061A驱动」· C语言 代码 · 共 99 行
C
99 行
#include "SPCE061V004.h"
#include "unSPMACRO.h"
#define ClearWatchDog() *P_Watchdog_Clear=0x0001
unsigned int ui_KeyCnt=0;//周期记数,计算周期
unsigned int ui_KetCntTemp=0;
unsigned int ui_KeyCode=0xffff;//键值
unsigned int ui_KeyCodeTemp=0x0000;//键值中间变量
unsigned int ui_SquNumber=0;//编码脉冲记数
unsigned int ui_KeyDown=0;//0无键按下,1有键按下
void InitialHYF_24J()
{
asm("int off\n");//关中断
*P_INT_Ctrl=0x0000;
*P_IOA_Dir=0xffff;//LED端口初始化,用与测试按键用
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
*P_IOB_Dir &= 0xfffb;//设置IOB2为带上拉电阻输入口
*P_IOB_Attrib |= 0x0004;
*P_IOB_Data &= 0xfffb;
//*P_IOB_Dir |= 0xfffb;
//*P_IOB_Attrib |= 0xfffb;
//*P_IOB_Data = 0xfffb;
*P_TimerB_Data=300;//预置记数值
*P_TimerB_Ctrl=0x0002;//32768HZ
*P_INT_Ctrl=0x0500;//开IRQ3_EXT1,IRQ2_TMB中断
asm("irq on\n");//开IRQ中断
ClearWatchDog();
}
void IRQ3() __attribute__ ((ISR)) ;
void IRQ3()
{
ClearWatchDog();//清中断
ui_KetCntTemp++;//外部中断既上升沿触发也下降沿触发
if(ui_KetCntTemp==3)
{
ui_KetCntTemp=1;
ui_KeyCnt=*P_TimerB_Data;//周期值
*P_TimerB_Data=0;
*P_TimerB_Ctrl=0x0002;//32768HZ
if(ui_KeyCnt<300)//为用户码或者数据码
{
ui_SquNumber++;
if((ui_SquNumber>26)&&(ui_SquNumber<=42))//数据码
{
ui_KeyCodeTemp >>= 1;
if(ui_KeyCnt<50)//为0
{
ui_KeyCodeTemp &= 0x7fff;
}
else//为1
{
ui_KeyCodeTemp |= 0x8000;
}
}
else//用户码
{
}
if(ui_SquNumber==42)//解码完毕
{
ui_SquNumber=0;
ui_KeyCode=ui_KeyCodeTemp;
ui_KeyCodeTemp=0x0000;
ui_KeyDown=1;
}
else//编码检查完毕
{
}
}//if(ui_KeyCnt<300)
else//为引导码
{
ui_SquNumber = 0;
}
}//if(ui_KetCntTemp==3)
else
{
}
*P_INT_Clear=0x0100;//清中断
}
void IRQ2() __attribute__ ((ISR)) ;
void IRQ2()
{
ClearWatchDog();
*P_TimerB_Data=300;//置数使计数进入特殊状态
*P_TimerB_Ctrl=0x0002;//32768HZ
*P_INT_Clear=0x0400;//清中断
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?