2767|9

99

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

各位帮帮忙....问个关于数码管显示的... [复制链接]

要实现让数码管逐位点亮...比如加电时显示六个8...
当检测过一个简易按键按下时,则只点亮一位,并显示为0.当第二次按下时,多点亮一位.显示为01....依次类推下去,,这种要怎么实现呀?
uchar ledbuf[7]={0xfc,0xfa,0xf6,0xee,0xde,0xbe,0xff};
uchar led[11]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0xff};
这个是显示函数
void display(uchar w1,w2,w3,w4,w5,w6,d1,d2,d3,d4,d5,d6)
w1..w5为字位,d1..d5为字型
{
   P2=ledbuf[w1];      
   P0=led[d1];         
   delay();  
   P2=ledbuf[w2];      
   P0=led[d2];        
   delay();
   P2=ledbuf[w3];            
   P0=led[d3];         
   delay();
   P2=ledbuf[w4];           
   P0=led[d4];         
   delay();
   P2=ledbuf[w5];            
   P0=led[d5];         
   delay();
   P2=ledbuf[w6];            
   P0=led[d6];         
   delay();                     
}
那么要让它只点亮一位时这样调用就可以了
while(count==1)//count表示第几次按下按键
{
display(0,6,6,6,6,6,d,d,d,d,d,d);//d1=1;
d1=d;
getkey();//调用键盘扫描
}
while(count==2)
{
display(0,1,6,6,6,6,d1,d,d,d,d,d);//d1=1,d=2(按下2)
d1=d;
getkey();//调用键盘扫描
}

可是我的程序不能正常显示,当第一次按下(1)时,count=1,d=1...它会点亮所有的灯,并保持这个状态..显示为111111 我要的是只显示一位 1
补充一点,在没的第二次按下键盘时,也就是count一直为1,这个循环它会一直执行,也就是说这个条件是一直成立的..就是不懂怎么回事,不能正常显示(只显示一位1)...各位帮帮忙..愁死人了.搞了快一个星期了还没搞好~~

最新回复

