找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4850|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机矩阵式键盘输入实验

[复制链接]
跳转到指定楼层
楼主
ID:780424 发表于 2020-6-15 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、实验目的
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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表