程序中的问题改过来还有错误是怎么回事啊,求指导。已改:下面程序中红 {MOD}代码把
INT_GPIOD改为了INT_GPIOD_BLIZZARD
#include <stdint.h>
#include <stdbool.h>
#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "LCDDriver.h"
#include "inc/hw_gpio.h"
enum
{
LINE_ONE,
LINE_TWO,
LINE_THREE,
LINE_FOUR,
LINE_NUM
}line_define;
//#define CHAR_WIDTH 8
#define WORD_WIDTH 16
#ifndef TARGET_IS_BLIZZARD_RA1
#define TARGET_IS_BLIZZARD_RA1
#endif
/***************************************************************
* @brief LCD模块按键响应中断 PC7 对应的为按键S1
* @param null
* @return null
***************************************************************/
extern uint8_t VCA_BUTTON_UP_DOWM;
char cur_Col = 0;
//中断处理子函数
void Int_GPIO_D_Handler(void)
{
unsigned long ulStatus;
// 读取中断状态
ulStatus = GPIOIntStatus(GPIO_PORTD_BASE, true);
// 清除中断状态
GPIOIntClear(GPIO_PORTD_BASE, ulStatus);
// 如果KEY的中断状态有效
if (ulStatus & GPIO_PIN_7)
{
// 延时约10ms,消除按键抖动
SysCtlDelay(10 * (SysCtlClockGet() / 3000));
// 等待KEY抬起
while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7) == 0x00);
// 延时约10ms,消除松键抖动
SysCtlDelay(10 * (SysCtlClockGet() / 3000));
//TODO 逻辑处理
if(cur_Col < (NUM_CHAR - 1))
cur_Col++;
}
if (ulStatus & GPIO_PIN_6)// 如果KEY的中断状态有效
{
// 延时约10ms,消除按键抖动
SysCtlDelay(10 * (SysCtlClockGet() / 3000));
// 等待KEY抬起
while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6) == 0x00);
// 延时约10ms,消除松键抖动
SysCtlDelay(10 * (SysCtlClockGet() / 3000));
//TODO 逻辑处理
if(cur_Col > 0)
cur_Col--;
}
}
/***************************************************************
*
@brief 初始化ADC获取滚轮电压值
* ————————|
// TIVA |
// M4 PE0|<--ADC 模数转换信号源
// ________|
***************************************************************/
#define ADC_BASE ADC0_BASE // 使用ADC0
#define SequenceNum 3 // 使用序列3
void Init_ADCWheel(){
// 使能ADC0外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
// 使能外设端口E
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
// 选择PE0为外部模拟数字转换功能
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);
// 使能采样序列号为触发处理获取模式
ADCSequenceConfigure(ADC_BASE, SequenceNum, ADC_TRIGGER_PROCESSOR, 0);
// ADC配置
ADCSequenceStepConfigure(ADC_BASE, SequenceNum, 0, ADC_CTL_CH3 | ADC_CTL_IE |ADC_CTL_END);
// 使能ADC配置
ADCSequenceEnable(ADC_BASE, SequenceNum);
// 清除ADC中断标志位
ADCIntClear(ADC_BASE, SequenceNum);
}
/***************************************************************
* @brief 获取特定ADC的模数转化采样值。
* @param ui32Base ADC采样基地址
* @param ui32Peripheral ADC启动的外设端口
* @return ADC采样值
***************************************************************/
unsigned long ADC_ValueGet(uint32_t ui32Base, uint32_t ui32SequenceNum)
{
unsigned long value = 0;
// 保存ADC采样值
uint32_t ADCValue[1];
// 触发获取端口采样
ADCProcessorTrigger(ui32Base, ui32SequenceNum);
//等待采样结束
while(!ADCIntStatus(ui32Base, ui32SequenceNum, false))
{
}
// 清除ADC采样中断标志
ADCIntClear(ui32Base, ui32SequenceNum);
// 读取ADC采样值
ADCSequenceDataGet(ui32Base, ui32SequenceNum, ADCValue);
value = ADCValue[0];
return value;
}
/************************************************************
* @brief 对端口C、D进行按键中断初始化
* @param none
* @param none
***********************************************************/
void Init_Int_Key() {
HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) |= GPIO_LOCK_KEY;
HWREG(GPIO_PORTD_BASE+GPIO_O_CR) |= (1<<7);
HWREG(GPIO_PORTD_BASE+GPIO_O_DEN) &=(~(1<<7));
HWREG(GPIO_PORTD_BASE+GPIO_O_PDR) &= (~(1<<7));
HWREG(GPIO_PORTD_BASE+GPIO_O_PUR) &= (~(1<<7));
HWREG(GPIO_PORTD_BASE+GPIO_O_AFSEL) &=(~(1<<7));
// Make PD6/7 an output.
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_LOW_LEVEL);
GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);
IntEnable(INT_GPIOD_BLIZZARD);
IntMasterEnable();
GPIOIntClear(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);
}
unsigned char director = 0; // 当前的移动方向
int main(void) {
uint32_t pui32ADC0Value[1]; // 保存ADC采样值
unsigned char old_Raw, old_Col; // 保留上一次的位置
unsigned char cur_Raw; // 记录光标当前的横坐标,纵坐标
cur_Raw = 0;
cur_Col = 0;
// 设置系统主频
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN
| SYSCTL_XTAL_16MHZ);
Init_ADCWheel();
Init_Int_Key();
LCD_Enable(); // 使能LCD
LCD_Init(); // 初始化LCD
LCD_ScreenClr(); // 清屏
while(1)
{
ADCProcessorTrigger(ADC_BASE, SequenceNum);
// Wait for conversion to be completed.
while(!ADCIntStatus(ADC_BASE, SequenceNum, false))
{
}
// Clear the ADC interrupt flag.
ADCIntClear(ADC_BASE, SequenceNum);
// Read ADC Value.
ADCSequenceDataGet(ADC_BASE, SequenceNum, pui32ADC0Value);
unsigned long sample = pui32ADC0Value[0];
cur_Raw = (LCD_MAX_COL * sample) / 4096;
// 如果光标发生变化则刷新光标位置
if(old_Col != cur_Col || old_Raw != cur_Raw)
{
LCD_Draw_Char_8x8(' ', old_Col, old_Raw, LCD_DRAW_NORMAL);
LCD_Draw_Char_8x8(' ', cur_Col, cur_Raw, LCD_DRAW_HIGHLIGHT);
}
// 保存光标及采样值用于下次比较
old_Raw = cur_Raw;
old_Col = cur_Col;
// 系统延时
ROM_SysCtlDelay(SysCtlClockGet() / 12);
}
}
此帖出自
小平头技术问答
一周热门 更多>