楼上的...这程序的扫描部分...keyscan()函数..就是这书上的啊,. 就是不明白               while(count==1)             {               display(0,6,6,6,6,6,d,d,d,d,d,d); //这里为什么不能正常显示!!!!               d1=d;                                             getkey();             }  详情 回复 发表于 2007-7-13 14:52
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么都没人啊
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关于LED的动态显示...

LZ可以找一下以前的贴子,好像我在那有相对清楚的解释.

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
-_-....
楼上的大哥,可不可以就事论事啊...
动态显示的我知道要怎么做...关键是这边不能正常显示啊...
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
我没说你不会动太显示

我觉得你的这个显示封装得不好,几乎没法通用,呵呵

而我也没看出不能正常显示的原因...

所以......
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
搂主,你的那个d是指按下的次数吗,第一次按下是不是应该调用led数组的索引为0的元素,而不是1呢,数组是从0开始索引的阿
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
#include
#include
#include        
#include
#define uchar unsigned char
#define uint unsigned int


uchar ledbuf[7]={0xfc,0xfa,0xf6,0xee,0xde,0xbe,0xff};
uchar led[11]={0x28,0x7E,0xA2,0x62,0x74,0x61,0x21,0x7A,0x20,0x60,0xff};
uchar wordbuf[6];                      //字型码缓冲区
uchar tlcount;
uint  count;                           //密码位计数
uchar pw[6];                           //初始密码存储区
uchar pwbuf[6];                        //输入密码存储区
uchar key;
uchar d,d1,d2,d3,d4,d5,d6;
bit pwflag;                                                   //密码正确与否标志
bit enterflag;                         //确认键按下与否标志
bit showflag;                          //数码管显示与否标志
sbit green=P3^0;
sbit red=P3^1;
void display(uchar w1,w2,w3,w4,w5,w6,d1,d2,d3,d4,d5,d6);                                   // 显示函数

/*去键盘抖动函数*/
void delay(void)
{
        uchar i,j;
        for(i=0;i<100;i++)
        for(j=0;j<6;j++)
                ;
}


/*键盘扫描函数 P1口的分布方式为 7,6,5,4,(列,高位分别为1,2,3,4列 )3,2,1,0(行,低位,分别为 1,2,3,4 行)*/

uchar keyscan(void)
{
   uchar scancode,tmpcode;
   P1=0xf0;
   if((P1&0xf0)!=0xf0)                 //将行全部置为0,再判断列是否全为1,若不是,则说明该列有键按下
   {
      delay();                         //延时去抖动
          if((P1&0xf0)!=0xf0)              //延时后再判断一次,去除抖动影响
          {
             scancode=0xfe;                //将列全部置为1,逐行扫描第一行为0其余三行为1,若此时列上有不为1的值.
                 while((scancode&0x10)!=0)     //则表示该行上有键按下,对应前面的行和列值得到键盘值
                 {
                    P1=scancode;               //输出扫描码
                      if((P1&0xf0)!=0xf0)         //本行有键按下
                    {
                           tmpcode=(P1&0xf0)|0x0f;
                           return((~scancode)+(~tmpcode));
                        }
                        else scancode=(scancode<<1)|0x01;    //左移一位,与上0x01为保证只有一位为0
                 }
          }
   }
   return(0);                         //没有键被按下
}


/*显示函数*/

void display(uchar w1,w2,w3,w4,w5,w6,d1,d2,d3,d4,d5,d6)
{
   P2=ledbuf[w1];             //字位
   P0=led[d1];        //送字型码  
   delay();  
   P2=ledbuf[w2];             //字位
   P0=led[d2];        //送字型码  
   delay();
   P2=ledbuf[w3];             //字位
   P0=led[d3];        //送字型码  
   delay();
   P2=ledbuf[w4];             //字位
   P0=led[d4];        //送字型码  
   delay();
   P2=ledbuf[w5];             //字位
   P0=led[d5];        //送字型码  
   delay();
   P2=ledbuf[w6];             //字位
   P0=led[d6];        //送字型码  
   delay();                     
}

/*密码对比*/

bit pwcmp(void)
{
   bit flag;
   uchar i;
   for(i=0;i<6;i++)
   {
      if(pw==pwbuf)
             flag=1;
          else
          {
         flag=0;
                 break;
      }
   }
   return(flag);                          //返回对比标志
}

void getkey(void)
{
      uchar j;
      key=keyscan();                   //调用键盘扫描函数
          switch(key)
          {
             case 0x88:                   //1行1列 1
                    if(count<6)
                         {
                            wordbuf[count]=1;   //对应密码位上显示1
                                pwbuf[count]=1;       //输入的为1
                                d=pwbuf[count];
                                count++;
                         }
                         break;
             case 0x48:                    //1行2列 2
                    if(count<6)
                         {
                            wordbuf[count]=2;   //对应密码位上显示F
                                pwbuf[count]=2;   
                                d=pwbuf[count];
                                count++;
                         }                               
                         break;
             case 0x28:                    //1行3列 3
                    if(count<6)
                         {
                            wordbuf[count]=3;   //对应密码位上显示F
                                pwbuf[count]=3;   
                                d=pwbuf[count];
                                count++;
                         }
                         break;
             /*case 0x18:                    //1行4列 A
                    if(count<6)
                         {
                            wordbuf[count]=0x30;   //对应密码位上显示A,输入的当作为3
                                pwbuf[count]=3;   
                                count++;
                         }
                         break;*/
             case 0x84:                    //2行1列 4
                    if(count<6)
                         {
                            wordbuf[count]=4;   //对应密码位上显示4
                                pwbuf[count]=4;  
                                d=pwbuf[count];
                                count++;
                         }
                         break;
             case 0x44:                    //2行2列 5
                    if(count<6)
                         {
                            wordbuf[count]=5;   //对应密码位上显示F
                                pwbuf[count]=5;   
                                d=pwbuf[count];
                                count++;
                         }
                         break;
             case 0x24:                    //2行3列 6
                    if(count<6)
                         {
                            wordbuf[count]=6;   //对应密码位上显示F
                                pwbuf[count]=6;   
                                d=pwbuf[count];
                                count++;
                         }
                         break;
            /* case 0x14:                    //2行4列 B
                    if(count<6)
                         {
                            wordbuf[count]=8;   //显示8
                                pwbuf[count]=8;      
                                count++;
                         }
                         break;*/
             case 0x82:                    //3行1列 7
                    if(count<6)
                         {
                            wordbuf[count]=7;   //对应密码位上显示F
                                pwbuf[count]=7;  
                                d=pwbuf[count];   
                                count++;
                         }
                         break;
             case 0x42:                    //3行2列 8
                    if(count<6)
                         {
                            wordbuf[count]=8;   
                                pwbuf[count]=8;  
                                d=pwbuf[count];
                                count++;
                         }
                         break;
             case 0x22:                    //3行3列 9
                    if(count<6)
                         {
                            wordbuf[count]=9;   
                                pwbuf[count]=9;  
                                d=pwbuf[count];
                                count++;
                         }
                         break;
            /* case 0x12:                    //3行4列 显赫为c
            if(count<6)
                    {
                            wordbuf[count]=12;   
                                pwbuf[count]=12;     
                                count++;                          
                        }
                        break;*/
                 case 0x41:                  //4行2列  0
                    if(count<6)
                        {
                            wordbuf[count]=0;   
                                pwbuf[count]=0;
                                d=pwbuf[count];
                                count++;                                     
                        }
                        break;
                 /*case 0x11:                  //4行4列  D
                    if(count<6)
                        {
                            wordbuf[count]=0;   
                                pwbuf[count]=0;     
                                count++;                                     
                        }
                        break;*/
             case 0x21:                    //4行3列 取消(#)
             count=0;
                         for(j=0;j<6;j++)
                         {
                            wordbuf[j]=8;          //数码管显示888888
                                pwbuf[j]=0x0f;         //用FFFFFF清除已经输入的密码
                         }
                         break;
                 case 0x81:                    //*号作为确认键
                     enterflag=1;
                    if(count==6)
                 pwflag=pwcmp();
             else
                             pwflag=0;                         
                         break;                    
                 default:  break;   
          }//switch
}


/*主程序*/
void main()
{
   uchar j;
   count=0;                            //初始没有输入密码.计数器设为0
   enterflag=0;                       //没有按下确认键
   pwflag=0;                           //密码正确与否标志为0
   green=1;
   red=1;                              //红绿灯不亮

   /*假定内定密码为851219*/
   pw[0]=8;
   pw[1]=5;
   pw[2]=1;
   pw[3]=2;
   pw[4]=1;
   pw[5]=9;

   showflag=1;                         //打开数码管显示
   //刚加电时显示888888
   
   while(1)
   {  
      getkey();
          if(count==0)
            display(0,1,2,3,4,5,8,8,8,8,8,8);
          while(count!=0)
          {
              while(count==1)
            {
              display(0,6,6,6,6,6,d,d,d,d,d,d);
              d1=d;
                   getkey();
            }
            while(count==2)
            {
              display(0,1,6,6,6,6,d1,d,d,d,d,d);
                  d2=d;
                  getkey();
            }
            while(count==3)
            {
                  display(0,1,2,6,6,6,d1,d2,d,d,d,d);
          d3=d;
                  getkey();
            }
            while(count==4)
            {
          display(0,1,2,3,6,6,d1,d2,d3,d,d,d);
                  d4=d;
                  getkey();
            }
            while(count==5)
            {  
          display(0,1,2,3,4,6,d1,d2,d3,d4,d,d);
                  d5=d;
                  getkey();
            }
            while(count==6)
            {
          display(0,1,2,3,4,5,d1,d2,d3,d4,d5,d);
                  d6=d;
                  getkey();
            }
          }
          if(enterflag==1)                 //如果按下确认键
          {
             enterflag=0;                  //清除标志
                 count=0;                      //清除密码计数位
                 /*用FFFFFF清除已经输入的密码*/
                 for(j=0;j<6;j++)
                    pwbuf[j]=0x0f;
                 showflag=0;                   //关闭数码管显示
                 TR1=1;                        //开始计数
                 tlcount=0;                    //定时器1由50ms累积到1s所用的计数器
                 if(pwflag==1)               
                   green=0;                    //密码正确,亮绿灯
                 else
                   red=0;
          }
   }  //while
}     //main
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
d 表示按键按下时的按键值....它的值就是数组的下标从0..9
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
显示程序做的不好啊
这类程序在书上能找到现成的
给你推荐一本书 《51单片机C语言应用程序设计实例精讲》 电子工业出版社 戴佳 戴卫恒 编著
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼上的...这程序的扫描部分...keyscan()函数..就是这书上的啊,.
就是不明白
              while(count==1)
            {
              display(0,6,6,6,6,6,d,d,d,d,d,d); //这里为什么不能正常显示!!!!
              d1=d;                              
              getkey();
            }
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表