C51单片机按键控制数码管

1.数码管底层函数(tube.c)

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


sbit SER = P2^7;
sbit RCLK1 = P2^5;
sbit SRCLK = P2^6;

unsigned char  cod1[]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char  cod2[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x40};


void Send(unsigned char dat){
	unsigned char i;
	for(i = 0;i < 8;i++){
		if(dat & 0x80)
			SER = 1;
		else
			SER = 0;
			
		SRCLK = 0;
		SRCLK = 1;
		dat = dat<<1;

	}
}

void Showshu(unsigned char u1,unsigned char u2){
	Send(cod1[u1-1]);
	Send(cod2[u2]);
	RCLK1 = 0;
	RCLK1 = 1;
}

void ShowS(unsigned char u1,unsigned char u2){
	Send(u1 - 1);
	Send(u2);
	RCLK1 = 0;
	RCLK1 = 1;
}


2.封装数码管底层(tube.h)

#ifndef __TUBE_H__
#define __TUBE_H__



void Showshu(unsigned char u1,unsigned char u2);
void ShowS(unsigned char u1,unsigned char u2);

#endif

3.矩阵按键底层函数(anjian.c)

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

void Delay10ms(void)	//@11.0592MHz
{
	unsigned char data i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}
unsigned char h,l;         
unsigned char keyscan(){

	P3 = 0xf0;
	if(P3 != 0xf0){
		Delay10ms();
		if(P3 != 0xf0){
			l = P3 ;
			P3 = 0x0f;
			h = P3 ;
			while(P3 != 0x0f);  //如若按键按着不动则代码将停在这
		}
	}
	return(l + h);
}



unsigned char keynum(){

	unsigned char sum = 0;
	switch(keyscan()){
				case 0xee : sum =  16; break;
				case 0xde : sum =  15; break;
				case 0xbe : sum =  14; break;
				case 0x7e : sum =  13; break;
				
				case 0xed : sum =  12; break;
				case 0xdd : sum =  11; break;
				case 0xbd : sum =  10; break;
				case 0x7d : sum =   9; break; 
				
				case 0xeb : sum =  8; break;
				case 0xdb : sum =  7; break;
				case 0xbb : sum =  6; break;
				case 0x7b : sum =  5; break;
				
				case 0xe7 : sum =  4; break;
				case 0xd7 : sum =  3; break;
				case 0xb7 : sum =  2; break;
				case 0x77 : sum =  1; break;
				
				}
			return sum;

}

4.封装矩阵按(anjian.h)

#ifndef __ANJIAN_H__
#define __ANJIAN_H__

unsigned char keyscan(); // 返回16进制
unsigned char keynum();  //返回十进制对应数值

#endif

5.整体实现(main.c)

#include <reg52.h>
#include "tube.h"
#include "anjian.h"

void main(){
	
	unsigned char keyNum;
	while(1){

		if(keynum() != 0) keyNum = keynum();
			Showshu(7, keyNum/10);
			Showshu(8, keyNum%10);
	
	}

}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值