找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

74hc164级联驱动数码管位选问题

查看数: 4302 | 评论数: 10 | 收藏 3
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-5-25 10:54

正文摘要:

最近跟数码管杠上了,在垃圾堆找到了一个变频器面板发现设计很有意思  就用3个io完成了四位数码管显示,四个LED显示,还有6个按键输出。感觉挺有意思,画下了电路图,用15f104w接上接口,现在能做到把数码 ...

回复

ID:916454 发表于 2021-6-1 08:47
延时短了就显示成这样了吧
ID:930352 发表于 2021-5-31 23:50
非凡科技 发表于 2021-5-31 18:46
显示好了代码如下求高手帮助下按键怎么整  怎样读键值
#include  //包含单片机寄存器的头文件

很多年没用过164了,现在都用1628,
ID:101869 发表于 2021-5-31 18:46
显示好了代码如下求高手帮助下按键怎么整  怎样读键值
#include<STC15.H>  //包含单片机寄存器的头文件

#include<intrins.h>


#define uint unsigned int
#define uchar unsigned char   
//74ls164IO口定义
sbit CLK=P3^2;
sbit DAT=P3^3;
sbit key=P3^4;
bit  key_1=0,key_2=0;
uint num,llxs,temp, Cnt_ms;
uchar code tab[]={ 0xBB,  0x28,  0x73, 0x79, 0xE8,  0xD9,  0xDB, 0x38,  0xFB,  0xF9,0xef,0x7f,0xdf,0xef,0Xbf,0xff,0X00, };
  uchar G,S,bai,Q;
void dispbyte(uchar byte);
void delay(uint z);
void count();
void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
                for(y=0;y<100;y++);
}



void dispbyte(uchar byte)
{   
         uchar num2,i;
         num2=tab[byte];//取出段码
    for(i=0;i<8;i++)   //循环八次送至led数码管
    {
             CLK=0;               
        if(num2&0x01)  DAT=1;//判断最高位,并取出最高位
        else          DAT=0;//
   CLK=1;        //上升沿有效
        num2>>=1;     //左移一位(每次移动一位,共8次)
    }
}


void count()                                 //把每一位数字都单独存到一个变量中
{
        G =   num%10;                        
        S =   num/10%10;
        bai = num/100%10;
        Q =   num/1000%10;
       
}
void Timer0Init(void)                //4毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x60;                //设置定时初始值
        TH0 = 0xF0;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}



main()
{  
    Timer0Init();
     EA=1;                                       
     ET0=1;
    num=0;
    Cnt_ms=0;

        while(1)
        {
   
      
         
          count();
        keysm();
      }

   
}



/******定时器0中断服务程序******/
void timer0() interrupt 1        
{
        
        Cnt_ms++;                              
        llxs++;                              
        if(Cnt_ms>=250)               
        {     Cnt_ms=0;}
        if(llxs>4)                        
        {llxs=0;}
                switch(llxs)
                {
                        case 0:
                        
                            dispbyte(10);
                       
                         dispbyte(G);
                         
                        
                         break;
                       case 1:  
                                    dispbyte(12);
                                 dispbyte(S);
          
                                 break;
                        case 2:
                                dispbyte(11);
  
                                    dispbyte(bai);
                                break;
                        case 3:
                                 dispbyte(14);
   
                                     dispbyte(Q);
                                break;

                }
      
        }

ID:902592 发表于 2021-5-30 18:24
消影一般delay 200ms 就可以了
ID:101869 发表于 2021-5-29 21:11
目前能显示了  就是消影做不出来
ID:824490 发表于 2021-5-25 17:51
我见过用一片4017做按键的,单线驱动,用在车载通讯机的手咪上。
ID:844772 发表于 2021-5-25 15:44
位选也是通过另一块164来选的啊,函数都一样,编码和管脚要再定义,每次只要选中一个而已,你这是共阴的管子,别编错了,就按动态扫描的方式显示。其实51上好多IO,干脆找四个直接位选算了。
ID:101869 发表于 2021-5-25 15:15
就是位选不知道怎么整  
ID:902592 发表于 2021-5-25 13:56
这种数码管一般是共阴或共阳的,控制共阴或共阳就可以实现位选


ID:332444 发表于 2021-5-25 13:28
送段值后送位值了?

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表