网站导航: 首页 > 设计参考 > 正文 文章搜索
74HC164应用实例:驱动数码管两例(电路图和源程序)
 
文章编号:
100816210758
文章分类: 电路 电子元件
点 击:
...
关 键 词: 74HC164
文章来源:
百合电子工作室收集整理
摘 要:
74HC164应用实例:驱动数码管的两个实例分别提供了汇编源程序和C源程序...

实例1

  74HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品中,下面浅谈使用方法:

1. 首先先了解他的引脚功能和逻辑图,如下图:


图1  引脚名称和用途


 

图2 真值表

通过真值表我们可以了解到,A,B两个输入端是互锁的,CLK上升沿时数据移入移位寄存器中,CLEAR为清零用的,接低电平时所有端口都输出低电平,了解了真值表之后开始运用了,先给出如下原理图:

 


图3 原理图

图中,采用义隆的EM78P153作为控制芯片,P50作为CLK时钟信号,注意平时数据不传输时,时钟信号是不发送的应一直保持低电平或者高电平,数据需要传输的时候才输出时钟信号^_^ ,继续P51作为移位数据输出端,接到74HC164的B端,A端接高电平,当然也可以AB端短路,然后连接到DATA移位数据端,P52作为数码管的选通信号(也可以叫消隐^_^), 作用是使数据传输过程暂时关闭显示,以免显示出不需要的数据,原因是应为164不带锁存功能,数据传输过程是一位一位的向高位移位输出的,所以要等数据全部移入后才打开始点亮数码管.

注意了哦,通过查看164的规格书发现,164输出高电平电流比输出低电平电流要小,亦称灌电流大,扇出电流弱,所以适合选用共阳数码管,如图,本人偷懒没有画出那个数码管的8字

该介绍的介绍的差不多了,废话少说,该开始干活了,任务是:  显示0-9 每秒+1 ,到9后又返回0,一直循环显示,根据任务得到如下流程图:

1.  显示部分:

将需要显示的数值送入A ==> 查表求得显示段码==>将段码逐位移入164==>8位移完后点亮数码管==>延时==>返回第一步执行

2. 中断部分: 

  进入中断==>保存现场(以备调查取证,送你入狱^_^)==>重置TCC==>够1秒钟将需要显示的数据+1,并重置,不够就退出;

根据以上要求就开始写代码调试了,要注意一点,数据移位时一定要记得高位在前哦,否则显示错误别怪我没有说清楚,我当年实验时就因为这个数据移位方向反了排查了半天,甚至以为是时钟频率不对,又以为时许不对.....搞了半天,NND后来重看DATASHEET才发现,原来是低级错误啊,呜呼哀哉.......,希望你不要重蹈我覆辙,哎哟!! 谁! 谁! 谁扔砖头上来?  啥? 你扔的? 我废话太多.........,那俺少来两句,继续上菜, 咦好像没啥可说的了,上源程序吧

 
  1. ;中断部分:  
  2.   
  3. ;;;;;;;;;;中断;;;;;;;;  
  4. INTPUT:   
  5.  MOV TEMPA, A;  
  6.  MOV  A,@130;  
  7.   MOV TCC,A;255-130=125  
  8.   CLR RF;  
  9.   ;;;;;此处填写250Us处理程序  
  10.   BS WKREG,T500US   
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;  
  12.   DJZ R1MS   
  13.   JMP INTEXT;  
  14.    MOV A,@4   
  15.   MOV R1MS,A;重置  
  16.   BS WKREG,T1MS   
  17.   ;;;;;;;此处填写1ms处理程序  
  18.      
  19.  ;;;;;;;;;;;;;;;;;;;;;;;;;;  
  20.   DJZ R20MS   
  21.   JMP INTEXT;  
  22.    MOV A,@20   
  23.    MOV R20MS,A;重置  
  24.   ;;;此处填写1秒处理程序  
  25.  BS WKREG,T20MS   
  26.  ;;;;;;;;;;;;;;  
  27.   DJZ R1S  
  28.   JMP INTEXT;  
  29.   MOV A,@50   
  30.   MOV R1S,A;  
  31.   ;;;;;;;;;  
  32.   INC NUMBER   
  33.   MOV A,NUMBER   
  34.   SUB A,@10   
  35.   JBS SR,2   
  36.   JMP INTEXT   
  37.   MOV A,@0   
  38.   MOV NUMBER,A  
  39.   
  40.      
  41.  INTEXT:   
  42.   MOV A,TEMPA;  
  43.   RETI;;;;;;;;;;;;;;;;;;;;;  
  44.   
  45.     
  46.   
  47.     
  48.   
  49. ;显示部分:  
  50.   
  51. ;==============TXDATA==============  
  52. TXDATA:   
  53.  BS P5,CC1   
  54.  MOV A,@8   
  55.  MOV DATALOP,A;  
  56. TXLOP:    
  57.  BC WKREG,T500US   
  58.  BS P5,CLK;clk=高  
  59.  NOP;  
  60.  NOP  
  61.  JBS DATA_BUF,7   
  62.  JMP $+3   
  63.  BS P5,DATA;  
  64.  JMP $+2   
  65.  BC P5,DATA  
  66. DD1MS:  JBS WKREG,T500US   
  67.  JMP $-1   
  68.  BC P5,CLK   
  69.  BC WKREG,T500US   
  70.  JBS WKREG,T500US   
  71.  JMP $-1;  
  72.  RLC DATA_BUF   
  73.  DJZ DATALOP   
  74.  JMP TXLOP   
  75.  ;;;;;;;;;;  
  76.  BC WKREG,T500US   
  77.  BS P5,CLK;clk=高  
  78.  BC WKREG,T500US   
  79.  JBS WKREG,T500US   
  80.  JMP $-1;  
  81.  BC P5,CLK    
  82.  ;;;;;;;;  
  83.  BC P5,CC1   
  84.     
  85.  RET;;;;;;;  
  86.   
  87. ;数据查表  
  88. ;===============DSPTBL============  
  89. DSPTBL: ADD PC,A  
  90.  RETL @0B01000000;0  
  91.  RETL @0B01111001;1  
  92.  RETL @0B00100100;2  
  93.  RETL @0B00110000;3  
  94.  RETL @0B00011001;4  
  95.  RETL @0B00010010;5  
  96.  RETL @0B00000010;6  
  97.  RETL @0B01111000;7  
  98.  RETL @0B00000000;8  
  99.  RETL @0B00010000;9  
  100.     
  101.   
  102. ;循环体部分;  
  103.   
  104. ;;;;;;;;;;主程序;;;;;;;;;;;   
  105. MLOOP:    
  106.  MOV A,NUMBER   
  107.  CALL DSPTBL   
  108.  MOV DATA_BUF,A  
  109.  CALL TXDATA   
  110.  BC WKREG,T1MS   
  111.  JBS WKREG,T1MS   
  112.  JMP $-1   
  113.  NOP;  
  114.            
  115. JMP MLOOP;;;;;;;;;;;;;;;;;;;;  

