51单片机驱动数码管及矩阵键盘

一、51单片机驱动数码管

使用设备:51单片机,、数码管、74HC595串行转并行芯片

1.74HC595引脚讲解

管脚说明:

14脚:DS(SER),串行数据输入引脚
13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK(STCP),存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存到存储寄存器。
11脚:SCK(SHCP),移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。
10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可。
9 脚 :串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。
Q0~Q7:并行输出引脚。

使用参数:

  • VCC:2V~6V,5V最好
  • IQn:± 35mA

74HC595的最重要的功能就是:串行输入,并行输出。

其次,74HC595里面有2个8位寄存器:移位寄存器、存储寄存器。

74HC595的数据来源只有一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个字节了。


2.电路原理图

3.代码

源文件

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

// 定义数码管的数字对应的段码
unsigned char code digitCode[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit DS=P2^4;	 //数据引脚
sbit SH_CP=P2^5; //移位寄存器时钟引脚
sbit ST_CP=P2^6; //存储寄存器时钟输入引脚


// 简单的延时函数
void Delay_disp(unsigned int ms)
{
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 120; j++);
}



//发送一个字节数据给595再并行输出
void SendTo595(unsigned char Data)
{
   char i=0;
	ST_CP = 0;
   for(i;i<8;i++)
   {
		    SH_CP = 0; 
		 
        DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
		 
        Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
 
        SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
        _nop_();
 
   }  
   
   /*位移寄存器完毕,转移到存储寄存器*/
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
   _nop_();
 
}

/*
@:四位数码管显示函数
*/
void Dispaly_595(unsigned int value)
{
	unsigned char digital[4];
	unsigned char i=0;
	
	if(value>=100)
	{
		digital[0]=value/100;
		digital[1]=value/10%10;
		digital[2]=value%10;
		
		for(i=0;i<3;i++)
		{	
			P2 |= (1<<i);
			SendTo595(digitCode[digital[i]]);
			Delay_disp(10);
			P2 &= ~(1<<i);
		}

	}
	else if(value>=10 && value < 100)
	{
		digital[0]=value/10;
		digital[1]=value%10;
		
		for(i=0;i<2;i++)
		{
			P2 |= (1<<i);
			SendTo595(digitCode[digital[i]]);
			Delay_disp(10);
			P2 &= ~(1<<i);
		}
	}
	else if(value < 10)
	{
			P2 |= (1<<0);
			SendTo595(digitCode[value]);
			Delay_disp(10);
			P2 &= ~(1<<0);
	}
}

头文件

#ifndef _SHUMA_H_
#define _SHUMA_H_

#include <reg52.h>


void Display(unsigned int value);
void SendTo595(unsigned char Data);
void Dispaly_595(unsigned int value);

#endif

二、矩阵键盘

1.电路原理图

矩阵键盘需要根据实际的电路来设置引脚及返回值

3.代码

源文件

#include "key.h"

#define row_num 4
#define col_num 4

#define KEY_PORT P1

unsigned char key[row_num][col_num]={      //键盘值定义
			 {'1','2','3','A'},
			 {'4','5','6','B'},
			 {'7','8','9','c'},
			 {'*','0','#','D'}
		  };

unsigned char KeyColValue=0;  
unsigned char KeyRowValue=0;
	  
	  
void key_sacnf(void)
{
	KEY_PORT = 0x0f;
	mdelay(10);
	if(KEY_PORT != 0x0f)
	{
		mdelay(10);
		if(KEY_PORT != 0x0f)
		{
			switch(KEY_PORT) //根据IO的值来确定哪一行按键按下
			   {
				   case(0x07): KeyColValue = 3; break;
				   case(0x0b): KeyColValue = 2; break;
				   case(0x0d): KeyColValue = 1; break;
				   case(0x0e): KeyColValue = 0; break;
			   }
			   
			   KEY_PORT = 0xf0;
			   if(KEY_PORT != 0xf0)
			   {
					switch(KEY_PORT) //根据IO的值来确定哪一行按键按下
						{
						   case(0x70): KeyRowValue = 3; break;
						   case(0xb0): KeyRowValue = 2; break;
						   case(0xd0): KeyRowValue = 1; break;
						   case(0xe0): KeyRowValue = 0; break;
						}
						LCD_ShowString(1,1,key[KeyRowValue][KeyColValue]);
			   }
		}
	}
}


头文件

#ifndef _KEY_H_
#define _KEY_H_

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

void key_sacnf(void);

#endif

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无問.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值