(永辉电子DSP 板子)
代码功能 :
1.外部中断 控制 流水灯的方向
2. key 1 开启 蜂鸣器
3.key 2 关闭 蜂鸣器
4.key 3 开启 LED灯 (可能按键不对 但是就是这几个)
5.key 4 关闭 LED 灯
6.TFTLCD 屏幕显示
代码:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include <bsp_includes.h>
#if (TFTLCD_TEST == 1)
uchar class[]= {"班级 :"};
uchar Name[]= {"姓名: "};
uchar student_ID[]={"学号: "};
uchar Str1[] = {"题目: DSP综合设计 "};//方向的提示语句
uchar Str2[] = {"蜂鸣器模块: "};
uchar Str3[] = {"LED流水灯的方向: "};
uchar Str4[] = {"LED 小灯模块: "};
uchar Str5[] = {"正向"};
uchar Str6[] = {"反向"};
uchar Str7[] = {"开启"};
uchar Str8[] = {"关闭"};
#endif
int kkk1=0;//控制 流水灯的方向 0 正向 1 反向
int kkk2=0;//控制 LED 灯的模块的亮灭 0 不亮 1 亮
int kkk3=0;//控制 蜂鸣器模块响 0 不响 1 响
// 本例中用到的全局变量;
volatile Uint32 Xint1Count; //发生外部中断1的次数;
#define LED *((Uint16 *)0x4600)//流水灯的映射
const Uint16 LedCode[9]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0XFF};//小灯亮的 编码
#define Key_Read *((Uint16 *)0x4700)//按键的映射
#define KeyValue ((Key_Read)&0x0f)
#define keyon1 GpioDataRegs.GPADAT.bit.GPIO29//外部中断
#define DELAY 35.700L
unsigned int decetion;//流水灯 闪烁的方向
// 中断服务子程序在主程序下面时,需要在主程序之前要先申明才能使用.
interrupt void xint1_isr(void);
void delay_loop_2(void);//延时函数
void Gpio_select(void);//小灯 与蜂鸣器的初始化函数
void delay_loop_1(void);//超短时间的延时
void kongzhi_1();//控制 流水灯 的TFT 显示状态
void kongzhi_2();//控制 LED 灯的亮灭的显示状态
void kongzhi_3();//控制 蜂鸣器 的 的状态
//函数入口
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
Gpio_select();//GPIO led 端口初始化
InitXintf();
InitSpiaGpio();
Gpio_select();
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句
PieVectTable.XINT1 = &xint1_isr;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 00; // GPIO60为GPIO功能
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; // GPIO60为输出功能
EDIS; // EDIS的意思是不允许修改被保护的寄存器
// 在外设中断扩展模块中断使能寄存器中允许XINT1和XINT2: (组1中断4 & 5)
// 使能CPU中断1(INT1):
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能外设中断扩展PIE模块
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE组1的INT4
IER |= M_INT1; // 使能CPU中断1(INT1)
EINT; // 开全局中断
// GPIO29配置为输入引脚通用I/O口,接按键TZ1,TZ2
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0; // 选择为通用I/O口
GpioCtrlRegs.GPADIR.bit.GPIO29 = 0; // 方向定义为输入
GpioCtrlRegs.GPAPUD.bit.GPIO29=0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 0; // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步
GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0x80; // 每个采样窗口的周期
EDIS;
// 通过GPIO外部中断选择寄存器,选择GPIO12为外部中断1,选择GPIO13为外部中断2
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x1D; // XINT1是GPIO29
EDIS;
// 配置外部中断1和2的中断控制寄存器
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断
// 使能外部中断1和外部中断2
XIntruptRegs.XINT1CR.bit.ENABLE = 1; // 使能XINT1
decetion=1;
LED=0x00;//全亮
delay_loop();
int num=0;//这里不能是无符号的整形 因为 num 可能等于 -1
//TFTLCD实验
#if (TFTLCD_TEST == 1)
ILI9325_Init(); //TFT初始化
//显示字符
LCD_PutString(37, 20,Str1, BLUE,WHITE);//题目
LCD_PutString(37, 45,class, WHITE,RED);//班级
LCD_PutString(37, 70,Name, WHITE,RED);//姓名
LCD_PutString(37, 95,student_ID, RED,WHITE);//学号
LCD_PutString(37, 120,Str3, WHITE,RED);//流水灯
LCD_PutString(37, 145,Str2, WHITE,RED);//蜂鸣器
LCD_PutString(37, 170,Str4, WHITE,RED);//小灯
#endif
while(1)
{
//按键中断
if(decetion%2==0)
{
LED=LedCode[num];
delay_loop();
num++;
if(num>7)
{
num=0;
}
kkk1=0;//正向
}
if(decetion%2==1)
{
LED=LedCode[num];
delay_loop();
num--;
if(num<0)
{
num=7;
}
kkk1=1;//反向
}
//按键k1---k4
//按键 谁为 0 谁就启动了!
delay_loop_1();//这里加一个延时是为了保证 key 按键按下去的时候能够识别的到
if(KeyValue==0x0e)//1110 e
{
GpioDataRegs.GPASET.bit.GPIO6=1;//设置GPIO6输出高电平 //关闭LED灯
GpioDataRegs.GPASET.bit.GPIO7=1;//设置GPIO7输出高电平
kkk2=0;//关闭
}
delay_loop_1();//这里加一个延时是为了保证 key 按键按下去的时候能够识别的到
if(KeyValue==0x0d) //1101 13->d
{
GpioDataRegs.GPACLEAR.bit.GPIO6 = 1; //设置GPIO输出为低电平 //打开led 灯
GpioDataRegs.GPACLEAR.bit.GPIO7 = 1; //设置GPIO输出为低电平
kkk2=1;//打开
}
delay_loop_1();//这里加一个延时是为了保证 key 按键按下去的时候能够识别的到
if(KeyValue==0x0b)//1011 11->b
{
GpioDataRegs.GPBSET.bit.GPIO60=1;//设置GPIO60输出高电平 高电平响
kkk3=1;//响
}
delay_loop_1();//这里加一个延时是为了保证 key 按键按下去的时候能够识别的到
if(KeyValue==0x07)//0111 7
{
GpioDataRegs.GPBCLEAR.bit.GPIO60 = 1; //设置GPIO60输出为低电平 蜂鸣器不响
kkk3=0;//关闭
}
kongzhi_1();
kongzhi_2();
kongzhi_3();
}
}
void kongzhi_1()//控制 流水灯 的TFT 显示状态
{
if(kkk1==0) //正向
{
LCD_PutString(160, 120,Str5, WHITE,RED);//流水灯
}
else//方向
{
LCD_PutString(160, 120,Str6, WHITE,RED);//流水灯
}
}
void kongzhi_2()//控制 LED 灯的亮灭的显示状态
{
if(kkk2==0)//不亮
{
LCD_PutString(160, 170,Str8, WHITE,RED);//小灯 关闭
}
else//亮
{
LCD_PutString(160, 170,Str7, WHITE,RED);//小灯 开启
}
}
void kongzhi_3()//控制 蜂鸣器 的 的状态
{
if(kkk3==0)//不响
{
LCD_PutString(160, 145,Str8, WHITE,RED);//蜂鸣器关闭
}
else//响
{
LCD_PutString(160, 145,Str7, WHITE,RED);//蜂鸣器开启
}
}
//步骤7.在这里插入中断服务子程序,如果需要使用中断服务子程序,必须在步骤5中重新定义中断
//向量表中对应地地址
interrupt void xint1_isr(void)
{
Uint32 i;
for(i=0;i<1000000;i++); //键盘消抖动
while(keyon1==0);
decetion++;
// 应答寄存器的位1清0,以响应同组内其他中断;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void delay_loop_2()
{
Uint32 i;
Uint32 j;
for(i=0;i<40;i++)
{
for (j = 0; j < 100000; j++);
}
}
void Gpio_select(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 00; // GPIO6为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; // GPIO6为输出功能
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 00; // GPIO7为GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1; // GPIO7为输出功能
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 00; // GPIO60为GPIO功能 //BEEP
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; // GPIO60为输出功能
EDIS;
}
void delay_loop_1()//超短时间的延时
{
Uint32 i;
Uint32 j;
for(i=0;i<20;i++)
{
for (j = 0; j < 10000; j++);
}
}