shafei 发表于 2012-2-27 21:01:00

会使用CD4021请进!!!

鄙人最近因为科研原因需要学习CD4021这个逻辑芯片,就是八位并/串入,但是串出的芯片,有一个问题我实在是想不通?
第一个问题,我可不可以认为,当P/S端口(即PIN9)置1的话,并行输入的八位数据,输入什么,那么输出端Q6,Q7,Q8就输出什么,输出跟输入同步变化,与时钟无关?
第二个问题,如果是这样,那当P/S端口从1变到0以后,如果此时时钟没有发生变化(即PIN10)不发生任何变化,Q6,Q7,Q8是不是一直保持最后并行输入的那三位数字?
第三个问题,当P/S端口置0以后,CLK先从0变到1(一个上升沿)以后,Q8的值就是前一个Q7的值,Q7的值就是前一个Q6的值,以此类推。。。可以这样理解吗?
那我可以认为,当P/S从1变为0后,依次给7个上升沿,就能从Q8口依次得到Q7,Q6,Q5,Q4,Q3,Q2,Q1,如果你同意我的说法,接着我的问题就来了,那我要读那个Q8怎么样办?是不是当P/S端口从1变到0以后,而CLK上升沿还没有到来之前就要读走Q8的值?

mcu5i51 发表于 2012-2-27 21:22:57

4021我没有用过,小学时看游戏机原理是了解过一些,这是我的入门书呀,反正看是看不懂,就是天书,后来慢慢理解了,20+年了,印象不深了,找书也不容易;只能给你提供些参考吧!
4021是把8个并行输入的信号转换为串行输出,PS置0后时钟有效,每个时钟对应一个输入端口,8个脉冲之后就读取了全部并行输入数据,在读的话就是级联的进位了,直到PS状态改变;
准不准不确定,自己试,很容易的

eblc1388 发表于 2012-2-27 21:46:21

回复【楼主位】shafei

三个问题 LS 理解都正确。

读Q8是当P/S端口从1变到0以后,而CLK上升沿还没有到来之前就要读, 不然 Q8 的电平会被 Q7 电平取代。

shafei 发表于 2012-2-28 11:08:48

回复【2楼】eblc1388
-----------------------------------------------------------------------
读Q8是当P/S端口从1变到0以后,而CLK上升沿还没有到来之前就要读, 不然 Q8 的电平会被 Q7 电平取代。

嗯,你一语中的,我就是在这个环节琢磨了一天了,我老觉得这个器件怪怪的,就怪在这个地方,现在你说了,我就基本上豁然开朗了
对了,你有驱动程序吗,发给我一份吧!!!

shafei 发表于 2012-2-28 11:14:03

回复【2楼】eblc1388
-----------------------------------------------------------------------

那我可不可以认为,我只需要给7个上升沿就可以了,在第一个上升沿之前,我要读走Q8?

eblc1388 发表于 2012-2-28 16:28:19

7个上升沿就可以了, 因为 Q8 在 P/S 端口从1变到0以后就立刻在Q8端出现, 不须使用任何移位操作。第一个CLK上升沿会把 Q7 电平移到 Q8。

我没有驱动程序。

51_jiaduoW~W 发表于 2012-8-19 18:30:20

cd4021是i2c的接口吗?

51_jiaduoW~W 发表于 2012-8-26 18:49:03

#include "config.h"
/*
*11.0592M lpc2131
*cd4021的工作方式,先给ps一个高定平,到并行模式,这样输入管脚的电平记录
*到寄存器中了就,读取msb,让后ps变低,到串行模式,这样没一个clk的上升沿移动一位
*进行一次读写,最后将剩余7位数据读出
*/

#define PS_GPIO   (PINSEL1 &= ~(3<<14))   //P0.23 IO_OUT
#define CLK_GPIO    (PINSEL1 &= ~(3<<18))   //P0.25 IO_TEST1
#define DATA_GPIO   (PINSEL2 &= ~(1<<3))    //P1.23 IO_TEST2

#define PS_OUT (IO0DIR |= (1<<23))
#define PS_SET (IO0SET |= (1<<23))
#define PS_CLR (IO0CLR |= (1<<23))

#define CLK_OUT (IO0DIR |= (1<<25))
#define CLK_SET (IO0SET |= (1<<25))
#define CLK_CLR (IO0CLR |= (1<<25))

#define DATA_IN (IO1DIR &=~(1<<23))
#define DATA_STAT (IO1PIN & (1<<23))

/*定义延时函数*/
void delay_cd4021(void)
{
    unsigned char i;
    for(i=0;i<2;i++);
}
#define NOP() delay_cd4021()

int cd4021_get(void)
{
    unsigned char return_data,i;
                //设置gpio
    PS_GPIO;   
    CLK_GPIO;
    DATA_GPIO;
   
    PS_OUT;   //设置io状态
    CLK_OUT;
    DATA_IN;
   
    CLK_CLR;
    PS_SET;   //将8位数据位并行放入寄存器中
    NOP();      //实验证明这里如果不加延时msb会丢掉的
    return_data<<=1;   
    if(DATA_STAT) return_data |=0x01;
   
    PS_CLR;   //转到串行模式,进行移位
    for(i=0;i<7;i++)
    {
      CLK_SET;
      return_data<<=1;                  
      if(DATA_STAT) return_data |= 0x01;      
      CLK_CLR;
    }
    NOP();      //最后加一定延时
    return return_data;
   
}



51_jiaduoW~W 发表于 2012-8-26 18:50:09

我的程序,=当数据是123时候读取会出错,多把msb读成1了。请问为什么?,在ps高电平时候,不等到ps变低读取不行吗?
页: [1]
查看完整版本: 会使用CD4021请进!!!