电路原理图:段锁存器和位锁存器都接
单片机的P0口。
[img]file:///C:/Users/peng/AppData/Roaming/Tencent/Users/765030626/QQ/WinTemp/RichOle/V03YAF][J2VW()CW_1]Q@OU.jpg[/img]
我现在要实现的功能是让四只数码管显示四个数字,同时定义三个按键k1,k2,k3,按下k1使得四位数字的最低位闪烁,再按k1使得十位数字闪烁,这样一次类推,当按下k2时闪烁位加1,按下k3时闪烁位减1,请各位高手指点一下小弟!
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code duan_ma[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
// 显示段码值0123456789
unsigned char code wei_ma[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//分别对应相应的数码管点亮,即位码
sbit wei_suo=P2^0; //位选通
sbit duan_suo=P2^1; //段选通
sbit key1=P3^0; //左移键(按下SP1开始修改)
sbit key2=P3^1; //加键
sbit key3=P3^2; //减键
sbit d1=P3^3;
sbit d2=P3^4;
sbit d3=P3^5;
void display_ge(uchar);
void display_shi(uchar);
void display_bai(uchar);
void display_qian(uchar);
/oid shan_shuo();
/*延时子程序*******************************************************/
void delay(uint xms)
{
uint j;
for(;xms>0;xms--)
for(j=110;j>0;j--);
}
//四位的闪烁子函数
uchar shan_shuo_ge(m)
{ uchar t=50,ge,shi,bai,qian;
uint date=1234; //数码管显示变量声明
ge=date%10; //个位数换算
shi=date/10%10; //十位换算
bai=date/100%10; //百位换算
qian=date/1000;
while(m)
{
while(t--)
{
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
}
t=50;
while(t--)
{
display_shi(shi);
display_bai(bai);
display_qian(qian);
}
t=50;
if(key1==0)
{
delay(5) ;
while(!key1)
{
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
}
m=0;
}
}
return 1;
}
void shan_shuo_shi(n)
{ uchar t=50,ge,shi,bai,qian;
uint date=1234; //数码管显示变量声明
ge=date%10; //个位数换算
shi=date/10%10; //十位换算
bai=date/100%10; //百位换算
qian=date/1000;
while(n)
{
while(t--)
{
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
}
d2=0;
t=50;
while(t--)
{
display_ge(ge);
display_bai(bai);
display_qian(qian);
}
t=50;
if(key1==0)
{
delay(5) ;
while(!key1)
{
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
} //可加松手检测
n=0;
}
}
}
/*主程序***************************************************************/
void main()
{ uint date=1234;
uchar ge,shi,bai,qian,n=0,m=0; //数码管显示变量声明
static i=0;
ge=date%10; //个位数换算
shi=date/10%10; //十位换算
bai=date/100%10; //百位换算
qian=date/1000; //千位换算
while(1)
{
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
if(key1==0)
{
delay(5);
while(!key1)
{
d1=0;
display_ge(ge);
display_shi(shi);
display_bai(bai);
display_qian(qian);
}
while(!key1);
delay(5);
while(!key1);
i++;
if(i==3) //到第四个管子闪烁后i清零
{i=0;d1=1;}
switch(i) //key1松开后数码管开始闪烁
{
case 1: m=1;shan_shuo_ge(m);break; //在此增加按键加减
case 2: n=shan_shuo_ge(m);d1=0;;shan_shuo_shi(n);break;
default:break;
}
}
}
}
/*闪烁子程序**********************************************************/
/oid shan_shuo() //尝试用display2传递两个形参,来改变闪烁管子的变动
//{ uint t=50;
/*四个子程序分别显示个、十、百、千**********************************************************/
void display_ge(uchar ge) //后四个数码管的 显示子程序
{
duan_suo=1; //打开个位显示
P0=duan_ma[ge];
duan_suo=0;
P0=0xff;
wei_suo=1;
P0=wei_ma[7]; //数据输入数码管内
wei_suo=0;
delay(2); //延时显示2ms
}
void display_shi(uchar shi) //后四个数码管的 显示子程序
{
duan_suo=1; //打开个位显示
P0=duan_ma[shi];
duan_suo=0;
P0=0xff;
wei_suo=1;
P0=wei_ma[6]; //数据输入数码管内
wei_suo=0;
delay(2); //延时显示2ms
}
void display_bai(uchar bai) //后四个数码管的 显示子程序
{
duan_suo=1; //打开个位显示
P0=duan_ma[bai];
duan_suo=0;
P0=0xff;
wei_suo=1;
P0=wei_ma[5]; //数据输入数码管内
wei_suo=0;
delay(2); //延时显示2ms
}
void display_qian(uchar qian) //后四个数码管的 显示子程序
{
duan_suo=1; //打开个位显示
P0=duan_ma[qian];
duan_suo=0;
P0=0xff;
wei_suo=1;
P0=wei_ma[4]; //数据输入数码管内
wei_suo=0;
delay(2); //延时显示2ms
}
我按照你说的写的 但是怎么实现按下key1键个位闪烁 然后十位闪烁 我觉得我这个switch语句用的有问题 请大大帮我分析一下
一周热门 更多>