/* 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