📄 key.c
字号:
//*****************************************************
// 4*4键盘控制单元
//*****************************************************
#include <msp430x16x.h>
#include "XITONG.H"
//******************************************************************************
#define SIZE_OF_KEYBD_MENU 11 //菜单长度
#define uchar unsigned char
uchar KeyFuncIndex=0;
void (*KeyFuncPtr)(); //按键功能指针
typedef struct
{
uchar KeyStateIndex; //当前状态索引号
uchar KeyDnState; //按下"向下"键时转向的状态索引号
uchar KeyUpState; //按下"向上"键时转向的状态索引号
uchar KeyCrState; //按下"回车"键时转向的状态索引号
uchar KeyQuxiao; //按下"取消"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
} KbdTabStruct;
KbdTabStruct const KeyTab[SIZE_OF_KEYBD_MENU]=
{
//序-下-上-确-返------------------
{ 0, 1, 4, 1, 0,(*d0_5_1)},//顶层菜单
//-----------------------------------------
{ 1, 2, 4, 1, 1,(*d0_5_2)},//顶层 "图形显示"
{ 2, 3, 1, 10, 2,(*d0_5_3)},//顶层 "实时数据"
{ 3, 4, 2, 3, 3,(*d0_5_4)},//顶层 "其它告警"
{ 4, 1, 3, 5, 4,(*d0_5_5)},//顶层 "系统维护"
{ 5, 6, 5, 6, 0,(*d1_5_1)},//系统维护-->子菜单
//-----------------------------------------
{ 6, 7, 9, 6, 0,(*d1_5_2)},//时间设置
{ 7, 8, 6, 7, 0,(*d1_5_3)},//网络下载
{ 8, 9, 7, 8, 0,(*d1_5_4)},//查询空间
{ 9, 6, 8, 9, 0,(*d1_5_5)},//系统配置
{ 10,10, 10, 10, 0,(*d2)},//
};
//******************************************************************************
void Init_Port()
{
//将P1口所有的管脚在初始化的时候设置为输入方式
P1DIR = 0;
//将P1口所有的管脚设置为一般I/O口
P1SEL = 0;
// 将P1.0 P1.1 P1.2 P1.3设置为输出方向
P1DIR |= BIT4;
P1DIR |= BIT5;
P1DIR |= BIT6;
P1DIR |= BIT7;
//先输出低电平
P1OUT = 0x00;
// 将中断寄存器清零
P1IE = 0;
P1IES = 0;
P1IFG = 0;
//打开管脚的中断功能
//对应的管脚由高到低电平跳变使相应的标志置位
P1IE |= BIT0;
P1IES|= BIT0;
P1IE |= BIT1;
P1IES|= BIT1;
P1IE |= BIT2;
P1IES|= BIT2;
P1IE |= BIT3;
P1IES |= BIT3;
}
void DDelay(unsigned int i) //延时子程序
{
while(i--);
}
int KeyProcess(void)
{
DDelay(500);
unsigned char nP10,nP11,nP12,nP13;
nP10=0;
nP11=0;
nP12=0;
nP13=0;
int nRes = 0;
//P1.7输出低电平
P1OUT = ~(BIT7);
DDelay(50);
nP10 = P1IN & BIT0;
if (nP10 == 0)
{
nRes = 13;
}
nP11 = P1IN & BIT1;
if (nP11 == 0)
{
nRes = 14;
}
nP12 = P1IN & BIT2;
if (nP12 == 0)
{
nRes = 15;
}
nP13 = P1IN & BIT3;
if (nP13 == 0)
{
nRes = 16;
}
//P1.6输出低电平
P1OUT = ~(BIT6);
DDelay(50);
nP10 = P1IN & BIT0;
if (nP10 == 0)
{
nRes = 9;
//P5OUT|=BIT5;
}
nP11 = P1IN & BIT1;
if (nP11 == 0)
{
nRes = 10;
//P5OUT|=BIT5;
}
nP12 = P1IN & BIT2;
if (nP12 == 0)
{
nRes = 11;
}
nP13 = P1IN & BIT3;
if (nP13 == 0)
{
nRes = 12;
}
//P1.5输出低电平
P1OUT = ~(BIT5);
DDelay(50);
nP10 = P1IN & BIT0;
if (nP10 == 0)
{
nRes = 5;
}
nP11 = P1IN & BIT1;
if (nP11 == 0)
{
nRes = 6;
}
nP12 = P1IN & BIT2;
if (nP12 == 0)
{
nRes = 7;
}
nP13 = P1IN & BIT3;
if (nP13 == 0)
{
nRes = 8;
}
//P1.4输出低电平
P1OUT = ~(BIT4);
nP10 = P1IN & BIT0;
if (nP10 == 0)
{
nRes = 1;
}
nP11 = P1IN & BIT1;
if (nP11 == 0)
{
nRes = 2;
}
nP12 = P1IN & BIT2;
if (nP12 == 0)
{
nRes = 3;
}
nP13 = P1IN & BIT3;
if (nP13 == 0)
{
nRes = 4;
}
P1OUT = 0x00;//恢复以前值。
//读取各个管脚的状态
for(;;)
{
if((P1IN&0x0f)==0x0f )
{
break;//等待松开按键
}
}
return nRes;
}
// 处理来自端口 1 的中断
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
int key_value;
DDelay(500);
key_value=KeyProcess();
switch(key_value)
{
case 1://----------------------------"0"-------------------
if(tempp<10000)
tempp = tempp*10;
break;
case 2://----------------------------"9"-------------------
if(tempp<10000)
tempp = tempp*10+9;
break;
case 3://----------------------------"8"-------------------
if(tempp<10000)
tempp = tempp*10+8;
break;
case 4://----------------------------"7"-------------------
if(tempp<10000)
tempp = tempp*10+7;
break;
case 5://----------------------------"."-------------------
break;
case 6://----------------------------"6" ------------------
if(tempp<10000)
tempp = tempp*10+6;
break;
case 7://----------------------------"5" ------------------
if(tempp<10000)
tempp = tempp*10+5;
break;
case 8://----------------------------"4" ------------------
if(tempp<10000)
tempp = tempp*10+4;
break;
case 9://----------------------------"kong" ---------------
tempp =(long int)tempp/10;
break;
case 10://---------------------------"3" ------------------
if(tempp<10000)
tempp = tempp*10+3;
break;
case 11://---------------------------"2" ------------------
if(tempp<10000)
tempp = tempp*10+2;
break;
case 12://---------------------------"1" ------------------
if(tempp<10000)
tempp = tempp*10+1;
break;
case 13://---------------------------"确认" ---------------
//回车键,找出新的菜单状态编号
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;
break;
case 14://---------------------------"↑上翻" -------------
//向上键,找出新的菜单状态编号
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
break;
case 15://---------------------------"↓下翻" -------------
//向下键,找出新的菜单状态编号
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState;
break;
case 16://---------------------------"取消"----------------
//取消键,找出新的菜单状态编号
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyQuxiao;
break;
default: break;
}
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
if(P1IFG & BIT0)
{
P1IFG &= ~(BIT0);// 清除中断标志位
}
if(P1IFG & BIT1)
{
P1IFG &= ~(BIT1);// 清除中断标志位
}
if(P1IFG & BIT2)
{
P1IFG &= ~(BIT2);// 清除中断标志位
}
if(P1IFG & BIT3)
{
P1IFG &= ~(BIT3);// 清除中断标志位
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -