电子电路设计实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子线路专题实验口

、实验要求:

1.认真阅读学习系统线路及相关资料

2.将键盘阵列定义为0. 1.2------ E. F编程实现将键盘输入内容显示在LCD显示

器上。

3.编程实现将日历、时钟显示在LED显示屏上(注意仔细阅读PCF8563资料),日历、时钟轮回显示。

4.利用D/A转换通道(下行通道)实现锯齿波发生器;输出(1~5V)固定电压转换成(4~20mA)电流。

5.利用A/D 转换通道(上行通道)实现数据采集,将采集信号显示在

LED屏上。程序要求分别具有平均值滤波、中值滤波和滑动滤波功能。

6.将按键阵列定义成与16 个语音段对应,编写程序,实现按键播放不同的语音段。

二、实验设计思路:

本次实验用c语言实现,主要包括LCD, LED AD,DA,日历芯片,测温传感芯片。受到嵌入式系统实验的启发,将LCD LED, I2C总线协议,键盘扫描模块接口写成一个文件库(放在library 文件夹下),尽量做到调用时与底层硬件无关。通过调用库文件中的函数,实现代码的重用性。键盘,LCD的代码由于与嵌入式实验具有相通之处,因此可将高层的函数(与底层硬件无关的函数)方便地移植过来。

三、实验设计:

1. 矩阵键盘扫描模块

4X4的矩阵键盘,通过扫描可得到按下键的行列值,将行列值转换为相应的对应数字0〜F。函数GetKeyO实现获得按键的键值。对于键盘模块对于对按键的键值识别主要是通过两次扫描而取得。对于第一次扫描,给四行键全部赋予1,然后读回键盘值,对于第二次扫描,逐行为键盘送1,每次送 1 后再读回键盘值,若非零,说明此行有键按下,最终确定键值。

通过调用GetKey函数构造GetChar(函数,实现获取键盘字符的功能。

通过调用GetChar(函数构造GetDec()函数,实现获取键盘输入整数的功能,整数范围在0〜99999。有按'键回退一格,按''清空当前未完输入,按'键结束输入的功能。

{

程序代码: // 键盘初始化,将标志位置 1; void Key_Init(void) {

bKeyUp_Flag=1;/标志(全局变量)位置 1 }

// 键盘扫描函数,得到键的行列位置 ; unsigned char GetScanKey(void) { unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff; for (i=1; i<0x10; i<<=1) { ptr=0x8fff; * ptr =i;

//i 的低 4 位为行数位,行依次检测循环 4 次

temp = * ptr; temp &= 0x0f; if (temp!=0x00) { // 取键盘 IO 口的值

// 屏蔽高四位 // 是否有有效键

key = i<<4;

key|=temp; break;

// 取行数位的值并将其放入返回值高 4 位 //列数位的值放入返回值低 4 位

}

} return key; } // 返回行位(高四)和列位(低四) // 取键值,长按无效 unsigned char GetKey(void) {

unsigned char key, temp; if (!bKeyUp_Flag) //判断标志,是 0 执行 /***按键程序执行一次后会将bKeyUp_Flag 标志位清零,执行此段程序, 长按键无效返回无效值,直至按键无效返回无效按键值, 置"1"标志位。

按键输入恢复有效。屏蔽这部分则长按键有效 ***/

key=GetScanKey();

if (key==0xff) // 没有按键,置标志位

bKeyUp_Flag=1;

// 保持按键

//因为Oxff 大于15,故为无效键值,实现长按键无效

key=GetScanKey(); if (key==0xff) return key; else temp=key; Delay_ms(20); key=GetScanKey(); //键盘扫描 if(key!=temp) //判断两次键值是否相同,排除干

扰信号影响确认有效 信号

{

key=0xff;

return key; } else

{

/* 这部

分主要作用是软件抗干扰 */ temp=Key_Value_Table[key>>4]; //见说明

/*行值有效位(键盘的4个行SEL 返回的值含有的有效位"1")有且只有 一

位键值才有效否则返回无效键值 */

if (temp==0xff)

{ key=0xff; return key;

} temp=Key_Value_Table[key&0x0f];

/*列值有效位(键盘的4个列RL 返回的值含有的有效位"1")有且只有一 位

键值才有效否则返回无效键值 */

if (temp==0xff)

{ key=0xff; return key;

}

key=Key_Value_Table[key>>4]*4+Key_Value_Table[ke y&O xOf]行对应的

中间值的四倍与列对应的中间值之和即为按键编号 0~15

/*行列组合后的值大于 15无效*/ if (key>15) { key=Oxff; return key;

}

else

return Oxff;

// 没有按键

//有按键有效

//取键值 //延时20ms 消抖

// 取键值

相关文档
最新文档