51单片机4x4矩阵键盘扫描+数码管显示

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机4x4矩阵键盘扫描+数码管显示相关的知识,希望对你有一定的参考价值。

51单片机4x4矩阵键盘扫描+数码管显示


个位闪烁感在这篇文章已经修复《51单片机4x4矩阵键盘扫描+数码管显示(二)(修bug篇)

  • 材料:AT89C522位数码管74HC595
  • Proteus仿真

实例代码(先行后列扫描法)


#include<reg52.h>
#include "intrins.h"

sbit ST=P2^0;//定义74HC595移位寄存器
sbit SH=P2^2;
sbit DS=P2^1;

sbit P25=P2^5;//数码管十位显示
sbit P26=P2^6;//数码管个位显示
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
#define temp P1           //定义按键I/O口
u8 code smgduan[10]= {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳数码管段码
u8 duanZhi[]= {0,0};//数码管显示位数的数值数组
static u8 gewei, shiwei;
void delay_ms(unsigned int xms);
void SendTo595(u8 byteData);
u8 keyscan2();

void display(u8 date);
void delay(int s)
{
    u16 i,j;
    for(i=0; i<s; i++)            //延时函数
        for(j=114; j>0; j--);
}
void main()
{ 

    while(1)
    {
      display(keyscan2());
    }
}
/***********************************************************
*函数名		:SendTo595
*功能		:串行发送8个比特(一个字节)的数据给595,再并行输出
*参数		:byteData
************************************************************/
void SendTo595(u8 byteData)
{
    char i=0;
//    P2=duanMa[n];
    ST = 0;   //ST //先拉低,为后面的上升沿做准备
    for(i; i<8; i++)
    {
        //  SH = 0;//先拉低,
//        if(byteData&0x80)DS=1;
//        else DS=0;
        DS = (byteData&0x80)?1:0;
        byteData = byteData <<1;		//该字节右移一位
        SH = 1;
        _nop_();
        _nop_();
        SH = 0;        //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
    }
		/*位移寄存器数据准备完毕,转移到存储寄存器*/
    ST =1;//上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
    _nop_();
    _nop_();
    ST = 0;
}
void display(u8 date)
{
    gewei = date%10;
    shiwei = date/10;
    duanZhi[0]=smgduan[shiwei];
    duanZhi[1]=smgduan[gewei];

    P26=0x00;//1101 1111
    P25=0x01;
    SendTo595(duanZhi[0]);//,而且在个位前面先显示。
    delay(50);

    P25=0x00;
    P26=0x01;
    SendTo595(duanZhi[1]); //送段码
   delay_ms(6);
//消隐
    P25=0x01;
    P26=0x01;
}
/*************************************************
 * 函数名:delay_ms
 * 描述  :延时函数  (具体情况以自己的板子为准)
 * 参数  :xms  , xms是几延时几毫秒 。晶振:12MHz
 * 返回值:无
 * 调用  :内部调用
 *************************************************/
void delay_ms(unsigned int xms)
{
	unsigned int i, j;
	for(i=xms;i>0;i--)
	{
		for(j=921;j>0;j--);
	}
}
u8 keyscan2()
    {
       u8 num;
       temp=0xf0;
//       if(temp!=0xf0)    //检测是否有键按下
//       {
//          delay_ms(5);    //延时消抖
          if(temp!=0xf0)   //再次检测是否有键按下
          {
             temp=0xf0;     //对应IO口拉高,以便检测
             switch(temp)   //先确定行
             {
                case 0x70: num=1;  break;   //第一行
                case 0xb0: num=5;  break;   //第二行
                case 0xd0: num=9;  break;   //第三行
                case 0xe0: num=13; break;   //第四行
             }
             temp=0x0f;     //对应IO口拉高,以便检测
             switch(temp)   //再确定列
             {
                case 0x07: num=num+0; break;   //第一列
                case 0x0b: num=num+1; break;   //第二列
                case 0x0d: num=num+2; break;   //第三列
                case 0x0e: num=num+3; break;   //第四列
             }
          }
//       }
       return num;   //结合行列扫描的值得出按键对应的数值,并返回
    }

以上是关于51单片机4x4矩阵键盘扫描+数码管显示的主要内容,如果未能解决你的问题,请参考以下文章

51单片机4x4矩阵键盘扫描+数码管显示(修bug篇)

Proteus仿真4X4矩阵按键扫描组成的简易加法器

单片机入门-矩阵键盘控制数码管显示

Proteus仿真51单片机4x4矩阵键盘扫描lcd1602显示

Proteus仿真51单片机+4X4矩阵按键扫描+数码管0-F显示

51单片机 数码管显示(0 -F)+4×4键盘矩阵按键输入