实验四 键盘、LED及LCD应用实验

一.实验目的

(1)掌握键盘基础知识与键盘驱动构件设计。

(2)掌握 LED 数码管基础知识与 LED 驱动构件设计。

(3)掌握 LCD 基础知识与点阵字符型 LCD 驱动构件设计。

(4)进一步深入理解 MCU 和 C#串口通信的编程方法。

二.实验内容

1.验证性实验

1)验证样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),主要功能是实现试验箱上的 LCD 显示“Wait Receiving..Soochow 2016.04.”,矩阵键盘按键数据显示在 LCD 上面。例如按键为 9,LCD 显示“The keyboard you just input is 9”,四个 LED 数码管上显示 0235。

实验步骤如下:

(1)将样例 KB-LED-LCD 程序下载至目标板;

(2)观察 LED 和 LCD 上显示内容,矩阵键盘按键数据将显示在 LCD 上面。例如按键为 9,LCD 显示“The keyboard you just input is 9”;

(3)分析理解 main.c 程序和中断服务例程 isr.c 及其 KEY、LED、LCD 驱动程序。

2.设计性实验

(1)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:通过串口调试助手或“C#2010 串口测试程序”输入的内容送 LED 数码管和 LCD 同时显示。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句。

(2)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:通过实验箱上的矩阵键盘输入的内容送 LED 数码管和 LCD 显示。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句。

(3)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:通过串口调试助手或“C#2010 串口测试程序”输入时间“时:分:秒”,如 10:35:45,送 LED数码管显示并开始计时(LED 数码管循环左移显示 6 位数字);LCD 显示“时:分:秒”并开始计时。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句。

(4)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:通过实验箱上的矩阵键盘输入时间“时:分:秒”,如 10:35:45,分钟和秒内容送 LED 数码管显示并开始计时;LCD 显示“时:分:秒”并开始计时。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句。

3.进阶实验★

(1)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:要求按下实验箱上的矩阵键盘上的一个键,将键值和键面定义值(键的 ASCII 码值)通过串口送 PC 方软件界面显示。编写 C#程序实现,当矩阵键盘上键值被按下时,PC 机软件虚拟键盘对应键被按下。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句和 C#方主要程序段。

(2)复制样例程序(ch08-KB-LED-LCD)中(KB-LED-LCD),利用该程序框架实现:编写 C#程序实现,PC 机软件对应的虚拟 LED 界面通过串口接收实验箱上的矩阵键盘输入数据,与实验箱上的 LED 硬件同步显示数字。也可以通过 PC 机软件虚拟键盘发送数字来修改实验箱上的 LED 所显示的数字。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句和 C#方主要程序段。

(3)上述进阶实验(1)和(2)的综合,编写 C#程序实现,实验箱上的 LED 硬件和矩阵键盘能够与 PC 机软件对应的虚拟 LED 界面和虚拟键盘同步显示。

请在实验报告中给出 MCU 端程序 main.c 和 isr.c 流程图及程序语句和 C#方主要程序段。

(4)设计一个计算器,即利用 4×4 键盘的输入算式,进行两位有符号数字的加减运算(可以两项以上连续加减),按等号得到和或差,结果为两位有符号数字,溢出时显示“RESULT OVER”。LCD 作为显示器,并要求每按键一次小蜂鸣器响一下,可用拨码开关关闭蜂鸣器。

提示:需自行定义矩阵键盘的含义。键盘稳定是关键,同时要编写能删除字符的按键“DEL”。

三.实验步骤和结果

1.验证性实验

(1)分析理解KB、LED、LCD驱动程序

经过对书本的学习和验证新实验,我理解了KB是如何进行多次扫描来确定按键的位置,以及通过键值与十六进制代码映射来将获取到的信号转化为键值的过程。

LEDShow则是通过十六进制的代码控制每个晶体管的亮暗来控制LED显示屏上数字的显示。

LCD主要是通过预定义字符集来显示其字符。

2.设计性实验

(1)通过串口调试助手将输入的内容同时显示在LED显示屏和LCD显示屏上。

思路分析:

  1. 由于LED和LCD只能显示特定的字符(LED只能显示数字和部分字母,LCD显示预定义字符集里的字符),故实验过程以发送数字为主。
  2. 首先串口通过组帧的方式接收到发送到开发板上的数字。
  3. 将接收到的数字赋值给g_LEDBuffer和g_LCDBuffer的对应位置(这两个数组只需要存需要显示的数字即可),随后执行LEDShow和LCDShow函数,即可在显示屏的对应位置显示该数字。

流程图:

串口流程图:

实验四 键盘、LED及LCD应用实验_第1张图片

 

Main函数:

实验四 键盘、LED及LCD应用实验_第2张图片

 

具体代码如下:

串口中断函数:

void UART2_IRQHandler(void) {

uint_8 ch;

uint_8 flag = 1;



DISABLE_INTERRUPTS;



ch = uart_re1(UART_2, &flag);

if (1 == flag) {

g_flag = CreateFrame(ch, buffer);

uart_send1(UART_2, ch);

}



ENABLE_INTERRUPTS;

}

Main函数:

