/******** 實驗驅(qū)動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 稱位寄存器壯態(tài)保持
X X X 上沿 X 輸出存儲器鎖存(移位寄存器中的壯態(tài)值)
X X X 下沿 X 輸出存儲器壯態(tài) 保持
**************分析******************
實計使用:
SI 數(shù)據(jù) (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; //延時基數(shù)
extern unsigned int b = 1; //并行數(shù)據(jù) 初使參數(shù)
extern unsigned int c = 0;
// int temp=0b00000001; // 移位數(shù)據(jù) 初使參數(shù)
/**************分析******************
實計使用:
SI 數(shù)據(jù) (14腳)
RCK 鎖存 (12腳)
SCK 時鐘 (11時鐘)
注意:第調(diào)用一次 腳位電平反轉(zhuǎn) ^=
***************************************/
#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
};
/********將顯示數(shù)據(jù)裝入74HC595內(nèi)部移位奇存器*****/
void WR_595(char c)
{
char unm,j,i,x; //定義3個(16位)常量
unm=DisTab[c]; // 顯示數(shù)據(jù)存入 unm 中
for (j=0;j<7;j++)
{
SCK_1; //上沿 移位寄存器(存儲)
// x = unm&0x80; //數(shù)據(jù) (unm 與 0X80)與運算后存入X
x = unm&0b1000000;
if(x==0) // 數(shù)據(jù)寫到 SI 端口
{
SI_0; //如果X==0,SI_1 數(shù)據(jù)寫1,
}
else //如果X==0,SI_1 數(shù)據(jù)寫0,
{
SI_1;
}
SCK_0; //下沿 移位寄存器(壯態(tài)保持)
unm = unm<<1; //數(shù)據(jù)移位
}
}
/**********鎖存并顯示**************/
void OUT_595(void)
{
RCK_1; //上沿,壯態(tài)鎖存
RCK_0; //下沿,保持74HC595輸出壯態(tài)
Delay_ms(500); //延時 74HC顯示一段時間
}
/**********************************/
/***************開始***********************/
void main(void)
{
port_init(); //端口初使化
while(1) //超極循環(huán)
{
char i;
for(i=0;i<8;i++)
{
WR_595(2); //顯示數(shù)據(jù)裝入并顯示
OUT_595();
}
}
}
|