#include "STC8G.h"
#include "intrins.h"
// 获取进制数的某一位
#define get_bit(dat, bita) ((dat & (1<<bita)) >> bita)
typedef unsigned int u16;
typedef unsigned char u8;
sbit HC595_LATCH_CLK = P1^2;
sbit HC595_CLK = P1^3;
sbit HC595_DATA_OUT = P1^4;
sbit HC165_DATA_IN = P1^5;
sbit HC165_SHLD = P1^6;
sbit HC165_CLK = P1^7;
/*******向串口发数据*******/
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
bit busy;
char wptr;
char rptr;
char buffer[16];
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(unsigned char dat)
{
SBUF = dat;
while(TI==0);
TI =0;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
/**************/
// ms级延时函数
void delay(unsigned int xms)
{
unsigned int i,j;
for(i = xms; i > 0; i--)
for(j = 114; j > 0; j--);
}
// 发送数据
void HC595SendData(u16 SendVal)
{
u16 i;
bit a;
for(i=16; i>0; i--)
{
// 向HC595发送数据
a = get_bit(SendVal, i-1);
HC595_DATA_OUT = a;
// 数据输入时钟线;上升沿(0->1)时才会将数据一个个移位到数据口中(15,1~7口)。
HC595_CLK = 0;
_nop_();
_nop_();
HC595_CLK = 1;
_nop_();
_nop_();
}
// 输出存储器锁存时钟线;上升沿(0->1)时才会将数据一并移位到数据口中。
HC595_LATCH_CLK = 0;
_nop_();
_nop_();
HC595_LATCH_CLK = 1;
}
// 初始化
void _74HC165_init(void)
{
HC165_SHLD = 1;
HC165_CLK = 1;
}
// 获取HC165数据
unsigned int HC165PullData()
{
u16 i, datas;
datas = 0;
HC165_SHLD = 0;
HC165_SHLD = 1;
if(HC165_DATA_IN == 1)
datas |= 0x01; // 存储第一个数据
for(i=0; i<15; i++)
{
datas = datas << 1;
// 发送数据出去
HC165_CLK = 0;
_nop_();
_nop_();
HC165_CLK = 1;
// UartSend(HC165_DATA_IN);
if(HC165_DATA_IN == 1)
datas |= 0x01;
// 将数据存储到datas中
// datas = ( datas << 1 ) | HC165_DATA_IN;
//datas = datas << 1;
}
// 向串口发数据-测试
UartSend(datas>>8);
UartSend(datas);
// 将数据发送出去
return datas;
}
void main()
{
u16 a, HC165Data;
// 初始化74hc
_74HC165_init();
// 设置I/O口工作模式 - 推挽输出(不设置默认为高阻输入)
P1M0=0xff;
P1M1=0x00;
/*****************/
UartInit();
ES = 1;
EA = 1;
/*****************/
while(1)
{
// 获取165芯片传过来的数据
HC165Data = HC165PullData();
// 向595发送数据
HC595SendData(HC165Data);
/********串口*********/
if (rptr != wptr)
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
/*****************/
// 延时函数
delay(5000);
}
}
扩充:
// 定义联合体
typedef union{
u16 dat;
struct{
u16 bit0:1;
u16 bit1:1;
u16 bit2:1;
u16 bit3:1;
u16 bit4:1;
u16 bit5:1;
u16 bit6:1;
u16 bit7:1;
u16 bit8:1;
u16 bit9:1;
u16 bit10:1;
u16 bit11:1;
u16 bit12:1;
u16 bit13:1;
u16 bit14:1;
u16 bit15:1;
u16 bit16:1;
}BIT;
}led_def;
led_def leddata;
leddata.dat =1;
leddata.dat<<=0;