云南变频器销售维修网 云南网检电子标识 返回首页
云南昆明富驱软起动器
中文首页 产品展示 解决方案 技术交流 二手设备 加盟经销 人才招聘 资质证书 联系我们
 
  当前位置:信息发布 >> 浏览详细信息
嵌入式应用中级联控制扩展输入输出端口方法简述
作者:兆富科技

 
    在嵌入式设计的各种应用中,由于需要扩展大量的输入输出端口,为了节省宝贵的CPU输入输出端口,采用带所存的移位寄存器(传入并出、并入串出)基本是唯一可行的选择。当然如果采用矩阵方式的动态扫描也是可以的,但是对CPU的速度要求很高,同时如果要扩展的IO数量巨大,将直接导致CPU扫描压力增大,严重的将出现延迟甚至根本不能满足要求,特别对于LED屏这种大点阵的设计,扫描速度更是要求很高,为了达到显示不闪烁、亮度高、响应快、节省CPU资源等要求,我们一般采用如下设计,采用74HC165,74HC595等移位寄存器进行级联控制。

/* main.c 代码:********************************/

#include
#include "spi.h"
/*----------------主程序---------------------*/
void main(void)

{
    uc i;
    pwm(1);
    InitLcd();
    Show(0,0,DAT1);
    Show(1,0,DAT2);
    while(1)

    {
        for(i=0;i<255;i++){Show_num(1,13,i);s(2);}
        HC595(2,0);
    }
}

/* spi.c 代码:********************************/

#include
#define H(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit))
#define L(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit))
#define uc unsigned char
#define ui unsigned int
/*-------------------延时子程序----------------------*/
void us(ui us){while(--us*1141);}
void ms(ui ms){while(--ms+1)us(1000);}
void s (ui s) {while(--s+1)ms(1000);}
/*------------------74HC595--------------------------*/
void SPI_Init(void)

{ //SPI初始化 
    DDRB|=(1<<7)|(1<<5)|(1<<4); //设置SCK,MOSI为输出,其他为输入 
    SPCR|=(1<

}

void SPI_DS(ui Data)

{//SPI数据传输
    SPDR=Data; //数据放入SPI寄存器中 
    while(!(SPSR&(1<

}

void HC595(ui Dat0,ui Dat1)

{ //74HC595数据输出
    SPI_Init(); //SPI初始化 
    PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变 
    SPI_DS(Dat1); //传输数据 
    SPI_DS(Dat0);
    PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
}

/*-------------------1602液晶-----------------------*/
void w_com(uint8_t c)

{//写指令子程序
    HC595(0x80,c);
    ms(1);
    HC595(0,0);
}


void w_dat(uc c)

{//写数据子程序
    HC595(0xA0,c);
    ms(2);
    HC595(0x20,0);
}

void Show_h(uc hang,uc lie)

{//hang:显示于液晶屏的行,0~1;lie:显示于液晶屏的列
    hang=hang*0x10;
    if(hang>=0x10){hang=hang+0xb0;}
    else{hang=hang+0x80;}
    hang=hang+lie;
    w_com(hang);
}

void Show(uc hang,uc lie,uc *ptr)

{//显示字符串:hang=行,0~1;lie=列,0~15;ptr=字符串数组
    ui i;
    Show_h(hang,lie);
    for(i=0;i

}

void Show_num (uint8_t hang,uint8_t lie,uint16_t num)

{//显示数字=hang=行,0~1;lie=列,0~15;num=要显示的数字
    uc qian,bai,shi,ge;
    Show_h(hang,lie);
    qian=num/1000; 
    bai=(num%1000)/100;
    shi=((num%1000)%100)/10;
    ge=((num%1000)%100)%10;
    if(qian==0){w_dat(' ');}else{w_dat(qian+0x30);}
    if((bai==0)&&(qian==0)){w_dat(' ');}else{w_dat(bai+0x30);}
    if((shi==0)&&(bai==0)&&(qian==0))

    {

        w_dat(' ');

    }

    else

    {

        w_dat(shi+0x30);

    }
    w_dat(ge+0x30);
}

void InitLcd()

{//初始化子程序
    s(1);
    w_com(0x38); //显示模式设置
    w_com(0x01); //显示清屏
    w_com(0x0c); //显示开及光标设置
    w_com(0x06); //显示光标移动位置
}


/* spi.h 代码:********************************/

#define uc unsigned char
#define ui unsigned int

后记:为了同事扩展输入和输出端口,有时我们经常使用74HC595和74HC165配合使用,在级联输出74HC595的同时也级联读取了74HC165,在大量扩展IO的场合这将大大缩短CPU读写扩展IO的时间,提高了CPU的工作效率,对于进行大量扩展的应用具有非常重要的意义。

 

                                    ——摘自:http://www.ynpax.com

 

 

【 2011-5-1 7:55:52 】 【 打印本稿 】 【 关闭窗口
上一条新闻: 西门子变频器启动打嗝故障维修一例
下一条新闻: 工控机维修实例1
 

免费技术支持    高低压变频器维修
版权所有©:   云南兆富科技有限公司 (滇ICP备11002993号)
地址:云南.云南.昆明市经开区浦新路6号昆明C谷西区四楼    电话: 0871-67322300,67322190
邮箱:paxzdh@126.com    QQ群:23873342    手机:13095328257    传真:0871-67328055