标题: 51单片机矩阵式键盘输入实验 [打印本页]
作者: zxm870973 时间: 2020-6-15 21:46
标题: 51单片机矩阵式键盘输入实验
一、实验目的
1.学习矩阵式键盘工作原理
2.学习矩阵式接口的电路设计和程序设计
二、实验内容与结果
1.USB 线
2.单片机最小系统实验教学模块
3.矩阵式键盘实验模块
4.动态扫描数码管显示模块
题目: 在矩阵式键盘中的某个键被按下时,8 位 LED 动态显示器上最低位显示该键对应的字符,以前的字符向高位推进 1 位(即类似于计算器)。
程序:
(1)源代码
//头文件包含
#include <reg51.h>
#include <intrins.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
//共阴极数码管0-F的段码列表,表中最后一个0x00是显示为暗的断码表
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x53,0x79,0x71,0x00};
uchar Display_Buffer[]={16,16,16,16,16,16,16,16};
void DelayM(uint x)
{
uchar t;
while(x--)
{
for(t=0;t<120;t++);
}
}
uchar kscan()
{
uchari,temp,num=16;
for(i=0;i<4;i++)
{
//逐行扫描
P1=_cror_(0x7f,i);
//读取键值
temp=P1;
//读取键值,屏蔽高四位行值
temp=temp&0x0f;
//低四位列值
if(temp!=0x0f)
{
DelayM(5);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case0x77:num=0;break;
case0x7b:num=1;break;
case0x7d:num=2;break;
case0x7e:num=3;break;
case0xb7:num=4;break;
case0xbb:num=5;break;
case0xbd:num=6;break;
case0xbe:num=7;break;
case0xd7:num=8;break;
case0xdb:num=9;break;
case0xdd:num=10;break;
case0xde:num=11;break;
case0xe7:num=12;break;
case0xeb:num=13;break;
case0xed:num=14;break;
case0xee:num=15;break;
default:break;
}
}
//等待按键释放
while((temp&0x0f)!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
}
DelayM(5);
}
returnnum;
}
void main()
{
uchark,m=0x7f,num;
//关闭数码管的段选
P0=0x00;
//关闭数码管的位选
P2=0xff;
while(1)
{
num=kscan();
if(num!=16)
{
for(k=1;k<8;k++)
{
//显示向前移动一位
Display_Buffer[k-1]=Display_Buffer[k];
}
//最低位显示当前按键值
Display_Buffer[7]=num;
num=16;
}
//循环显示8位
for(k=0;k<8;k++)
{
m=_crol_(m,1);
P2=m;
P0=table[Display_Buffer[k]];
DelayM(2);
}
}
}
附件包含protues原理图和代码
-
-
实验6.zip
42.72 KB, 下载次数: 20, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |