stc8a8k--spi--74hc595测试

#include <stc8a8k.h>
#include <intrins.h>
#include <stdlib.h>
#include <stdio.h>

//定时器0,闪烁的定时器
//定时器1,预留
//定时器2作为串口1de 波特率发生器
//定时器3作为预留
//定时器4,作为系统时钟,上电运行之后,的时钟,参考arduino的millis函数,读取的就是定时器的时钟;

unsigned int Global_System_Tim0_Ms=0;
//******************************位显示
#define LongToBin(n) \
(\
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define B(n) LongToBin(0x##n##l)
//*******************************位操作
//取低字节
#define lowByte(w) ((w) & 0xff)
//取高字节
#define highByte(w) ((w) >> 8)
//读一个bit
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
//写一个bit
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
//设置一个bit
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
//清空一个bit
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
//生成相应bit
#define bit(b) (1 << (b))
//******************************************位操作结束
sbit LED=P1^7;
sbit HC595_LATCH = P1^0;//latch pin or rck pin  STCP  ss 595pin12
sbit HC595_OE   = P1^1;//oe blank pin  595pin13
// 0data of 74hc595 pin14  ---->mosi P13
//clk of 595 shcp 595pin11        ---->sclk P15
void portmode();
void SendTo595(	unsigned char byteData);
void SpiTransfer(unsigned char transferbyteTemp);

void Timer0Init(void)	;	//1毫秒@22.1184MHz
unsigned int Get_millis(void);
void Delay10us();		//@22.1184MHz
void Delay30us();		//@22.1184MHz
void Delay500ms();		//@22.1184MHz

UART1 发送串口数据,字符串
void UartSendStr(char *p);
void UART1_SendData(char dat);
void Uart1_Init(void);		//115200bps@22.1184Mhz
bit busy;





void main()
{
	unsigned char c;
  long starttime=0;
	  busy = 0;
	  portmode();
 
	  LED=0;Delay500ms();
		LED=1;Delay500ms();
		
		LED=0;Delay500ms();
		LED=1;Delay500ms();


    SPCTL = 0x50;                               //使能SPI主机模式
    SPSTAT = 0xc0;                              //清中断标志
    IE2 = ESPI;                                 //使能SPI中断
    EA = 1;

	  HC595_LATCH =1;
    HC595_OE =0;	
	
	    Timer0Init();
	Uart1_Init();
	  EA=1;//打开总中断
		
//				starttime=Get_millis();
//				printf("time=%lu\r\n",starttime);
//				Delay500ms();
//				Delay500ms();
//				
//		 		starttime=Get_millis();
//				printf("time=%lu\r\n",starttime);
//				Delay500ms();
//				Delay500ms();
//				
//						starttime=Get_millis();
//				printf("time=%lu\r\n",starttime);
//				Delay500ms();
//				Delay500ms();
				TR0=0;
	while(1)
	{
		SpiTransfer(B(00000000));
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("time0\r\n");

			SpiTransfer(B(00000001));
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("time1\r\n");

		
		SpiTransfer(B(00000010));
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("time2\r\n");
	
	SpiTransfer(B(00000001));
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("time3\r\n");
	
			
	SpiTransfer(0xaa);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("aaaa\r\n");
				
	SpiTransfer(0xbb);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("bb\r\n");

			SpiTransfer(0xcc);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("cc\r\n");
		
			SpiTransfer(0xdd);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("dd\r\n");
		
			SpiTransfer(0xee);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("ee\r\n");
		
			SpiTransfer(0xff);
    Global_System_Tim0_Ms=0;	
		TR0=1;
		while(Global_System_Tim0_Ms  <100)
		{
		}
		TR0=0;
		
		printf("ff\r\n");

	}
	
}

void portmode()
{
	P0M0=0x00;P0M1=0x00;
	P1M0=0x00;P1M1=0x00;
	P2M0=0x00;P2M1=0x00;
	P3M0=0x00;P3M1=0x00;
	P4M0=0x00;P4M1=0x00;
	P5M0=0x00;P5M1=0x00;
	P6M0=0x00;P6M1=0x00;
	P7M0=0x00;P7M1=0x00;
}

void SPI_Isr() interrupt 9
{
    SPSTAT = 0xc0;                              //清中断标志
    HC595_LATCH = 1;                                     //拉高从机的SS管脚
    busy = 0;
   // LED = !LED;                                 //测试端口
}
void SpiTransfer(unsigned char transferbyteTemp)
{
//        HC595_LATCH = 0;      //拉低从机SS管脚                  
//        SPDAT =transferbyteTemp;   //发送测试数据                       
//        while (!(SPSTAT & 0x80));  //查询完成标志           
//        SPSTAT = 0xc0;  //清中断标志                      
//        HC595_LATCH = 1;  //拉高从机的SS管脚 
	
	     
        busy = 1;
        HC595_LATCH = 0;                                 //拉低从机SS管脚
        SPDAT = transferbyteTemp;                           //发送测试数据
	      while (busy);
}

void Timer0Init(void)		//10毫秒@22.1184MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xB8;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0开始计时
	ET0=1; //使能定时器中断
}





void TM0_Isr() interrupt 1
{
 //   P10 = !P10;                                 //测试端口
	Global_System_Tim0_Ms++;
	if(Global_System_Tim0_Ms>10000)//2,147,483,648
	{
		Global_System_Tim0_Ms=0;
	}

}



unsigned int Get_millis(void)
{
	return Global_System_Tim0_Ms;
}



//串口1,波特率115200,定时器2产生,
void Uart1_Init(void)		//115200bps@22.1284000MHz
{
		SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xFC;		//设置定时初始值
	T2H = 0xFF;		//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
}



//重写putchar函数,可以用printf函数
char putchar(char c)
{
     UART1_SendData(c);
     return c;
}

//UART1 发送串口数据,一个字节
void UART1_SendData(char dat)
 {
     ES=0;           //关串口中断
     SBUF=dat;           
     while(TI!=1);   //等待发送成功
     TI=0;           //清除发送中断标志
     ES=1;           //开串口中断
}
//UART1 发送串口数据,字符串
void UartSendStr(char *p)
{
    while (*p)
    {
        UART1_SendData(*p++);
    }
}


void Delay10us()		//@22.1184MHz
{
	unsigned char i;
	i = 71;
	while (--i);
}


void Delay500ms()		//@22.1184MHz
{
	unsigned char i, j, k;

	i = 57;
	j = 27;
	k = 112;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void Delay30us()		//@22.1184MHz
{
	unsigned char i;
	i = 219;
	while (--i);
}



在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值