看了你的程序,真让人无语啊,一个简单的加减数程序竟然能编写成这么繁琐
首先,你的数码管编码不对,除非你是自己做的硬件电路
再有,你的按键处理部分不好,也许可以实现你的功能吧,我没有验证
玩单片机这么久了,从没见过这样进行按键处理的
别的不多说了,给你一个我自己编写的加减数程序吧
端口已经按照你的板子连线改好了,至于数码管的编码,如果不对,你再自行修改吧
如果看不懂,或任何疑问,可以随时追问,也可私密我加个好友
#includereg52.h
sbit K1=P1^0; sbit K2=P1^1; sbit K3=P1^2;//按键端口定义
unsigned int count;//数码管显示用变量
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
/***************************************************************************/
void delay(char x) {char j;for(;x0;x--){for(j=100;j0;j--);}}//延时
/***************************************************************************/
void display(int xs)//四位数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10;
d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P2=0x01; delay(5); P2=0x00;
P0=table[d2]; P2=0x02; delay(5); P2=0x00;
P0=table[d3]; P2=0x04; delay(5); P2=0x00;
P0=table[d4]; P2=0x08; delay(5); P2=0x00;
}
/***************************************************************************/
void key()//按键处理
{
if(K1==0){delay(10);if(K1==0){count++;}while(!K1){display(count);}}//加一
if(K2==0){delay(10);if(K2==0){count--;}while(!K2){display(count);}}//减一
if(K3==0){delay(10);if(K3==0){count=0;}while(!K3){display(count);}}//清零
display(count); if(count9999){count=0;}//调用显示函数 及 防止溢出
}
/***************************************************************************/
void main(){count=1234; while(1){key();}}//主函数
/***************************************************************************/
常通对于一个较复杂的程序,在写程序之前,有些人习惯画流程图,或者说,是某些老教材上所讲的内容,一些人写毕业没计拿流程图凑数,一部分人写程序水平较一般才画流程图,你都有程序了,还要流程图,是为了凑页数?
告诉你步骤
1、根据原理图布局连线 比如S1是左下角第一键,那么就知道他按下是P3口的值
2、扫描P3口 if(P3==0xnn)---延时20-50ms(按键消抖)----- 再if(P3==0xnn)
在if语句下面内容大概这样
1)20160101数对应的显示真值表数组位 SMG[]={0xnn.0x00,0xnn------},比如2就对应smg[2]
2)具体用for循环
for(i=0;i8;i++)
{
P1=INDEX[I];//这个数值一开始要声明初始化,就是具体哪个位的数码管显示
P0=SMG[I]//这个数组一开始也要声明初始化,这个就是对应位显示的数字
DELAY(10)//延时5-10MS就是每个20-30MS每个数码管依次点亮显示内容,全部显示完不超多100ms,人眼在这个时间范围内会认为是全部点亮
}
8个数码管的话一般都是由一个三八译码器控制,而且有三个i/o口作为选择数码管的钥匙,三个i/o口按一定顺序组合成的二进制000~111即是数字为0~7的8个数码管分别对应的三极管(开关),三个i/o口对应哪个数字就打开哪个数字的开关从而对应的数码管就会亮,其他一定会灭,所以为i/o口的一次赋值,就只开一个数码管。所以要求8个数码管分别显示1~8其实就是很快地轮次开闭8个数码管的开关,不断循环往复,切换开关的速度让肉眼无法识别有闪动感,而且每切换一次开关之前记得先消除鬼影
如何快速切换开关?
1.定时器中断或定时器中断函数
2.普通的延时函数(延时要自己测试)
3.不延时(开关切换之前要消除鬼影)
程序如下(用的是STC89C52芯片):
#includereg52.h//52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
uint x,y;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共阴极数码管编码
void display(uchar,uchar,uchar,uchar);//声明子函数
void delay(int);//声明子函数
void main()
{
while(1)
{
display(1,2,3,4);//主程序始终调用数码管显示子程序
}
}
void display(uchar a,uchar b,uchar c,uchar d)
{
P2=0xef;
P0=table[a];//给第一个数码管送"a"
delay(1);//延时1ms
P2=0xdf;
P0=table[b];//给第二个数码管送"b"
delay(1);//延时1ms
P2=0xbf;
P0=table[c];//给第三个数码管送"c"
delay(1);//延时1ms
P2=0x7f;
P0=table[d];//给第三个数码管送"d"
delay(1);//延时1ms
}
void delay(uint z)//延时子函数
{
uint x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
扩展资料
led数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。
位数有半位,1,2,3,4,5,6,8,10位等等,led数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
参考资料来源:百度百科-数码管
有两种方式,一种是动态扫描,假设你数码管有COM1,COM2,COM3,COM4,然后有8个段,常见的是7个控制数码管段还有一个小数点一共8个段
那么这里就描述单片机一次扫描4位的过程,首先,如果你的数码管是共阳,那么显示第一位就将COM1引脚拉到高电平,然后8个引脚接到单片机IO口上,你说你要显示852.6,那么第一位是8,7个段全亮,所以7个IO全部拉低电平就行,随后延迟差不多1ms左右
接下来就是显示第二个数码管,和之前一样,COM2拉高,然后你要显示5的话有两个段是不亮的,所以哪两个脚你不想让他亮,你直接把对应的IO拉高就行,你要让剩下哪5个段亮直接拉高电平即可,随后再延时1ms左右
接下来两位和上面一样,对应位的COM口拉高电平,对应的字段IO你要让哪个段亮就把哪个拉低电平,哪个段不想亮就拉高电平,最后延时1ms就行
最后程序外面套个while(1)就可以实现无限循环了
还有一种方式就是用74HC595和4个数码管连接起来,74HC595是一个串行锁存寄存器,只需要4个74HC595和4个数码管就行,最少只占用单片机2个IO
这里就说明一下74HC595的控制方式
首先74HC595应该有个EN口,拉低,然后时钟拉高,循环8次,再把时钟信号拉低,用一个AND运算,如你要传输一个0XAA,那么就是
void InputData(0XAA)
{
for(int i=0;i8;i++)
{
if(dat0x01==1)
{
digitalWrite(SCK,LOW);
digitalWrite(DAT,HIGH);
delayMicroseconds(10);
}
else
{
digitalWrite(SCK,LOW);
digitalWrite(DAT,LOW);
delayMicroseconds(10);
}
dat=dat1;
digitalWrite(SCK,HIGH);
}
}
这里我是直接复制我以前写的一个arduino驱动74HC595的程序,SCK是时钟,DAT是数据
建议你把单片机和你数码管的电路图发出来,你说如何实现我不知道你是怎么接的数码管
单片机数码管显示流程图的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机数码管显示流程图