实例2

  在实际应用中驱动数码管常用的方式分动态扫描和静态驱动。动态扫描方式需要x+y个IO(x*y个数码管的情况,一般x=8,y=位数)这种方法很浪费MPU的IO端口对于2051等20脚的芯片就很难实现。静态显示驱动法,即是指每一个LED灯分别对应一个独立的IO驱动口,这种方法适用较少LED的驱动,不适合数码管驱动。

 

     还有一种利用74HC164来驱动的方法。74HC164是比较典型的移位寄存器,该移位寄存器有一个数据输入端口、一个时钟信号端口和八个输出端口。这种方法只需要2个MPU 的IO端口,而且在锁存器件这2个端口还可以干别的事情。

    74HC164驱动共阴、共阳数码管都很方便。

驱动要点:

  1、上升沿写入串行数据:

    CLK=0; 

     DAT=num&0x01;

     CLK=1;

  2、写入数据的数码管编码(指代码中的 tab[])

     串行数据是FIFO先进先出,也就是先写高位,移位放入。

 

    电路如图:

成功C <wbr>DIY <wbr>单片机(6)74HC164串行驱动数码管成功C <wbr>DIY <wbr>单片机(6)74HC164串行驱动数码管

3、 程序源代码:

 
  1. //共阴数码管74HC164串行驱动   
  2.   
  3. #include<AT892051.H>   
  4.   
  5. #define uint unsigned int   
  6.   
  7. #define uchar unsigned char   
  8.   
  9. sbit DAT=P3^7; //模拟串口数据发送端   
  10.   
  11. sbit CLK=P3^4;//模拟时钟控制端   
  12.   
  13.     
  14.   
  15. uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};//0-9,-,全灭   
  16.   
  17.     
  18.   
  19. void sendbyte(uchar byte)   
  20.   
  21. {      
  22.   
  23.         uchar num,c;   
  24.   
  25.         num=tab[byte];   
  26.   
  27.   for(c=0;c<8;c++)   
  28.   
  29.         {   
  30.   
  31.     CLK=0;   
  32.   
  33.   DAT=num&0x01;   
  34.   
  35.   CLK=1;   
  36.   
  37.         num>>=1;   
  38.   
  39.           
  40.   
  41.           
  42.   
  43.         }   
  44.   
  45.     
  46.   
  47. }   
  48.   
  49.     
  50.   
  51.     
  52.   
  53. void delay_50ms(unsigned int t)   
  54.   
  55. {   
  56.   
  57. unsigned int j;    
  58.   
  59. for(;t>0;t--)   
  60.   
  61.   for(j=6245;j>0;j--)   
  62.   
  63. {;}   
  64.   
  65. }   
  66.   
  67.     
  68.   
  69. main()   
  70.   
  71. {   
  72.   
  73.     
  74.   
  75.     
  76.   
  77. unsigned char h;   
  78.   
  79.   while(1){   
  80.   
  81.   for(h=0;h<10;h++){   
  82.   
  83.       delay_50ms(1);   
  84.   
  85.       sendbyte(h);   
  86.   
  87.            
  88.   
  89.     
  90.   
  91.   delay_50ms(4);   
  92.   
  93.   }   
  94.   
  95.   h=0;   
  96.   
  97.     }   
  98.   
  99.       
  100.   
  101. }   

 

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4