查询按键控制数码管的显示

博客介绍了数码管原理,数码管由8个发光二极管组成,通过控制亮灭显示数字。四位数码管段码8根线、位选4根线,位选端依次打开,段码送出对应数字段码。还提及使用keil c和proteus工具,包含仿真电路图和C语言代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.仿真电路图

在这里插入图片描述

二.c语言代码

#include"at89x51.h"
unsigned int j;
unsigned char i,k,cz;
unsigned char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c};//数码管的码表,0-9
unsigned char b[]={0,0,0,0};
unsigned int wx=1150;


bcd()//将一个四位数拆开
{  	
	b[0]=wx/1000;
	b[1]=(wx%1000)/100;
	b[2]=(wx%100)/10;
	b[3]=wx%10;
}

tv()//每一个for循环只显示一位数,且位选与段码相对应,
    //程序快速、反复执行tv函数,肉眼就分辨不出这四个数是一位一位显示出来的,这就是动态扫描
{    
	cz=0xfe;  //位选端初值1111 1110从左往右一次是P0_7,P0_6...P0_0
	for(i=0;i<4;i++)		
	{
		k=b[i];//k作为中转保存b数组中的数例如:b[0]=1,则k=1
		P2=a[k];//P2口是段码,a[1]即a数组中的第二个:0x06,在数码管上显示出1的模样
		P0=cz;	
		for(j=0;j<550;j++);//延时
		cz=(cz<<1)+1;//将'0'左移:1111 1110先左移一位,空出来的用0补上即1111 1100,再加1即为1111 1101
	}
}


Key() 
{
	if(P3_2==0)//P3_2按键按下
	{ 
		while(P3_2==0);//在按键按下时程序在这里进入死循环等待按键松开
		wx=wx+9;//按键松开后执行这一句
		if(wx>=1200){wx=1200;}//判断wx是否大于1200,如果大于1200则wx不再增加
	}
	if(P3_3==0)//P2_3按键按下
	{ 
		while(P3_3==0);
		wx=wx-12;
		if(wx<=1100){wx=1100;}//判断wx是否小于1100,如果小于1100则wx不再减少
	}
}



void main(void)
{	 
	while(1)
	{ 
		key();
		bcd();
		tv();
	}
}


数码管本质是8个长条形状的发光二极管,组成一个‘8’的形状,这些二极管全亮就是8全不亮就是0,8个发光二极管按顺序排列,并表上abcdefgh的序号,通过控制个别二极管的亮与不亮来达到显示数字的效果。
至于四位数码管,段码是8根线,也就是一位数码管的那8根线,位选四根线,位选就相当于四个数码管的开关,因为段码的8跟线一次只能传一个数,所以数码管只能有一位数显示出来,如果开关全部打开那么四位数码管就会显示出一样的数字,与我们想要表达的东西是不一样的,所以位选端一次只打开一个数码管的开关,而且从左往右依次打开,相应的,段码也送出相应的数的段码,只要给数的速度够快,人眼就分辨不出来。
工具:keil c、proteus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值