#include "uart.h"
// 我的按键GPJ1-1,GPJ4-4
/*按键相关的寄存器地址*/
#define GPJ1CON (*(volatile unsigned int *)0xE0200260)
#define GPJ1DAT (*(volatile unsigned int *)0xE0200264)
#define GPJ1PUD (*(volatile unsigned int *)0xE0200268)
#define GPJ4CON (*(volatile unsigned int *)0xE02002C0)
#define GPJ4DAT (*(volatile unsigned int *)0xE02002C4)
/*LED1相关的寄存器地址*/
#define GPJ2CON (*(volatile unsigned int *)0xE0200280)
#define GPJ2DAT (*(volatile unsigned int *)0xE0200284)
/*中断相关寄存器地址*/
#define GPJ1_INT_CON (*(volatile unsigned int *)0xE0200748)
#define GPJ1_INT_MASK (*(volatile unsigned int *)0xE0200948)
#define GPJ1_INT_PEND (*(volatile unsigned int *)0xE0200A48)
#define VIC0INTENABLE (*(volatile unsigned int *)0xF2000010)
#define VIC0INTSELECT (*(volatile unsigned int *)0xF200000C)
#define VIC0VECTADDR30 (*(volatile unsigned int *)0xF2000178)
#define VIC0ADDRESS (*(volatile unsigned int *)0xF2000F00)
#define VIC1ADDRESS (*(volatile unsigned int *)0xF2100F00)
#define VIC2ADDRESS (*(volatile unsigned int *)0xF2200F00)
#define VIC3ADDRESS (*(volatile unsigned int *)0xF2300F00)
/*ADC相关寄存器地址*/
#define ADCTS_BASE 0xE1700000
#define TSCON0 ( *((volatile unsigned int *)(ADCTS_BASE+0x4)) )
#define TSDLY0 ( *((volatile unsigned int *)(ADCTS_BASE+0x8)) )
#define TSDATX0 ( *((volatile unsigned int *)(ADCTS_BASE+0xc)) )
#define TSDATY0 ( *((volatile unsigned int *)(ADCTS_BASE+0x10)) )
#define TSADCCON0 ( *((volatile unsigned int *)(ADCTS_BASE+0x0)) )
#define TSCON0 ( *((volatile unsigned int *)(ADCTS_BASE+0x4)) )
#define ADCMUX ( *((volatile unsigned int *)(ADCTS_BASE+0x1c)) )
/*蜂鸣器相关寄存器地址*/
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)
extern unsigned int IRQ_handle;
unsigned int j = 1;
//初始化 beep
void beep_init(void)
{
GPD0CON &= ~(0xf); //清空低四位
GPD0CON |= 1<<0; //配置为输出模式
}
void beep_on(void)
{
GPD0DAT |= 1<<0;
}
void beep_off(void)
{
GPD0DAT &= ~(1<<0);
}
void led_on(int n)
{
n=n-1;
GPJ2DAT = GPJ2DAT | (1<<n);//点亮第n号灯
}
void led_off(int n)
{
n=n-1;
GPJ2DAT = GPJ2DAT & ~(1<<n);//关闭第n号灯
}
void led_init()
{
GPJ2CON = GPJ2CON & 0x00000000; //清除所有灯对应的控制引脚
GPJ2CON = GPJ2CON | 0x11111111; //所有指示灯设置为输出模式
}
void adc_init()
{
// 使能预分频功能,设置 A/D 转换器的时钟 = PCLK/(65+1)
TSADCCON0 &= ~((1<<1)|(1<<16)|(1 << 14) | (0xff<< 6));
TSADCCON0 |= (1<<16)|(1 << 14) | (65 << 6);
// 清除位[2],设为普通转换模式
TSADCCON0 &= ~(1<<2);
// 选择通道
ADCMUX = 0;
// 设置位[0]为 1,启动 A/D 转换
TSADCCON0 |= (1 << 0);
// 当 A/D 转换真正开始时,位[0]会自动清 0
while (TSADCCON0 & (1 << 0));
//开启读取结果后,自动开启下次转换
TSADCCON0 |= (1<<1);
}
void key_init()
{
/*GPJ1_1 =1111B,配置为中断功能*/
GPJ1CON = GPJ1CON & 0xffffff0f;
GPJ1CON |= GPJ1CON | (0xF<<4*1);
/*GPJ1_1,下拉使能*/
GPJ1PUD = GPJ1PUD & 0xffc3; //清除[2-3]
GPJ1PUD = GPJ1PUD | (0x14);
/*设置CPJ4_4设置为输出模式,输出高电平*/
GPJ4CON = GPJ4CON & 0xfff0ffff; //清除[16-19],设置为 0
GPJ4CON = GPJ4CON | 0x10000; //设置[16-19]四位为 0001,即设置为输出模式
GPJ4DAT = GPJ4DAT | 0x10 ; //设置 GPJ4_4 输出高电平
}
void clear_Vicaddress()
{
VIC0ADDRESS = 0;
VIC1ADDRESS = 0;
VIC2ADDRESS = 0;
VIC3ADDRESS = 0;
}
void interrupt_init()
{
/*上升沿触发,芯片手册251*/
GPJ1_INT_CON = GPJ1_INT_CON & 0xffffff0f;
GPJ1_INT_CON = GPJ1_INT_CON |(0x3<<4); //左移4位 需修改
/*取消中断屏蔽位,芯片手册297*/
GPJ1_INT_MASK = GPJ1_INT_MASK & 0xfd; // 需修改
/*清除中断挂起位*/
GPJ1_INT_PEND = GPJ1_INT_PEND & (1<<1); // 需修改
/*设置为IRQ*/
VIC0INTSELECT = 0;
/*安装中断服务函数*/
VIC0VECTADDR30 = &IRQ_handle;
/*清中断*/
VIC0ADDRESS = 0;
/*使能中断,芯片手册562*/
VIC0INTENABLE = VIC0INTENABLE | (0x1<<30);
}
void delay(unsigned int n)
{
for(;n>0;n--);
}
void irqhandler()
{
unsigned int result;
/*添加了消抖的功能
思路:先检测按键是否按下,按下的话,延时一段时间,再次检测是否按下,
还是按下的话,就证明按键真的按下了,然后执行点灯程序*/
//用作关闭蜂鸣和灯
if((GPJ1DAT & (1<<1))==0x2 && j<=5)
{
delay(0x10000);
if((GPJ1DAT & (1<<1))==0x2 && j<=5)
{
j++;
// 检测位[15],当它为1时表示转换结束,不为1则一直查询
while (!(TSADCCON0 & (1 << 15)));
// 读取数据
result = TSDATX0 & 0xfff;
printf("adc = %d ",result);
printf("\n");
delay(0x100000);
if(j ==6 ) {
if(result > 2200){
int m = 10;//总的次数
int k=10;//用来存灯的下标
while(m--)
{
if(k >8){
beep_on();
led_on(4);
delay(0x150000);
beep_off();
led_off(4);
delay(0x150000);
}
else if(k>1){
beep_on();
led_on(k);
delay(0x50000);
beep_off();
led_off(k);
delay(0x50000);
}
else{
if(k<=1){
beep_on();
led_on(k);
}
}
k--;
}
}
}
}
}
if((GPJ1DAT & (1<<1))==0x2 && j>=6)
{
delay(0x10000);
if((GPJ1DAT & (1<<1))==0x2 && j>=6)
{
beep_off();
led_off(1);
printf("###over### ");
printf("\n");
}
}
/*清除中断挂起位*/
GPJ1_INT_PEND = GPJ1_INT_PEND & (1<<1);
clear_Vicaddress();
}
void main(void)
{
adc_init();
beep_init();
led_init();
key_init();
interrupt_init();
printf("\n");
int i;
while(1)
{
i=1;
}
}