AY-MSE KIT(TM4C123GH6PM芯片)配套程序包中匹配章节 CH3_1 源码中LCD问题

2019-03-24 08:45发布

KXGP`S({0}P_2C36X%9P.png
程序中的问题改过来还有错误是怎么回事啊,求指导。已改:下面程序中红 {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);
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
academic
1楼-- · 2019-03-24 15:43
< 把 ROM_SysCtlDelay 改成 SysCtlDelay 呢?

一周热门 更多>

相关问题

    相关文章