#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
/**************************************宏定义************************************************/
#define SET_KY3 GpioDataRegs.GPASET.bit.GPIO1 = 1 //Y3拉高
#define RST_KY3 GpioDataRegs.GPACLEAR.bit.GPIO1 = 1 //Y3拉低
#define SET_KY2 GpioDataRegs.GPASET.bit.GPIO2 = 1 //Y2拉高
#define RST_KY2 GpioDataRegs.GPACLEAR.bit.GPIO2 = 1 //Y2拉低
#define SET_KY1 GpioDataRegs.GPASET.bit.GPIO3 = 1 //Y1拉高
#define RST_KY1 GpioDataRegs.GPACLEAR.bit.GPIO3 = 1 //Y1拉低
#define KX3_STATUS GpioDataRegs.GPBDAT.bit.GPIO51 //X3状态
#define KX2_STATUS GpioDataRegs.GPBDAT.bit.GPIO52 //X2状态
#define KX1_STATUS GpioDataRegs.GPBDAT.bit.GPIO53 //X1状态
#define BUZZ_CLK_GENER GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1; //蜂鸣器控制IO,IO电平翻转,产生控制脉冲
#define DISABLE_TIMER1_INT IER &= 0xFFFE; //关闭定时器
#define ENABLE_TIMER1_INT IER |= M_INT1; //打开定时器
#define BUZZ_OFF GpioDataRegs.GPASET.bit.GPIO0 = 1; //关闭蜂鸣器
/*****************************************************************************************************/
Uint16 KX_Status[4]={0};
Uint16 key = 0;
Uint16 Keys[3][3] = {1,2,3,4,5,6,7,8,9};//数据表,与12个按键对应 //实时按键信息变量
Uint16 KY_On = 0;
Uint16 KX_On = 0;
Uint16 KX_Tim[4] = {0};
/**************************************函数声明************************************************/
interrupt void cpu_timer0_isr(void);
void Init_KeyGpio(void); //初始化按键IO
void yanchi(Uint32 t); //延时函数
void ResetAllKY(void); //4列全部输出低电平
void KX_AllStatus(void); //读取4行IO电平状态
void Read_KX(Uint16 x); //读取按键所在行
void Set_KY(Uint16 x); //设置任意列输出高电平
void Rst_KY(Uint16 x); //设置任意列输出低电平
void Read_KY(Uint16 x); //读取按键所在列
void Buzz_Gpio_Init(void);
void Delay(Uint16 t);
void show(Uint16 i);
int ANjian(void);
//******************************************按键初值*************************************************//
Uint16 Musi[9]={ //单位 us,不同频率下,蜂鸣器发出不同音调的声音
0,
1912, //do
1703, //re
1517, //mi
1432, //fa
1275, //so
1136, //la
1013, //xi
0xFF //STOP
};
Uint16 Song[]= {0,1,2,3,4,5,6,7,8};
Uint16 DT[]={2,2,5,4,6,8,2}; //节拍
/*****************************************************************************************************/
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);
/*******************************按键IO初始化***********************************/
void Init_KeyGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pullup on GPIO0
GpioDataRegs.GPASET.bit.GPIO0 = 1; // Load output latch
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0 = GPIO
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0 = output
//////////////////////////////以下四个IO口设置为输出,作为列扫描////////////////////////////
//KY3: 对应PCB端子 KEY_MATRIX:IO24
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pullup on GPIO11
GpioDataRegs.GPASET.bit.GPIO1 = 1; // Load output latch
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO11 = GPIO
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // GPIO11 = output
//KY2: 对应PCB端子 KEY_MATRIX:IO25
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // Enable pullup on GPIO11
GpioDataRegs.GPASET.bit.GPIO2 = 1; // Load output latch
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; // GPIO11 = GPIO
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; // GPIO11 = output
//KY1: 对应PCB端子 KEY_MATRIX:IO26
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pullup on GPIO11
GpioDataRegs.GPASET.bit.GPIO3 = 1; // Load output latch
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0; // GPIO11 = GPIO
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; // GPIO11 = output
//////////////////////////////以下四个IO口设置为输入,作为行扫描////////////////////////////
//KX3: 对应PCB端子 KEY_MATRIX:IO28
GpioCtrlRegs.GPBPUD.bit.GPIO51 = 0; // Enable pullup on GPIO11
GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0; // 设置为一般IO口
GpioCtrlRegs.GPBDIR.bit.GPIO51 = 0; // IO口方向为输入
//KX2: 对应PCB端子 KEY_MATRIX:IO29
GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0; // Enable pullup on GPIO11
GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0; // 设置为一般IO口
GpioCtrlRegs.GPBDIR.bit.GPIO52 = 0; // IO口方向为输入
//KX1: 对应PCB端子 KEY_MATRIX:IO30
GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0; // Enable pullup on GPIO11
GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0; // 设置为一般IO口
GpioCtrlRegs.GPBDIR.bit.GPIO53 = 0; // IO口方向为输入
EDIS;
ResetAllKY();
}
/*****************************************************************************************************/
/*********************************************延时函数************************************************/
void Delay(Uint16 t) //延时函数
{
Uint32 i=0;
Uint32 gain = 200000; //延时增益
Uint32 base=0;
base=gain*t;
for(i=0;i<=base;i++);
}
/*****************************************************************************************************/
//*******************************************按键延时函数***********************************************//
void yanchi(Uint32 t)
{
Uint32 i = 0;
for (i = 0; i < t; i++);
}
//**********************************************按键延时函数************************************************//
/****************************************4列全部输出低电平************************************************/
void ResetAllKY(void)
{
RST_KY3 ;
RST_KY2 ;
RST_KY1 ;
}
/*****************************************************************************************************/
/****************************************读取4行IO电平状态************************************************/
void KX_AllStatus(void)
{
KX_Status[1] = KX1_STATUS;
KX_Status[2] = KX2_STATUS;
KX_Status[3] = KX3_STATUS;
}
/*****************************************************************************************************/
/**************************************读取按键行位置**************************************/
void Read_KX(Uint16 x)
{
KX_AllStatus();
if(KX_Status[x] == 0)
{
KX_Tim[x]++;
if(KX_Tim[x] >= 6000)
{
KX_On = x;
KX_Tim[1]= 0;
KX_Tim[2]=0;
KX_Tim[3]=0;
}
}
}
/*****************************************************************************************************/
/*******************************指定列输出高电平******************************************/
void Set_KY(Uint16 x)
{
if(x==1){SET_KY1;}
if(x==2){SET_KY2;}
if(x==3){SET_KY3;}
}
/*****************************************************************************************************/
/*******************************指定列输出低电平**********************************************/
void Rst_KY(Uint16 x)
{
if(x==1){RST_KY1;}
if(x==2){RST_KY2;}
if(x==3){RST_KY3;}
}
/*****************************************************************************************************/
/*******************************读取按键列位置**********************************************/
void Read_KY(Uint16 x)
{
if(!KX_Status[KX_On] && KX_On) //符合x行低电平并且x列不为零 即x列被扫描 Read_KY(x)
{
Set_KY(x); //x列被扫描 则令x列置高电平
yanchi(200);
KX_AllStatus();
if(KX_Status[KX_On]) //观察x行是否也转化为高电平
{
KY_On = x;
key = Keys[KX_On-1][KY_On-1]; //KY_ON-1是因为 数字从零开始0-3
KY_On = 0;
KX_On = 0;
}
Rst_KY(x);
}
}
/*****************************************************************************************************/
int ANjian(void)
{
Read_KX(1);
Read_KX(2);
Read_KX(3);
Read_KY(1);
Read_KY(2);
Read_KY(3);
return key;
}
/*********************************************歌曲演奏************************************************/
void Show(Uint16 i)
{
while(1)
{
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
ConfigCpuTimer(&CpuTimer0, 150, Musi[Song[i]]); //设置定时时间
StartCpuTimer0(); //重启定时器
ENABLE_TIMER1_INT; //使能定时中断
Delay(DT[i]); //音乐节拍延时
StopCpuTimer0(); //停止计数
DISABLE_TIMER1_INT; //不使能定时中断
BUZZ_OFF; //关闭蜂鸣器
Delay(8); //音乐停顿
}
}
/*****************************************************************************************************/
void main(void)
{
InitSysCtrl();
Init_KeyGpio(); //初始化拨码开关IO
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
InitCpuTimers(); // For this example, only initialize the Cpu Timers
ConfigCpuTimer(&CpuTimer0, 150, 50);
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
while(1) //死循环
{
ANjian();
show(key);
//不仅是1行对1列 有可能Read_KX(1)为低电平 而Read_KY(3)才符合置高后 Read_KX(1)也为高电平
}
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
BUZZ_CLK_GENER;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//===========================================================================
// No more.
//===========================================================================
|