AT89C51/52开发按键控制数码管程序(数码管可以显示多位数字)

本文详细介绍了如何在C语言中通过定义常量和函数,实现对REGX52.H和intrins.h库的调用,以控制数码管的多位显示和按键扫描功能。main()函数中包含了一个无限循环,不断进行扫描并更新显示。
摘要由CSDN通过智能技术生成

代码实现

#include <REGX52.H>
#include <intrins.h>
#define SMG_PORT P0 /* 数码管段选引脚 */
#define Bit_Choose P2/* 数码管位选引脚 */
#define PORT P1/ * 按键引脚 */

typedef unsigned char uint8_t;
uint8_t row  = 0, column = 0;
unsigned char i,X,Y;
int gsmg_code[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0xff,0x39,0xbf,0x79,0x71};

void Delay100us(void);
void Delay100ms(void);

/*多位显示*/
void smg_display(unsigned long j)
{
	unsigned long x = 1;
	uint8_t num[8] = {0};
	uint8_t digit = 0;
	unsigned long lat = j;
	
	do{
		lat = lat / 10;
		digit++;
	}
	while(lat != 0);

	for(i = 0;i <digit;i++)
	{
		num[i] = j % (10 * x) / x;
		x *= 10;
	}
	
	for(i=0;i<digit;i++)
	{
		/*位选*/
		Bit_Choose = i << 2;
		
		/*段选*/
		SMG_PORT = gsmg_code[num[i]];
		
		/*消影*/
		Delay100us();
		SMG_PORT = 0x00;
	}
	
}

/*按键扫描*/
void scan_key()
{

		PORT = 0xF0;  
		if(PORT != 0xF0){
			Delay100us();
			X = PORT & 0xF0;
			PORT = 0x0F;
			Y = PORT & 0x0F;
			
			switch(X)
			{
				case 0x70:
					row = 0;
					break;
				case 0xB0:
					row = 1;
					break;
				case 0xD0:
					row = 2;
					break;
				case 0xE0:
					row = 3;
					break;
				
			}
			
			if(X != 0xF0){
				switch(Y)
				{
					case 0x07 :
					column = 0;
					break;
					case 0x0b : 
					column = 1;
					break;
					case 0x0d : 
					column = 2;
					break;
					case 0x0e : 
					column = 3;
					break;
					
				}
		}
	}
		smg_display(row * 4 + column);
}


void main()
{
	while(1)
	{
	scan_key();
}
}

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

	_nop_();
	_nop_();
	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}
void Delay100ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值