1. 显示部分电路
本实验仪的LED显示电路和键盘电路如图1。显示控制的位码由74HC374输出,经MC1413反向驱动后,做LED的位选通信号。位选通信号也可做为键盘列扫描码,键盘扫描的行数据从74HC245读回,374输出的列扫描码经245读入后,用来判断是否有键被按下,以及按下的是什么键。如果没有键按下,由于上拉电阻的作用,经245读回的值为高,如果有键按下,374输出的低电平经过按键被接到245的端口上,这样从245读回的数据就会有低位,根据374输出的列信号和245读回的行信号,就可以判断哪个键被按下。LED显示的段码由另一个74HC374输出。
键盘和LED显示的地址译码见下图,做键盘和LED实验时,需将KEY/LED CS 接到相应的地址译码上。位码输出的地址为0X002H,段码输出的地址为0X004H,键盘行码读回的地址为0X001H,此处X是由KEY/LED CS 决定,参见地址译码。例如将KEY/LED CS接到地址译码的CS0上,那么位码输出的地址就为08002H,段码输出的地址就是08004H,键盘行码读回的地址为08001H。
图1: 键盘及LED显示电路
2. 译码电路
CS0 08000H~08FFFH
CS1 09000H~09FFFH
CS2 0A000H~0AFFFH
CS3 0B000H~0BFFFH
CS4 0C000H~0CFFFH
CS5 0D000H~0DFFFH
CS6 0E000H~0EFFFH
CS7 0F000H~0FFFFH
即高位地址由3-8译码器输出为cs0-cs7.
实验要求:
1. 按照电路图给出的电路,正确设计链接显示电路。即,选择合适的cs和相应的374的选择端联接。
2. 按照上课讲到的方法,设计一套c语言代码,使用定时计数器中断完成一个给定的全局数组的扫描显示。
3. 程序画出流程图,并提交实验报告,报告中有源程序。
邮箱是shuangfeng_yang@yahoo.com.cn
非常感谢,因为我不喜欢硬件方面的东西,所以这门课学的并不好,万分感激
看样子是学生,看样子是做课程设计。看样子这忙不该帮呀,老大
俺做出来了,呵呵。只是自己不会编写函数啊,而且本MM又很讨厌硬件方面的东西哦,没办法。。。。。
这东西不难,不过发个照片先。确认身份后,单身的大侠才会出手的。
这里我写了一个程序,跟你的电路差别不大,你自己看看再修改一下吧
[code]
/***************************************************************************************
*
*函数功能:4*4矩阵键盘扫描--行扫描法
*功能描述:有键按下键码返回为keycode[i *4 + j],没有键按下则返回-1,按键没有松开也返回-1
*内部变量:i--行值,j--列值,VALUE--键盘读入数据,null--连击标志
*输入参数:无
*输出参数:keycode[i *4 + j]
*
**************************************************************************************/
#include "stc.h"
#include "stdio.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define key_interface XBYTE[0x6000]//键盘接口
unsigned char code keycode[16] = { 0x01,0x02,0x03,0x0f,//自定义键盘编码
0x04,0x05,0x06,0x0e,
0x07,0x08,0x09,0x0d,
0x0a,0x00,0x0b,0x0c};
//键盘扫描函数------行列反转法-------//
uchar keyboard(void)
{
unsigned char i,j,VALUE;//行扫描值,列扫描值,键值
static bit null = 0;//连击标志
for(i = 0;i < 4;i ++)
{
key_interface = 0xf7 >> i;//输出扫描行
if((VALUE = key_interface & 0xf0) != 0xf0)break;//读入扫描列
}
if((~VALUE & 0xf0) == 0)//没有按键按下返回 -1,同时清除连击标志位
{
null = 0;
return(-1);
}
if(null == 1)return(-1);//按键被连击,返回 -1
for(j = 0;j < 4;j ++)
if(((VALUE << j) & 0x80) == 0)break;
null = 1;//有键盘被按下,确定连击标志
return(keycode[i * 4 + j]);//返回按键编码
}
void delay_key(void)
{
int i;
for(i = 0;i < 250;i ++);
}
char scanf(void)
{
uchar get_char;
char gnull;
get_char = keyboard();
if(get_char == -1)return(-1);
else
{
delay_key();
gnull = keyboard();
if((gnull == -1) && (get_char != -1))return(get_char);
else
return(-1);
}
}