我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1312|回复: 0

4乘4矩阵键盘

[复制链接]

该用户从未签到

135

主题

2418

回帖

6591

积分

二级逆天

积分
6591

社区居民社区劳模原创达人最爱沙发忠实会员终身成就奖优秀斑竹奖

QQ
发表于 2015-3-19 16:03:44 | 显示全部楼层 |阅读模式
/*=============================程序说明===============================
项目名称:
    :
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include <reg52.h>
//===========================端口声明================================
#define keyIO P1
//声明4×4的矩阵键盘接在单片机的P1端口。
//=========================全局常量声明==============================

//=========================全局变量声明==============================
unsigned charData[]={17,17,17,17,17,17,0,0};//键码是唯一的,键值是可变的,人为约定的
//数码管显示数组。
unsigned char keycodeA=0xff;
//===========================函数声明================================
void display(unsigned char Data[]);
unsigned char keyscan(void);
void keydo(unsigned char keycode);
//============================主函数=================================
void main()//主函数
{   
         //---------------------------系统初始化--------------------------
         keydo(keycodeA);
   
   while(1)//死循环
    {
                   keycodeA=keyscan();
                   if(keycodeA!=0xff)
                   {
                            keydo(keycodeA);   
                   }

                   display(Data);
    }
}
//==========================功能子函数===============================
/*-------------------------------------------------------------------
函数名称:
    能:
    入:
    出:
    明:
-------------------------------------------------------------------*/
unsigned char keyscan(void)
{
         unsignedchar keycode=0xff;
         //默认没有按键按下。

         keyIO=0xf7;
         if((keyIO&0xf0)!=0xf0)
         {
                   display(Data);
                   display(Data);//去抖延时
                   if((keyIO&0xf0)!=0xf0)
                   {
                            keycode=keyIO;

                            while((keyIO&0xf0)!=0xf0)
                            {
                                     display(Data);
                            }                 
                   }
         }

         keyIO=0xfb;
         if((keyIO&0xf0)!=0xf0)
         {
                   display(Data);
                   display(Data);//去抖延时
                   if((keyIO&0xf0)!=0xf0)
                   {
                            keycode=keyIO;

                            while((keyIO&0xf0)!=0xf0)
                            {
                                     display(Data);
                            }                 
                   }
         }


         returnkeycode;
}


void keydo(unsigned char keycode)
{
         Data[0]=keycode>>4;
         Data[1]=keycode&0x0f;  

         switch(keycode)
         {
         case0x77: //S1
                   Data[6]=0;
                   Data[7]=1;
                   break;
         case0xb7:
             Data[6]=0;
                   Data[7]=2;
                   break;
         case0xd7:
                   Data[6]=0;
                   Data[7]=3;
                   break;
         case0xe7:
                   Data[6]=0;
                   Data[7]=4;
                   break;
         case0x7b:
                   Data[6]=0;
                   Data[7]=5;
                   break;
         case0xbb:
                   Data[6]=0;
                   Data[7]=6;
                   break;
         case0xdb:
                   Data[6]=0;
                   Data[7]=7;
                   break;
         case0xeb:
                   Data[6]=0;
                   Data[7]=8;
                   break;
         default:
                   break;
         }
}




/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
    能:在数码管上显示8位数据(0F)。
    入:Data[]//8位数码管要显示的数据。
    出:无
    明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
         unsignedchar code seg[]={
         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
         0xa1,0x86,0x8e,0xbf,0xff};
         unsignedchar code Bit[]={
         0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
         unsignedchar i=0;//记录显在哪位上。
         unsignedchar Time=0; //延时计数。
         for(i=0;i<8;i++)//8位数码管
         {
                   //---------段选------------
                   P2=0xf9;//选择段选开关。
                   P0=seg[Data];//送段选码。
                   WR=0;//
                   WR=1;//
                   //---------位选------------
                   P2=0xf8;
                   P0=Bit;
                   WR=0;
                   WR=1;
                   //---------扫频延时------------
                   Time=50;
                   while(Time--);
                   //---------消影------------
                   P2=0xf8;
                   P0=0xff;
                   WR=0;
                   WR=1;
         }        
}
回复

使用道具 举报

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

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表