#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;

