51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
用P0口控制共阴数码管,具体程序如下:
#include"stc15.h"
sbit y1=P4^4;
sbit y2=P4^5;
sbit k1=P3^3;
sbit k2=P3^2;
char LED7CodeRight[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(int x)
{int i,j;
for(i=x;i>01;i--)
{for(j=255;j>0;j--);}}
void main()
{ int n=0;
P2=0xfe; // 初始显示0
P4MO=1<<4 | 1<<5;//强推
P4M1=0x00;
while(1)
{ if(k1==0) //如果第一个按键按下
{delay(30)}; //延时去抖
if(k1==0) //再判断是否按下
{ ++n}; //N加1
if(n==10) //如果N等于10,N为0
{n=0;}}
while(k1==0); //等待按键松开
{ if(k2==0)
{ delay(30); } //延时去抖
if(k2==0) //再判断是否按下
{ --n; //N减1}
if(n<0) //如果N小于0,N为9
{n=9;}}
while(k2==0); //等待按键松开 } }
y2=1;y1=1;
P2=LED7CodeRight[n]; //将段码送P0口
y2=0;y1=0;}}
扩展资料:
led数码管的分类:
1、按控制方式分:分为内控方式(内部有单片机,通电自动变色)和外控方式(需要外接控制器才能变色)。
2、按变化方式分:分为固定色彩的和七彩、全彩的;固定色彩的是用来勾轮廓的,全彩的可以勾轮廓,也可以组成管屏显示文字、视频等。
3、按尺寸分:有D50的、D30的,这是直径;长度基本上1米的(可以定制);这个需要根据实际需要进行选择就行了。
4、按内部可控性分:有1米6段的,有1米8段的和1米12段、1米16段、1米32段的。也就是1米的管子内有几段可以独立受控; 1米段数越多,做视频的效果越好。如果密度低,或者做些追逐效果,做1米6段也就可以了。
5、按led数量分:有1米96颗灯的,有1米144颗灯的;灯越多效果越好。一般做全彩的都是用1米144颗灯的。
6、按供电分:分为高压供电(直接220V供电)和低压供电(12v供电,220v电源需要加开关电源转换);一般选择低压供电的,比较可靠稳定,高压供电的容易烧毁。
名称:单个共阳数码管动态显示变化数字
内容:通过循环检测P1口按键输入值,然后用数码管输出,
没有按键按下时原值不变
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,};
// 显示数值表0-9
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
while (1) //主循环
{
switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断
{
case 0xfe:P1=table[1];break;//0xfe = 1111 1110,
//说明连接在P1.0端口的按键被按下,显示对应的数字然后跳出循环
case 0xfd:P1=table[2];break;
case 0xfb:P1=table[3];break;
case 0xf7:P1=table[4];break;
case 0xef:P1=table[5];break;
case 0xdf:P1=table[6];break;
case 0xbf:P1=table[7];break;
case 0x7f:P1=table[8];break;
default:break; //如果都没按下,直接跳出
}
}
}
有问题回复我哦
你是百度给我的吧,这个答案我看过了,好像不行
我是从资料里复制的,应该没问题,电路连的对不对?