This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C1294XL:实施图形库的键盘小工具时出现问题

Guru**** 1810440 points
Other Parts Discussed in Thread: EK-TM4C1294XL, TM4C129XNCZAD
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/564655/ek-tm4c1294xl-isuue-in-implementing-keyboard-widget-of-graphics-library

器件型号:EK-TM4C1294XL
主题中讨论的其他器件: TM4C129XNCZAD

大家好、

我正在使用 EK-TM4C1294XL launchpad、我正在尝试实现图形库的键盘小工具。

我可以将键盘放在显示屏上、但当我按下键盘上的任何键时、代码会挂起并进入故障 ISR。

请帮助解决此问题。 我已附上我的代码。

//
//键盘光标闪烁速率。
//
#define keyboard_BINK_RATE 100

//
//键盘的当前字符串指针。
//
 static char *g_pcKeyStr;

//
键盘的当前字符串索引。
//
静态 uint32_t g_ui32StringIdx;

//
键盘上未显示任何内容时使用的占位符字符串。
//
静态 const char g_cTempStr = 0;

//
键盘的当前字符串宽度(以像素为单位)。
//
 static Int32_t g_i32StringWidth;

//
光标闪烁计数器。
//
静态易失性 uint32_t g_ui32CursorDelay;

/**** 键盘******* /

键盘(键盘、键盘背景、0、0、
&g_sGrRaster16BppDriver、8、190、792、300、
键盘样式填充|键盘样式自动重复|
keyboard_style_press_notify | keyboard_style_release_notify |
Keyboard _style_BG、
ClrBlack、ClrGray、ClrDarkGray、ClrGray、ClrBlack、 G_psFontCms20b、
100、100、NUM_KEYBOARD_US_ENGLISH、g_psKeyboardUSENGLISH、KeyEvent);

画布(KeyboardText、&KeyboardBackground、&Keyboard、0、
&g_sGrRaster16BppDriver、X_OFFSET、Y_OFFSET、
800、180、
canva_style_app_leed|canva_style_fill | canva_style_text | canva_style_text_left、
ClrBlack、ClrWhite、ClrWhite、g_psFontCms24、&g_cTempStr、 0、文本区域);

Canvas (KeyboardBackground、widget_root、0、&KeyboardText、
&g_sGrRaster16BppDriver、X_OFFSET、Y_OFFSET、
800、480、
canva_style_fill、ClrBlack、ClrWhite、 ClrWhite,0,0,0,0);

/********* /

void textarea (tWidget *psWidget、tContext *psContext)
{

HandleKeyboard ();
GrContextFontSet (psContext、g_psFontCms28b);
环境 ForegroundSet (psContext、ClrRed);
GrStringDraw (psContext,"患者 ID:",-1,
5、5、0);

GrStringDraw (psContext,"患者姓名:",-1,
5、40、0);

GrStringDraw (psContext,"性别:",-1,
5、75、0);
GrStringDraw (psContext、"age:"、-1、
5、110、0);

GrStringDraw (psContext、"高度:"、-1、
555,5,0);
GrStringDraw (psContext、"重量:"、-1、
555,40,0);
GrStringDraw (psContext,"日期:",-1,
555,75,0);

}


void
HandleKeyboard (void)
{

//
//如果按中间值,则清除光标。
//
if (g_ui32CursorDelay = keyboard_blink_rate / 2)
{
GrContextForegroundSet (&guiMainContext、ClrBlack);

//
//现在已处理清除,请保持计数器移动。
//
g_ui32CursorDelay --;
}
否则、如果(g_ui32CursorDelay = 0)
{
GrContextForegroundSet (&guiMainContext、ClrWhite);

//
//现在已绘制光标,重置闪烁延迟
//已处理。
//
G_ui32CursorDelay = keyboard_BINK_RATE;
}
其他
{
返回;
}

//
//仅在时间时绘制光标。
//
GrLineDrawV (&guiMainContext,200 + g_i32StringWidth,20,
40);

}

空
键事件(tWidget * psWidget、uint32_t ui32Key、uint32_t ui32Event)
{
交换机(ui32Key)
{
//
//查找是否按退格键。
//
案例 Unicode_Backspace:
{
if (ui32Event == keyboard_event_press)
{
if (g_ui32StringIdx!= 0)
{
G_ui32StringIdx--;
G_pcKeyStr[g_ui32StringIdx]= 0;
}

WidgetPaint ((tWidget *)&KeyboardText);

//
//保存当前字符串的像素宽度。
//
G_i32StringWidth = GrStringWidthGet (&guiMainContext、g_pcKeyStr、
100);
}
中断;
}
//
//查找按回车键。 这将退出键盘和
//返回当前活动屏幕。
//
/*案例 Unicode_return:
{
if (ui32Event == keyboard_event_release)
{ 
// //如果密钥不是特殊的,则更新文本字符串。 // 默认值: { if (ui32Event == keyboard_event_press) { // //将字符串设置为要更新的当前字符串。 // if (g_ui32StringIdx = 0) { CanvasTextSet (&KeyboardText、&g_pcKeyStr); } G_pcKeyStr[g_ui32StringIdx]=(char) ui32Key; G_ui32StringIdx++; G_pcKeyStr[g_ui32StringIdx]= 0; WidgetPaint ((tWidget *)&KeyboardText); // //保存当前字符串的像素宽度。 // G_i32StringWidth = GrStringWidthGet (&guiMainContext、g_pcKeyStr、 100); } 中断; } WidgetMessageQueueProcedess(); } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sumit

    您能不能描述一下您使用的是哪个 TivaWare 版本和哪个面板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我使用的是 SW-TM4C-RLN-2.1.3.156和 IAM,它使用 TM4C129XNCZAD MCU 控制的面板,与 kentec 显示器类似,唯一的区别是分辨率为800x480的7英寸显示器
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sumit

    好的、由于显示屏不同、您是否对堆栈大小进行了任何更改?

    此外、请使用断点检查在您在结构中初始化的回调函数期间程序执行的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我将堆栈大小保持为65536。

    我应该将断点准确放置在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sumit

    断点应位于回调函数中、以查看是否在触摸屏上调用它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    因此,您的意思是我应该将断点保留在 keyevent 函数中或 main 函数内,其中 WidgetMessageQueueProcess ()在 while (1)循环中调用。

    无效

          KeyEvent (tWidget * psWidget、uint32_t ui32Key、uint32_t ui32Event)

          {

            交换机(ui32Key)

            {

              //

              //查找是否按退格键。

              //

              案例 Unicode_Backspace:  

              {

                if (ui32Event == keyboard_event_press)

                {

                  if (g_ui32StringIdx!= 0)

                  {

                    G_ui32StringIdx--;

                    G_pcKeyStr[g_ui32StringIdx]= 0;

                  }

                  WidgetPaint ((tWidget *)&KeyboardText);

                  //

                  //保存当前字符串的像素宽度。

                  //

                  G_i32StringWidth = GrStringWidthGet (&guiMainContext、g_pcKeyStr、

                                    100);

                }

                中断;

              }

              //

              //查找按回车键。  这将退出键盘和

              //返回当前活动屏幕。

              //

             /*案例 Unicode_return:

              {

                if (ui32Event == keyboard_event_release)

               {

              //

              //如果密钥不是特殊的,则更新文本字符串。

              //

              默认值:

              {

                if (ui32Event == keyboard_event_press)

                {

                  //

                  //将字符串设置为要更新的当前字符串。

                  //

                  if (g_ui32StringIdx = 0)

                  {

                    CanvasTextSet (&KeyboardText、&g_pcKeyStr);

                  }

                  G_pcKeyStr[g_ui32StringIdx]=(char) ui32Key;

                  G_ui32StringIdx++;

                  G_pcKeyStr[g_ui32StringIdx]= 0;

                  WidgetPaint ((tWidget *)&KeyboardText);

                  //

                  //保存当前字符串的像素宽度。

                  //

                  G_i32StringWidth = GrStringWidthGet (&guiMainContext、g_pcKeyStr、

                                    100);

                }

                中断;

              }

             WidgetMessageQueueProcess ()-------------- >断点

            }

          }

    或内部的内部 while (1)循环

     WidgetMessageQueueProcess ();-------------- >断点

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sumit

    如果 Keyevent 函数是按键时的回调函数、则断点位于 KeyEvent 函数上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    Thx 对于支持、我能够解决该问题。

    我的编程中有许多错误、我在这里无法描述、但我遵循了 QS 天气应用程序、其中他们使用了键盘、我终于能够使用键盘小部件了!!! )

    注:-对于在实施键盘小工具时遇到问题的任何其他人,只需浏览 QS Weather 应用程序的代码即可。 它在 Tivaware _C_Series - 2.1.0.12573版本的电路板示例中提供
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sumit

    TivaWare 2.1.3.156 (以及即将推出的更新版本)