找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4117|回复: 11
收起左侧

最近在弄HEF4094的单片机驱动,可是总有点问题,求大神指点啊!

[复制链接]
ID:410399 发表于 2018-10-22 11:35 | 显示全部楼层 |阅读模式
下面代码是4094的输入,不知道哪里出了问题,输入和输出的不太一样,求指点啊!!!

void datain3(unsigned char dat16_09)
{
        unsigned char j;
        unsigned char i,tt;
        CLK4094 = 1;
        ST_4094_3  = 1;
        
        tt = dat16_09;        
        for(i = 0;i<9;i++)
        {
                j =  tt &(0x01);
                if(j == 1)
                {         DIN_4094_3 = 0;        }
                else
                {         DIN_4094_3 = 1;        }

                CLK4094 = 1;                    
                delay_us(20);
                CLK4094 = 0;        
                delay_us(20);         

                tt = tt>>1;
        }

        ST_4094_3   =  1;        
        delay_us(20);
        ST_4094_3   =  0;
        delay_us(20);

        CLK4094  =  1;  
//        ST_4094_3   =  1;
//        DIN_4094_3  =  1;
}


回复

使用道具 举报

ID:94031 发表于 2018-10-22 15:46 | 显示全部楼层
由于4094移位是先送高位再送低位所以你要把这两句修改一下:
j =  tt &(0x01);   改为   j =  tt & 0x80;
tt = tt>>1;        改为   tt = tt<<1;
回复

使用道具 举报

ID:410399 发表于 2018-10-23 08:31 | 显示全部楼层
xuyaqi 发表于 2018-10-22 15:46
由于4094移位是先送高位再送低位所以你要把这两句修改一下:
j =  tt &(0x01);   改为   j =  tt & 0x80; ...

改了之后变成全部灯都亮了
回复

使用道具 举报

ID:94031 发表于 2018-10-23 13:27 | 显示全部楼层
mosqu 发表于 2018-10-23 08:31
改了之后变成全部灯都亮了

你的tt是什么值呢?
回复

使用道具 举报

ID:410399 发表于 2018-10-23 14:54 | 显示全部楼层
xuyaqi 发表于 2018-10-23 13:27
你的tt是什么值呢?

16进制的值,
回复

使用道具 举报

ID:94031 发表于 2018-10-23 15:12 | 显示全部楼层
你把程序打包出来
回复

使用道具 举报

ID:410399 发表于 2018-10-23 16:06 | 显示全部楼层
xuyaqi 发表于 2018-10-23 15:12
你把程序打包出来

#include <STC15W.h>
#include <intrins.h>

sbit DIN_4094_1 = P6^5;                //data
sbit ST_4094_1 = P6^7;                //str

sbit CLK_4094 = P4^3;                //SLK

