搜索
bottom↓
回复: 8

会使用CD4021请进!!!

[复制链接]

出0入0汤圆

发表于 2012-2-27 21:01:00 | 显示全部楼层 |阅读模式
鄙人最近因为科研原因需要学习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的值?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

出0入0汤圆

发表于 2012-2-27 21:46:21 | 显示全部楼层
回复【楼主位】shafei  

三个问题 LS 理解都正确。

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

出0入0汤圆

 楼主| 发表于 2012-2-28 11:08:48 | 显示全部楼层
回复【2楼】eblc1388
-----------------------------------------------------------------------
读Q8是当P/S端口从1变到0以后,而CLK上升沿还没有到来之前就要读, 不然 Q8 的电平会被 Q7 电平取代。

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

出0入0汤圆

 楼主| 发表于 2012-2-28 11:14:03 | 显示全部楼层
回复【2楼】eblc1388
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-2-28 16:28:19 | 显示全部楼层
7个上升沿就可以了, 因为 Q8 在 P/S 端口从1变到0以后就立刻在Q8端出现, 不须使用任何移位操作。第一个CLK上升沿会把 Q7 电平移到 Q8。

我没有驱动程序。

出0入0汤圆

发表于 2012-8-19 18:30:20 | 显示全部楼层
cd4021是i2c的接口吗?

出0入0汤圆

发表于 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;
   
}



出0入0汤圆

发表于 2012-8-26 18:50:09 | 显示全部楼层
我的程序,=当数据是123时候读取会出错,多把msb读成1了。请问为什么?,在ps高电平时候,不等到ps变低读取不行吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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