/******** 实验驱动74HC595 芯片********
单片机型号:ATMEGA48PA
/********** 74HC595电平逻辑*********************
SI SCK SCLR RCK OE 输出管脚
X X X X H QA--QH 输出高阻
X X X X L QA--QH 输出有效值
X X L X X 称位寄存器清零
L 上沿 H X X 称位寄存器存储 L
H 上沿 H X X 称位寄存器存储 H
x 下沿 H X X 称位寄存器壮态保持
X X X 上沿 X 输出存储器锁存(移位寄存器中的壮态值)
X X X 下沿 X 输出存储器壮态 保持
**************分析******************
实计使用:
SI 数据 (14脚)
RCK 锁存 (12脚)
SCK 时钟 (11脚)
OE 与 RCK 相连 (13脚)
SCLR 接高电平 (10脚)
***************************************/
//ICC-AVR application builder : 2017-12-5 17:22:41
// Target : m48
// Crystal: 1.0000Mh
/***************************************************/
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
extern unsigned int a = 10; //延时基数
extern unsigned int b = 1; //并行数据 初使参数
extern unsigned int c = 0;
// int temp=0b00000001; // 移位数据 初使参数
/**************分析******************
实计使用:
SI 数据 (14脚)
RCK 锁存 (12脚)
SCK 时钟 (11时钟)
注意:第调用一次 脚位电平反转 ^=
***************************************/
#define SI_1 PORTB |= (1<<0)
#define SI_0 PORTB &= ~(1<<0)
#define SCK_1 PORTB |= (1<<1)
#define SCK_0 PORTB &=~(1<<1)
#define RCK_1 PORTB |= (1<<2)
#define RCK_0 PORTB &=~(1<<2)
/************端口初使化******************************/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0B00000011;
DDRD = 0xFF;
}
/***************mS延时***********************/
void Delay_ms(unsigned int Time)
{
unsigned char n=0;
while(Time>0)
{
for (n=1;n<187;n++)
{
NOP();
}
Time--;
}
}
/***********显示/字**************************/
const unsigned char DisTab[]=
{ 0b00000000, // 0
0b00000001, // 1
0b00000011, // 2
0b00000111, // 3
0b00001111, // 4
0b00011111, // 5
0b00111111, // 6
0b01111111, // 7
0b11111111, // 8
// 0b00000000, // 9
};
/********将显示数据装入74HC595内部移位奇存器*****/
void WR_595(char c)
{
char unm,j,i,x; //定义3个(16位)常量
unm=DisTab[c]; // 显示数据存入 unm 中
for (j=0;j<7;j++)
{
SCK_1; //上沿 移位寄存器(存储)
// x = unm&0x80; //数据 (unm 与 0X80)与运算后存入X
x = unm&0b1000000;
if(x==0) // 数据写到 SI 端口
{
SI_0; //如果X==0,SI_1 数据写1,
}
else //如果X==0,SI_1 数据写0,
{
SI_1;
}
SCK_0; //下沿 移位寄存器(壮态保持)
unm = unm<<1; //数据移位
}
}
/**********锁存并显示**************/
void OUT_595(void)
{
RCK_1; //上沿,壮态锁存
RCK_0; //下沿,保持74HC595输出壮态
Delay_ms(500); //延时 74HC显示一段时间
}
/**********************************/
/***************开始***********************/
void main(void)
{
port_init(); //端口初使化
while(1) //超极循环
{
char i;
for(i=0;i<8;i++)
{
WR_595(2); //显示数据装入并显示
OUT_595();
}
}
}
|