#include "speed.h" #include "systemInit.h" #include "car.h" #include "sensor.h" #include "uartGetPut.h" #include <timer.h> #include <stdio.h> #include "LCD_KEY.h" // 定义LED #define LED_PERIPH SYSCTL_PERIPH_GPIOG #define LED_PORT GPIO_PORTG_BASE #define LED_PIN GPIO_PIN_2 #define LED3_PIN GPIO_PIN_3 #define LED1_PERIPH SYSCTL_PERIPH_GPIOD #define LED1_PORT GPIO_PORTD_BASE #define LED1_PIN GPIO_PIN_0 //定义KEY,进行LCD屏幕的暂停功能。 #define KEY_PERIPH SYSCTL_PERIPH_GPIOD #define KEY_PORT GPIO_PORTD_BASE #define KEY_PIN GPIO_PIN_1 #define PART_LM3S1138 #include <pin_map.h> static int count = 0; static tBoolean display = true; void lcdInit(void) { zlg7289Init(); // 初始化ZLG7289 GPIOPinTypeIn( LCD_KEY_PORT , LCD_KEY_KEY); // 设置KEY端口为输入 GPIOIntTypeSet( LCD_KEY_PORT , LCD_KEY_KEY, GPIO_FALLING_EDGE); // 配置引脚下降沿触发中断 GPIOPinIntEnable( LCD_KEY_PORT , LCD_KEY_KEY); // 使能引脚输入中断 IntEnable(INT_GPIOB); // 使能GPIO PB口中断 LCDInit(); // LCD初始化 clear_all(); // 清屏 SysCtlPeriEnable(LED_PERIPH); // 使能LED所在的GPIO端口 GPIOPinTypeOut(LED_PORT, LED_PIN|LED3_PIN); // 设置LED所在管脚为输出 SysCtlPeriEnable(LED1_PERIPH); // 使能LED所在的GPIO端口 GPIOPinTypeOut(LED1_PORT, LED1_PIN); // 设置LED所在管脚为输出 GPIOPinWrite(LED1_PORT,LED1_PIN,0x00); } //Timer1初始化CCP3 void timer1Init(void) { SysCtlPeriEnable(CCP3_PERIPH); GPIOPinTypeTimer(CCP3_PORT,CCP3_PIN); SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); TimerConfigure(TIMER1_BASE,TIMER_CFG_16_BIT_PAIR| TIMER_CFG_A_PERIODIC| TIMER_CFG_B_CAP_COUNT); TimerPrescaleSet(TIMER1_BASE,TIMER_A,99); TimerLoadSet(TIMER1_BASE,TIMER_A,60000ul); //定时1S TimerControlEvent(TIMER1_BASE, // 控制TimerB捕获CCP负边沿 TIMER_B, TIMER_EVENT_NEG_EDGE); TimerLoadSet (TIMER1_BASE, TIMER_B, 1); // 设置计数器初值 TimerMatchSet(TIMER1_BASE, TIMER_B, 0); // 设置事件计数匹配值 TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT|TIMER_CAPB_MATCH); // 使能TimerA捕获匹配中断 IntEnable(INT_TIMER1A); IntEnable(INT_TIMER1B); /就是在这里 //IntMasterEnable(); //TimerEnable(TIMER1_BASE,TIMER_BOTH); } // 定时器的中断服务函数 void Timer1A_ISR(void) { static int i = 0; char c[40]; unsigned char ucVal; unsigned long ulStatus; ulStatus = TimerIntStatus(TIMER1_BASE, true); // 读取中断状态 TimerIntClear(TIMER1_BASE, ulStatus); // 清除中断状态,重要! if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是Timer超时中断 { //进行修改,使用LCD进行显示输出。 ucVal = GPIOPinRead(LED_PORT, LED_PIN); // 反转LED GPIOPinWrite(LED_PORT, LED_PIN, ~ucVal); sprintf(c,"total:%d time:%d",count,i); if(display) { clear_all(); LCD_WriteStr(0,0,c); } i=(i+1); } } // Timer1B的中断服务函数 void Timer1B_ISR(void) { unsigned long ulStatus; unsigned char ucVal; ulStatus = TimerIntStatus(TIMER1_BASE, true); // 读取当前中断状态 TimerIntClear(TIMER1_BASE, ulStatus); // 清除中断状态,重要! if (ulStatus & TIMER_CAPB_MATCH) // 若是TimerA捕获匹配中断 { TimerLoadSet(TIMER1_BASE, TIMER_B, 1); // 重新设置计数器初值 TimerEnable(TIMER1_BASE, TIMER_B); // TimerA已停止,重新使能 count++; ucVal = GPIOPinRead(LED_PORT, LED3_PIN); // 反转LED GPIOPinWrite(LED_PORT, LED3_PIN, ~ucVal); } } int getCount(void) { return count; } void initKey(void) { SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口 GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入 重要.选择中断触发类型. GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); // 设置KEY管脚的中断类型 GPIOPinIntEnable(KEY_PORT, KEY_PIN); // 使能KEY所在管脚的中断 IntEnable(INT_GPIOD); // 使能GPIOD端口中断 //IntMasterEnable(); // 使能处理器中断 } //进行所有函数的中断部分的初始化操作。 void intInit(void) { IntMasterEnable(); TimerEnable(TIMER1_BASE,TIMER_BOTH); } // GPIOD的中断服务函数 void GPIO_Port_D_ISR(void) { unsigned char ucVal; unsigned long ulStatus; ulStatus = GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态 GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要 if (ulStatus & KEY_PIN) // 如果KEY的中断状态有效 { display = !display; ucVal = GPIOPinRead(LED1_PORT, LED1_PIN); // 翻转LED GPIOPinWrite(LED1_PORT, LED1_PIN, ~ucVal); SysCtlDelay(10 * (TheSysClock / 3000)); // 延时约10ms,消除按键抖动 while (GPIOPinRead(KEY_PORT, KEY_PIN) == 0x00); // 等待KEY抬起 SysCtlDelay(10 * (TheSysClock / 3000)); // 延时约10ms,消除松键抖动 } } void ledInit(void) { SysCtlPeriEnable(LED1_PERIPH); GPIOPinTypeOut(LED1_PORT,LED1_PIN); GPIOPinWrite(LED1_PORT,LED1_PIN,0x00); } 使用它可以完成车速的测量操作.通过检测齿轮上的黑白颜色,产生的高低脉冲来计数,通过计数来完成速度的测量 . 程序代码如下:内容还含有LCD显示模块,中断计时模块,按键的中断显示模块,