LED和键盘扫描驱动程序演示实验

单片机实验

27人已加入

描述

LED和键盘扫描驱动程序演示实验

一、实验目的
本程序展示了如何编写基于Small RTOS 键盘和LED扫描驱动程序。
二、实验设备及器件
PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
三、实验步骤
1. 短接A4 区的JP11,使用导线将A4 区的 /PL、CLK1 和Q7 脚分别跟A2 区的P15、
P16 和P17 连接起来。将A4 区的CLK2 和SER 脚接GND。
2. 短接A5 区的JP10,使用导线将A5 的CLK 和DINB 分别跟A2 区的P10、P11 连
接起来。将A5 区的DINA 和/CLR 脚接VCC。
3. 将A4 区J98、A5 区J5 分别连接到D1 区的J52、J53。如下:
P0 ――― LED1 Q0 ―――- KEY1
P1 ――― LED2 Q1 ―――- KEY2
P2 ――― LED3 Q2 ―――- KEY3
P3 ――― LED4 Q3 ―――- KEY4
P4 ――― LED5 Q4 ―――- KEY5
P5 ――― LED6 Q5 ―――- KEY6
P6 ――― LED7 Q6 ―――- KEY7
P7 ――― LED8 Q7 ―――- KEY8
4. 下载LED_Key.hex 文件到DP-51PROC 中并运行。
四、实验参考程序主要部分
/****************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
** (c) Copyright 2002-2004
** All Rights Reserved
** V1.20
*******************************************************************/
#include "config.h"
uint8 Key_buffer[2];
uint8 show_key;
void LED_Show();
void Get_Key();

void init(void)
{
TMOD = (TMOD & 0XF0) | 0X01;
TH0 = (65536 - (11059200 / 12) / 100) / 256;
TL0 = (65536 - (11059200 / 12) / 100) % 256;
TR0 = 1;
ET0 = 1;
TF0 = 0;
}
void init_Port(void)
{
P1 = 0xff;
}
/*************************************
**函数名称:void KdTxdByte(uint8 KdData)
**功能描述:驱动74HC164,串转并
***************************************/
void KdTxdByte(uint8 KdData)
{
uint8 i;
i = 8;
do
{
KdClk = 1;
if((KdData & 0x80)==0)
{
KdDat = 0;
}
else
{
KdDat = 1;
}
KdData <<=1;
KdClk = 0;
} while (--i != 0);
KdClk = 1;
}
/*************************************
**函数名称:uint8 Key_Scan(void)
**功能描述:驱动74HC165,并转串

***************************************/
uint8 Key_Scan(void)
{
uint8 i;
uint8 key;
key = 0;
KeyPL = 0;
KeyPL = 1;
KeyClk = 0;
for(i = 8; i > 0; i--)
{
key = (key<<1)|KeyIN;
KeyClk = 1;
KeyClk = 0;
}
return key;
}
/********************************************************/
main()
{
OSInit();
init();
init_Port();
OSTaskCreate(LED_Show , NULL , 0);
while(1)
{
PCON = PCON | 0x01; /* CPU 进入休眠状态 */
}
}
/****************************************************
**显示任务
**功能:显示按键的状态
****************************************************/
void LED_Show(void)
{
OSTaskCreate(Get_Key , NULL , 1);
while(1)
{
KdTxdByte(show_key);
OSWait(K_TMO , 1);
}

}
/****************************************************
**键盘扫描任务
**功能:获取键盘按键值
****************************************************/
void Get_Key(void)
{
while(1)
{
Key_buffer[0] = Key_Scan();
OSWait(K_TMO , 1);
Key_buffer[1] = Key_Scan();
if(Key_buffer[0] == Key_buffer[1])
{
show_key = Key_buffer[0];
}
OSWait(K_TMO , 1);
}
}
五、实验例程简析
本驱动程序创建了两个任务:显示任务和键盘扫描任务。创建方法如下:
OSTaskCreate(LED_Show , NULL , 0);
OSTaskCreate(Get_Key , NULL , 1);
显示任务的优先级比键盘扫描任务的要高。在键盘扫描任务中调用Key_Scan()函数
获取按键的状态,为了实现按键的去抖动,在两次获取按键状态的中间调用了系统函数
OSWait( )来实现延时,从而达到按键去抖动效果。实际上CPU 并不是在执行循环程序来实
现延时,而是通过任务切换使显示任务运行。等待键盘扫描任务延时时间到,并且显示任务
进入延时等待状态(调用OSWait( )函数)时,键盘扫描任务才得以继续运行。
运行本程序的效果是按下某个键,相应的LED 管就会发亮。松开按键,LED 管熄灭。
以上的程序是LED 和键盘扫描驱动程序在Small RTOS51 中应用的部分源代码,完整的源代
码请参考配套光盘中相关例子。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分