#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);
}
stc8a8k--spi--74hc595测试
最新推荐文章于 2024-04-18 11:21:18 发布