栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C51单片机--按键及LED显示

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C51单片机--按键及LED显示

4X4按键和数码管

文章目录
  • 4X4按键和数码管
  • 一、8位数码管从左至右显示数字1-8
  • 二、读入4X4按键,按下不同的按键可以在最右侧数码管显示数字0-F
  • 三.将4X4按键和8位LED数码管结合,按下不同的按键,在数码管不同的位置显示
  • 总结

一、8位数码管从左至右显示数字1-8

实验仿真图:


控制数码管片选的是3-8译码器74HC138
该芯片数据如下


代码如下(示例):

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;    //位定义 定义矩阵键盘的四条列线
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;

uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F
//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9
void delay(uint t)
{
	uchar i;
	while(t--) for(i=0;i<200;i++);
}
void main()
{
	uchar i,temp=0xfc,j=0x7f;//fc 1111 1100   7f 0111 1111

	while(1)
	{
		
		for(i=1;i<9;i++)
		{
			P2=temp;//P2的3、4、5口连接3-8译码器,译码器接数码管片选
			P0=dis_code[i];//循环亮对应的数字
			temp=temp-1;//亮下一个数码管
			temp=temp&0xfc;//与1111 1100,这样上面的temp减一就会是从倒数第三位,即P2^2开始减
			delay(360);
		}
	}
}
二、读入4X4按键,按下不同的按键可以在最右侧数码管显示数字0-F

代码如下(示例):

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;    //位定义 定义矩阵键盘的四条列线
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;

uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F
//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9

void delay(uint t)
{
	uchar i;
	while(t--) for(i=0;i<200;i++);
}

void main()
{
	uchar i,temp;
	P0=0x00;
	while(1)
	{
		P1=0x7f;//7f是0111 1111,行扫描初值,开始扫描第一行P1^7那一行
		for(i=0;i<4;i++)//循环扫描四行
		{
			P2=0x00;//数码管灭

			if(L1==0) P0=dis_code[i*4+0];//当L1出现低电平,即P1^0那行,凉数
			if(L2==0) P0=dis_code[i*4+1];
			if(L3==0) P0=dis_code[i*4+2];
			if(L4==0) P0=dis_code[i*4+3];
			delay(25);
			temp=P1;
			temp=temp|0x0f;//或0f 0000 1111 或0为本身,或1为1,让高四位(行线)不变,列线为1
			temp=_cror_(temp,1);//右移一位
			P1=temp;//赋值给P1口,下次循环扫描下一行			
		}
	}
}
三.将4X4按键和8位LED数码管结合,按下不同的按键,在数码管不同的位置显示

程序的问题:按按键时有的按键需要长按一会数码管才会有显示,感觉应该是检测时一个太快的低电平单片机检测不出来,需要给一定时间的低电平。

代码如下(示例):

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;    //位定义 定义矩阵键盘的四条列线
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;

uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管0-F
//{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88};//共阳数码管0-9
//uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code a[]={0xff,0xf8,0xf4,0xf0,0x0f,0x08,0x07,0x00,0xff,0xf8,0xf4,0xf0,0x0f,0x08,0x07,0x00};//P2口连接的是3-8译码器 根据译码器的真值表,ff到00是亮第1到第8个数码管

void delay(uint t)
{
	uchar i;
	while(t--) for(i=0;i<200;i++);
}

void main()
{
	uchar i,temp;
	P0=0x00;
	while(1)
	{
		P1=0x7f;
		//P0=0x00;
		for(i=0;i<4;i++)
		{
			if(L1==0) {P0=dis_code[i*4+0];P2=a[i*4+0];}
			if(L2==0) {P0=dis_code[i*4+1];P2=a[i*4+1];}
			if(L3==0) {P0=dis_code[i*4+2];P2=a[i*4+2];}
			if(L4==0) {P0=dis_code[i*4+3];P2=a[i*4+3];}
			delay(50);
			temp=P1;
			temp=temp|0x0f;
			temp=_cror_(temp,1);
			P1=temp;
		}
	}
}

该处使用的url网络请求的数据。


总结

挺好

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649518.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号