while(1)

    {

     uint_8 i=0 ;

     if(g_flag){

     for(;i

(2)通过KB输入内容并显示到LED和LCD上

思路分析:

  1. 在Systic中断中扫描键盘,来获取键盘的值。
  2. 获取到键盘的值(同空值比较来确定是否有按键)之后,通过LEDshow(g_LEDBuffer); LCDshow(g_LCDBuffer);函数来将键盘上的值显示到LED和LCD上。

 

流程图:

实验四 键盘、LED及LCD应用实验_第3张图片

具体代码如下:

Systic中断代码:

kb = KBScanN(10);          //扫描键盘

if (Syscount >= 20) {

Syscount = 0;

if (kb != 0xff)  //有实际按键

g_LEDBuffer[0] = 23;

g_LEDBuffer[1] = 23;

g_LEDBuffer[2] = 23;

g_LEDBuffer[3] = KBDef(kb) - '0';

g_LCDBuffer[31] = KBDef(kb);

LEDshow(g_LEDBuffer);

LCDShow(g_LCDBuffer);

}

(3)通过串口调试助手向串口发送时间,将时间显示到LED上并计时。

思路分析:

  1. 通过串口接收发来的时间信息,并存到g_time数组中
  2. 显示时间则课使用Systic实验中的g_time数组中的时间赋值给g_LEDBuffer数组在LED上显示时间
  3. g_time中分和秒是在后两个字节存放,并且则我们需要将分和秒拆分成四个数字才能存放到g_LEDBuffer中。

 

流程图:

串口中断函数流程图:

实验四 键盘、LED及LCD应用实验_第4张图片

 

主函数流程图:

实验四 键盘、LED及LCD应用实验_第5张图片

 

Systic中断中LED显示时间流程图:

 

主要代码如下:

时间的控制以及通过串口输入时间由实验三中设置时间的实验的代码实现,

g_time赋值给g_LEDBuffer的代码放在主函数中。

if (g_time[2] != remember) {

g_LEDBuffer[0] = g_time[1] / 10;

g_LEDBuffer[1] = g_time[1] % 10;

g_LEDBuffer[2] = g_time[2] / 10;

g_LEDBuffer[3] = g_time[2] % 10;

}

 

(4)通过键盘设置时间,将时间显示到LED上并计时。

思路分析:

  1. 在前两个实验的基础,我们可以将键盘的值输入到LED显示屏上,同时也可以将时间的值输入到LED显示屏,则本实验只需设定修改时间的方法即可。
  2. 首先设置两个修改时间的控制按键(我在此将E键设定为暂停时间并且开始修改时间,将F键设定为修改完成),在E和F的控制下,设定g_flag的值来控制后续时间的输入(若输入为E,则g_flag为1,若输入为F则g_flag为0)。
  3. 在实现的过程中,发现一个按键如果按压的时间过长,则其值会输入多次,在这里我利用死锁的思想,定义了变量g_lock来控制时间的输入,以防止按键值输入多次。

流程图:

实验四 键盘、LED及LCD应用实验_第6张图片

 

主要代码如下:

void SysTick_Handler(void) {

uint_8 kb;

static uint_8 SysTickcount = 0;

static uint_8 Syscount = 0;

SysTickcount++;

Syscount++;

kb = KBScanN(10);          //扫描键盘

if (Syscount >= 20) {

Syscount = 0;

if (kb != 0xff)  //有实际按键

{

g_LCDBuffer[31] = KBDef(kb);  //填写 LCD缓冲区

if (kb == 0x7B) {//E

g_flag = 1;  //g_flag取1时间暂停开始修改时间。

} else if (kb == 0x77) {//F

g_flag = 0;  //g_flag取0时间继续。

}

if ((g_flag == 1) && (kb != 0x7B) && (kb != 0x77)) {

g_LEDBuffer[TimeCount] = 23;

LEDshow(g_LEDBuffer);    //LED对应的部分暗

g_LEDBuffer[TimeCount] = param(kb);

if (TimeCount == 3) {

TimeCount = 0;

} else {

if ((g_lock == 0) && (kb != 0xFF)) {

g_lock = 1;

}

}

} else if ((g_flag == 0) && (kb == 0x77)) {

g_time[1] = g_LEDBuffer[0] * 10 + g_LEDBuffer[1];

g_time[2] = g_LEDBuffer[2] * 10 + g_LEDBuffer[3];

}

LCDShow(g_LCDBuffer);               //LCD显示

}

} else if ((g_lock == 1) && (kb == 0xFF)) {

g_lock = 0;

TimeCount++;

}

if (SysTickcount >= 200)   //1s到

{

SysTickcount = 0;

//秒计时程序

SecAdd1(g_time);      //g_time是时分秒全局变量数组

}

LEDshow(g_LEDBuffer);

}

uint_8 param(uint_8 kb) {

if ((KBDef(kb) - '0') < 10)

return KBDef(kb) - '0';

else

return KBDef(kb) - '1';

}

3.进阶实验★

 

四.实验总结(需加入心得体会)

通过本次实验,我深入理解了KB键盘构件、LED构件及LCD构件的设计方法和使用方法,理解了如何将指定的字符显示到LED和LCD显示屏上。在设计键盘控制LED的过程中,经过与同学和老师的讨论学习,利用死锁的思想解决了按键重复问题。

嵌入式技术基础与实践(第4版)

 

 

 

你可能感兴趣的:(嵌入式)