(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显示屏上。
思路分析:
流程图:
串口流程图:
Main函数:
具体代码如下:
串口中断函数:
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上
思路分析:
流程图:
具体代码如下:
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上并计时。
思路分析:
流程图:
串口中断函数流程图:
主函数流程图:
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上并计时。
思路分析:
流程图:
主要代码如下:
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的过程中,经过与同学和老师的讨论学习,利用死锁的思想解决了按键重复问题。