单片机原理及应用3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学信息工程与自动化学院学生实验报告
( 2012 —2013 学年第 二 学期 )
课程名称:单片机原理及应用 开课实验室:信自楼234 2013年 5 月 30 日 年级、专业、班 自动化102 学号 201010401127
姓名 林浩廷 成绩 实验项目名称
实验三 键盘中断实验 指导教师 张光辉
教
师
评语 教师签名:
年 月 日 注:报告内容按实验须知中七点要求进行。
一、实验目的
1.熟练运用CodeWarrior 嵌入式开发系统环境、汇编、C 语言、调试方式。
2.复习串行通信接口(SCI )的内容。
3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码。
5.理解键盘接线原理图(如图5-1)。
二、实验原理及基本技术路线图
本实验采用的是4×4矩阵式键盘(以下简称键盘)。
PTG4、PTD2、PTD3、PTD7分别接四根列线,定义为输入且上拉,PTG0~PTG3分别接四根行线,且定义为输出。
行扫描法是使键盘的某一行输出为低电平,其余行为高电平,然后读取列值,如果列值中有某位为低电平,则表明该行和列交点处的键被按下;若为全高则再扫描下一行,直至扫描完全部的行线为止。
这样就可以确定是哪一行哪一列交点的键被按下。
MCU 与键盘接线原理图:
三、所用仪器
飞思卡尔试验箱
四、实验方法、步骤
要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示。
当键值被按下时,高端虚拟键盘被按下。
1、资源使用
键盘的数据线分别接在MCU G 口的0-4 号引脚、 D 口的2、3、7 号引脚。
MCU的SCI发送引脚 E 口的0 号引脚接MAX232的TTL电平接收引脚( 11 号),MCU的SCI接收引脚 E 口的 1 号引脚接MAX232的TTL电平发送引脚( 12 号)。
2、硬件设计(标识引脚名)
图5-2 4×4键盘按键的信息显示在PC机界面的连线图
3、软件设计
(1)下面填写主程序main。
(填写主程序main.c)
#include "Includes.h"
void main(void)
{
//1 关总中断
DisableInterrupt(); //禁止总中断
//2 芯片初始化
MCUInit();
//3 模块初始化
//3.1 SCI初始化
SCIInit(SCI_NUM_1,SYSTEM_CLOCK,38400);//用SCI1,系统时钟为时钟源,波特率为9600
//3.2 键盘初始化
KBInit();
//4 开中断
//4.1 开键盘中断
EnableKBint();
//4.2 开总中断
EnableInterrupt();
//5 主循环
while (1)
{
}
}
键盘中断程序
(填写C语言编写的键盘中断程序)
#include "isr.h"
//-------------------------------------------------------------------------*
//函数名: isrKeyBoard * //功能: 扫描键盘,向串口发送键值和定义值* //参数: 无* //返回: 无* //说明: 调用了KBScanN、SCISend1、KBInit函数* //-------------------------------------------------------------------------*
interrupt void isrKeyBoard(void)
{
uint8 value;
uint16 i;
for(i=0; i<1000; i++);
DisableInterrupt(); //关总中断
DisableKBint(); //屏蔽键盘中断
value = KBScanN(10); //扫描键值,存于value中
if(value!=0xFF)
{
SCISend1(SCI_NUM_1, value); //发送键值
SCISend1(SCI_NUM_1,KBDef(value));//键值转化为定义值并发送
}
KBInit(); //键盘初始化键盘中断
EnableKBint(); //开放键盘中断
EnableInterrupt() ; //开总中断
}
(2)PC端软件的SCI接收函数
(填写PC机的SCI接收函数)
Private void SCIPort_DataReceived
(object sender,System.I/O.Ports.Serial Data Received Event Argse)
{
String str = String.Empty;
bool Flag;//标记串口接收数据是否成功
int len;//标记接收的数据的长度
//调用串口接收函数,并返回结果
Flag = sci.SCIReceiveData(SCIPort,ref PublicVar.g_ReceiveByteArray);
if (Flag == true)//串口接收数据成功
{
len = PublicVar.g_ReceiveByteArray.Length;
//对于字符串形式,考虑到可能有汉字,
//直接调用系统定义的函数,处理整个字符串
str = Encoding.Default.GetString(PublicVar.g_ReceiveByteArray);
SCIUpdateRevtxtbox(TbShowString, str);
//十进制和十六进制形式按字节进行处理
for (int i = 0; i < len; i++)
{
//十进制都是按照三位来显示,字节之间有空格表示区分
SCIUpdateRevtxtbox(TbShowDec,
PublicVar.g_ReceiveByteArray[i].ToString("D3") + " ");
//十六进制都是按照两位来显示,字节之间有空格表示区分
SCIUpdateRevtxtbox(TbShowHex,
PublicVar.g_ReceiveByteArray[i].ToString("X2") + " ");
}
this.TSSLState.Text = "过程提示:数据接收成功!";
}
//接收数据失败
else
this.TSSLState.Text = "过程提示:数据接收失败!";
}
五、实验过程原始记录
六、实验结果、分析和结论
通过该实验,了解单片机的键盘模块,熟悉和掌握了嵌入式开发环境及调试方式,进一步熟悉汇编编程和C语言编程,理解了课本中的程序代码。