📄 main.c
字号:
/******************************************************************/
/*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd. */
/* Module Name : GPIO XINT1 */
/* File Name : main.c */
/* Author : 侯长波 */
/* Create Date : 2009/12/27 */
/* Version : 2.0 */
/* Function : */
/* Description : */
/* Support : www.LT430.com */
/******************************************************************/
/*****************头文件********************/
#include "DSP281x_Device.h"
#include "System.h"
/****************端口宏定义*****************/
#define PS2_CLK GpioDataRegs.GPEDAT.bit.GPIOE0
#define PS2_DATA GpioDataRegs.GPDDAT.bit.GPIOD6
/****************常量宏定义*****************/
/***************全局变量定义****************/
/****************函数声明*******************/
unsigned char Receive_PS2(void);
interrupt void X_INT1(void);
unsigned char Dill_key(unsigned char num);
void Init_PS2(void);
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:主函数 */
/*------------------------------------------*/
void main(void)
{
InitSysCtrl(); // 系统初始化子程序,在DSP28_sysctrl.c中
Init_PS2();
while(1);
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:接收键值 */
/*------------------------------------------*/
unsigned char Receive_PS2(void)
{
unsigned char i,temp=0;
while(!PS2_CLK);//等待时钟变为高
for(i=0;i<8;i++)
{
temp>>=1;
while(PS2_CLK);
if(PS2_DATA) temp=temp|0x80;
while(!PS2_CLK);
}
for(i=0;i<3;i++)
{while(PS2_CLK);
while(!PS2_CLK);
}
return(temp);
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:X_INT1中断处理函数 */
/*------------------------------------------*/
interrupt void X_INT1(void)
{
unsigned char key;
DINT;//关闭总中断
if(PS2_DATA) goto back;
key=Receive_PS2();
if(key==0xe0)
{
key=Receive_PS2();
if(key==0xf0) goto back;
else key=Dill_key(key);
}
else if(key==0xf0) goto back;
else key=Dill_key(key);
back:
PieCtrlRegs.PIEIFR1.bit.INTx4=0;//清零中断标志位
PieCtrlRegs.PIEACK.all |= BIT0; //响应中断
EINT; //开总中断
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:键盘散转处理 */
/*------------------------------------------*/
unsigned char Dill_key(unsigned char num)
{
switch(num)
{
case 0x77:;break;//Num lock
case 0x4a:;break;// /
case 0x7c:;break;// *
case 0x7b:;break;// -
case 0x79:;break;// +
case 0x5a:;break;// Enter
case 0x71:;break;// .
case 0x70:;break;// 0
case 0x69:;break;// 1
case 0x72:;break;// 2
case 0x7a:;break;// 3
case 0x6b:;break;// 4
case 0x73:;break;// 5
case 0x74:;break;// 6
case 0x6c:;break;// 7
case 0x75:;break;// 8
case 0x7d:;break;// 9
case 0x66:;break;// Bksp
default:break;
}
return(num);
}
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void */
/*函数描述:初始化中断 */
/*------------------------------------------*/
void Init_PS2(void)
{
DINT; //关闭总中断
EALLOW;
XIntruptRegs.XINT1CR.bit.POLARITY=0;//下降沿产生中断
XIntruptRegs.XINT1CR.bit.ENABLE=1; //使能XINT1中断
PieVectTable.XINT1= &X_INT1; //中断服务程序入口地址放入中断向量表
EDIS;
//依次使能各级中断:外设中相应中断位->PIE控制器->CPU
PieCtrlRegs.PIEIER1.bit.INTx4=1;//XINT1使能位于PIE第1组第4个,使能
IER|= M_INT1;//PIE第1组对应于CPU的可屏蔽中断1
EINT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -