Other Parts Discussed in Thread: EK-TM4C123GXL
主题中讨论的其他部件:EK-TM4C123GXL
平台:EK-TM4C123GXL
IAR嵌入式工作台32KB限制版本,v.IAR 9.20 .4.4.7112万
IAR嵌入式工作平台共享组件v.IAR 9.0。11.9006
使用(TivaWare_C_Series-I2C.LED)中的计时器示例作为程序的基础,添加了用于液晶显示屏的2.2 , 删除了计时器和0.295 ,编写了扫描8x10按键阵列的例程(见下文)
void InitKBScanner()
{
UARTprintf("\033[2JKBScannerf正在初始化...\n");
//正在初始化引脚组
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOB);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOC);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOD);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOE);
//配置扫描PIN
MAP_GPIOPinTypeGPIOOutput (GPIO _PORTD_BASE,GPIO PIN_0 | GPIO PIN_1 | GPIO PIN_2 |GPIO PIN_3);//MATC,1,2和3
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE,GPIO PIN_4 | GPIO PIN_5| GPIO PIN_6| GPIO PIN_7);//MATC4,5,6和7
//配置扫描器读取引脚
MAP_GPIOPinTypeGPIOInput (GPIO _PORT_BASE,GPIO PIN _0 | GPIO _PIN_1| GPIO _PIN_2| GPIO PIN _3| GPIO _PIN_4| GPIO _PIN_5);//MATL0-5
MAP_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE,GPIO PIN_4 | GPIO PIN_5| GPIO PIN_6| GPIO PIN_7);//MATL6-9
//将所有扫描针脚调低
GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN_0 | GPIO PIN_1 |GPIO PIN_2 |GPIO PIN_3,0);
GPIOPinWrite (GPIO _PORTB_BASE,GPIO PIN_4 | GPIO PIN_5 | GPIO PIN_6 | GPIO PIN_7,0);
}
如果CHAR* KB_MAP[]包含的元素不超过20个,则代码编译和工作正常,最大的元素是9个字符串。
我将数组拆分为8个独立的数组x10个元素,并实现了数据显示(见下文)
CHAR* KB_MAP_MATC0[10]=
{
"1","2","3","K","L", "M","N","O","空白","CLR"
};
CHAR* KB_MAP_MATC1[10]=
{
"4","5","6","P","Q", "R","S","T","BRT","左"
};
CHAR* KB_MAP_MATC2[10]=
{
"7","8","9","U","V", "W","X","Y","DIM,"右"
};等等
//数据显示:
void displayLabel (CHAR* LBL)
{
UARTprintf (LBL);
SetCursorPos(11,3);
WriteString (LBL);
}
//使用数据显示扫描矩阵的一列的示例
GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN,0,1);
keycode=KeyDetectf();
IF (密钥代码)
{
DisplayLabel (KB_MAP_MATC0 [(keycode-1)]);
keycode=0;
SystlDelay(5万);
}
GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN,0);
//keyDetecf 检测高输入并返回激活键的行号
UINT8_t KeyDetectf()
{
UINT8_t MATL=0;//返回活动MATLx行值
//UARTprintf(" KeyDetectf调用...\n");
// SysType.Delay(500万);
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_0))
matl=1;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO PIN_1))
matl=2;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO PIN_2))
matl=3;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_3))
matl=4;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_4))
matl=5;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_5))
MTL=6;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_4))
MTL=7;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_5))
MTL=8;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_6))
matl=9;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_7))
matl=10;
退回MATL;
}
只有当八列 扫描中的任意两个使用"displayLabel(KB _map_MATCx[(keycode-1)]"时,代码才会很好地执行;
添加第三个任意列调用 "displayLabel(KB _map_MATCx[(keycode-1)]";进行编译时没有错误或警告,但调试和执行挂起 ,停止调试程序时会导致硬错误:
"2022年5月20日星期五14:31:31:HardFault异常。
2022年5月20日星期五14:31:31:处理器已将可配置优先级例外升级到HardFault。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:发生了精确的数据访问错误(CFSR.PRECISERR, BFAR)
2022年5月20日星期五14:31:31:数据地址0x1ffffffff0。
2022年5月20日星期五14:31:31:
2022年5月20日(星期五) 14:31:31:异常条目上发生派生总线故障(CFSR.STKERR,BFAR)
2022年5月20日星期五14:31:31:数据地址0x1ffffffff0。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:无法确定发生异常的位置。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:有关详细信息,请参阅调用栈。”
调用栈显示:
"故障ISR()
例外帧>"
我们非常感谢您提供任何帮助。