单片机新手 急切盼望高手们的指点!!!

2019-07-16 02:10发布

电路原理图:段锁存器和位锁存器都接单片机的P0口。


[img]file:///C:/Users/peng/AppData/Roaming/Tencent/Users/765030626/QQ/WinTemp/RichOle/V03YAF][J2VW()CW_1]Q@OU.jpg[/img]


V03YAF][J2VW()CW_1]Q@OU.jpg 我现在要实现的功能是让四只数码管显示四个数字,同时定义三个按键k1,k2,k3,按下k1使得四位数字的最低位闪烁,再按k1使得十位数字闪烁,这样一次类推,当按下k2时闪烁位加1,按下k3时闪烁位减1,请各位高手指点一下小弟!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
xiaweiquan
1楼-- · 2019-07-16 05:43
可以做个循环的嵌套 让其一级一级的向内嵌 就可以实现。或者用swtich语句,循环判断
zjp010
2楼-- · 2019-07-16 09:23
xiaweiquan 发表于 2013-3-10 22:11
可以做个循环的嵌套 让其一级一级的向内嵌 就可以实现。或者用swtich语句,循环判断 ...

#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
}

zjp010
3楼-- · 2019-07-16 12:53
zjp010 发表于 2013-3-11 12:34
#include
#include
#define uint  unsigned int     

我按照你说的写的        但是怎么实现按下key1键个位闪烁  然后十位闪烁  我觉得我这个switch语句用的有问题  请大大帮我分析一下
xiaweiquan
4楼-- · 2019-07-16 14:20
加我 QQ  369263945

一周热门 更多>