unsigned char code zheng[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
unsigned char code fan[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

void TransByteTo4094_ElecExpValve1(unsigned char dat16_09);

void delay_us(unsigned char i)
{
        unsigned char j;
        for(i; i>0;i--)
                for(j = 200;j>0;j--);
}
void delay(unsigned int o)
{
        while(--o);

}


void main()
{
        unsigned char n,k;
        unsigned char m;
        unsigned int time = 0;
        while(1)
        {
                for(time = 0; time < 50;time++)
                {
                        for(k = 0;k < 8; k++)
                        {
                                m = zheng[k];
                                TransByteTo4094_ElecExpValve1(m);
                                delay(500);
                               
                        }
                }
                for(time = 0; time < 50;time++)
                {
                        for(n = 0;n < 8; n++)
                        {
                                m = fan[n];
                                TransByteTo4094_ElecExpValve1(m);
                                delay(500);
                        }
                }

        }

}

void TransByteTo4094_ElecExpValve1(unsigned char dat16_09)
{
        unsigned char j;
        unsigned char i,tt;
        CLK_4094 = 1;
        ST_4094_1  = 1;
       
        tt = dat16_09;         
        for(i = 0;i<8;i++)
        {
                j =  tt &(0x01);
                if(j == 1)
                {         DIN_4094_1 = 0;        }
                else
                {         DIN_4094_1 = 1;        }

                CLK_4094 = 1;                        
                delay_us(10);
                CLK_4094 = 0;        
                delay_us(10);         

                tt = tt>>1;
        }

        ST_4094_1   =  1;        
        delay_us(10);
        ST_4094_1   =  0;
        delay_us(10);

        CLK_4094  =  1;   
        ST_4094_1   =  1;
        DIN_4094_1  =  1;
}

回复

使用道具 举报

ID:410399 发表于 2018-10-23 16:57 | 显示全部楼层
xuyaqi 发表于 2018-10-23 15:12
你把程序打包出来
  1. #include <STC15W.h>
  2. #include <intrins.h>

  3. sbit DIN_4094_1 = P6^5;                //data
  4. sbit ST_4094_1 = P6^7;                //str

  5. sbit CLK_4094 = P4^3;                //SLK

  6. unsigned char code zheng[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};   //逆时钟旋转相序表
  7. unsigned char code fan[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};    //正时钟旋转相序表

  8. void TransByteTo4094_ElecExpValve1(unsigned char dat16_09);

  9. void delay_us(unsigned char i)
  10. {
  11.         unsigned char j;
  12.         for(i; i>0;i--)
  13.                 for(j = 200;j>0;j--);
  14. }
  15. void delay(unsigned int o)
  16. {
  17.         while(--o);

  18. }


  19. void main()
  20. {
  21.         unsigned char n,k;
  22.         unsigned char m;
  23.         unsigned int time = 0;
  24.         while(1)
  25.         {
  26.                 for(time = 0; time < 50;time++)
  27.                 {
  28.                         for(k = 0;k < 8; k++)
  29.                         {
  30.                                 m = zheng[k];
  31.                                 TransByteTo4094_ElecExpValve1(m);
  32.                                 delay(500);
  33.                                
  34.                         }
  35.                 }
  36.                 for(time = 0; time < 50;time++)
  37.                 {
  38.                         for(n = 0;n < 8; n++)
  39.                         {
  40.                                 m = fan[n];
  41.                                 TransByteTo4094_ElecExpValve1(m);
  42.                                 delay(500);
  43.                         }
  44.                 }

  45.         }

  46. }

  47. void TransByteTo4094_ElecExpValve1(unsigned char dat16_09)
  48. {
  49.         unsigned char j;
  50.         unsigned char i,tt;
  51.         CLK_4094 = 1;
  52.         ST_4094_1  = 1;
  53.        
  54.         tt = dat16_09;         
  55.         for(i = 0;i<8;i++)
  56.         {
  57.                 j =  tt &(0x01);
  58.                 if(j == 1)
  59.                 {         DIN_4094_1 = 0;        }
  60.                 else
  61.                 {         DIN_4094_1 = 1;        }

  62.                 CLK_4094 = 1;                        
  63.                 delay_us(10);
  64.                 CLK_4094 = 0;        
  65.                 delay_us(10);         

  66.                 tt = tt>>1;
  67.         }

  68.         ST_4094_1   =  1;        
  69.         delay_us(10);
  70.         ST_4094_1   =  0;
  71.         delay_us(10);

  72.         CLK_4094  =  1;   
  73.         ST_4094_1   =  1;
  74.         DIN_4094_1  =  1;
  75. }

复制代码
回复

使用道具 举报

ID:111634 发表于 2018-10-23 21:55 | 显示全部楼层
本帖最后由 zl2168 于 2018-10-24 09:01 编辑

实例43  CC4094串入并出控制8/16循环灯
Proteus仿真一下,确认有效。
实例43 CC4094串行输出控制8-16循环灯.rar (67.45 KB, 下载次数: 30)
回复

使用道具 举报

ID:94031 发表于 2018-10-24 09:15 | 显示全部楼层

要有硬件连接图以及说明具体碰到什么问题?
回复

使用道具 举报

ID:410399 发表于 2018-10-24 10:12 | 显示全部楼层
xuyaqi 发表于 2018-10-24 09:15
要有硬件连接图以及说明具体碰到什么问题?

已经解决了,谢谢大神指点
回复

使用道具 举报

ID:286963 发表于 2018-10-24 10:12 | 显示全部楼层
j =  tt &(0x01);   tt = tt>>1;    这里修改一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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