#include <reg51.h>
//51头文件
#include <intrins.h> // 循环头文件
#define uchar unsigned char //定义uchar为无符号字符型
#define uint unsigned int //定义uint为无符号整型
#define ulong unsigned long int // 定义ulong为无符号长整型
//,利用移位寄存器实现串口数据发送,数据发送通过写SBUF寄存器完成,写入SBUF的8位数据通过RXD逐位发送,移位脉冲则通过TTXD发送。
//,即移位寄存器输入/输出模式,串行数据通过RXD输出,TXD则用于输出移位时钟脉冲
sbit MR = P2^0;
sbit LED_Dir_Pressed = P2^1;
sbit LED_Amount_Pressed = P2^2;
uchar Dir_Flag = 0; //流水灯的方向
uchar LED_Count = 1; // 流水灯的数目
uchar LED_Count_Flag = 0;//按键按下的标志
void Delay_Ms(uint m); //延迟函数
void USART_Init(void); //串口初始化函数
void Send_Char(uchar cdata); //发送函数
void Button_Scan(void); //按键扫描函数
uchar Dir_Flag; //方向标志
uchar LED_Count; //流水灯数目
uchar LED_Count_Flag; //流水灯数目标志位
//毫秒级函数
void Delay_Ms(uint m)
{
uchar i = 0;
while(m--)
{
for(i =112; i>0; i--);
}
}
//串口方式0初始化 可以不使用中断,即查询方式,此处使用了中断方式
void USART_Init(void) //数据初始化
{
SCON=0x00;
EA=1; //打开全局中断控制 ,在此条件下·,由各个中断控制位确定相应中断的打开或关闭。
ES=1; //打开串行口中断
MR = 1;
}
//发送字节数据
void Send_Char(uchar cdata)
{
SBUF = cdata; //数据送串口数据缓冲器
}
//中断初始化
void USART_Hander() interrupt 4
{
TI = 0; //发送数据结束
}
//按键扫描函数
void Button_Scan(void)
{
if(LED_Dir_Pressed == 0)
{
Delay_Ms(5);
if(LED_Dir_Pressed == 0)
{
Dir_Flag = !Dir_Flag;
}
while(!LED_Dir_Pressed);
}
if(LED_Amount_Pressed == 0)
{
Delay_Ms(5);
if(LED_Amount_Pressed == 0)
{
LED_Count++;
LED_Count_Flag = 1;
if(LED_Count == 33)
LED_Count = 1;
}
while(!LED_Amount_Pressed); //等待按键释放
}
}
int main()
{
uchar i = 0;
uchar Send_Data = 0; //发送的字节数据
uchar Temp = 0; //用于将32位数据分成4个字节
ulong Cdata = 0x80000000; //用来控制32位流水灯的,转化为二进制位1000 0000 0000 0000 0000 0000 0000 0000
USART_Init();// 串口初始化
while(1)
{
MR = 1;
Temp = 0;
Button_Scan(); //按键扫描
if(LED_Count_Flag == 1) //如果改变灯数的按键按下
{
Cdata = 0xffffffff << (32-LED_Count); //代表流水灯的个数
LED_Count_Flag = 0;
}
for(i = 4; i>0; i--) //分成4个字节依次发送
{
Send_Data = Cdata >> Temp;
Temp = Temp + 8;
Send_Char(Send_Data);
}
if(Dir_Flag == 0)
Cdata = _lror_(Cdata,1);
else
Cdata = _lrol_(Cdata,1);
Delay_Ms(200);
MR = 0; //消除164本身没有锁存的闪烁问题
}
}
#include <intrins.h> // 循环头文件
#define uchar unsigned char //定义uchar为无符号字符型
#define uint unsigned int //定义uint为无符号整型
#define ulong unsigned long int // 定义ulong为无符号长整型
//,利用移位寄存器实现串口数据发送,数据发送通过写SBUF寄存器完成,写入SBUF的8位数据通过RXD逐位发送,移位脉冲则通过TTXD发送。
//,即移位寄存器输入/输出模式,串行数据通过RXD输出,TXD则用于输出移位时钟脉冲
sbit MR = P2^0;
sbit LED_Dir_Pressed = P2^1;
sbit LED_Amount_Pressed = P2^2;
uchar Dir_Flag = 0; //流水灯的方向
uchar LED_Count = 1; // 流水灯的数目
uchar LED_Count_Flag = 0;//按键按下的标志
void Delay_Ms(uint m); //延迟函数
void USART_Init(void); //串口初始化函数
void Send_Char(uchar cdata); //发送函数
void Button_Scan(void); //按键扫描函数
uchar Dir_Flag; //方向标志
uchar LED_Count; //流水灯数目
uchar LED_Count_Flag; //流水灯数目标志位
//毫秒级函数
void Delay_Ms(uint m)
{
uchar i = 0;
while(m--)
{
for(i =112; i>0; i--);
}
}
//串口方式0初始化 可以不使用中断,即查询方式,此处使用了中断方式
void USART_Init(void) //数据初始化
{
SCON=0x00;
EA=1; //打开全局中断控制 ,在此条件下·,由各个中断控制位确定相应中断的打开或关闭。
ES=1; //打开串行口中断
MR = 1;
}
//发送字节数据
void Send_Char(uchar cdata)
{
SBUF = cdata; //数据送串口数据缓冲器
}
//中断初始化
void USART_Hander() interrupt 4
{
TI = 0; //发送数据结束
}
//按键扫描函数
void Button_Scan(void)
{
if(LED_Dir_Pressed == 0)
{
Delay_Ms(5);
if(LED_Dir_Pressed == 0)
{
Dir_Flag = !Dir_Flag;
}
while(!LED_Dir_Pressed);
}
if(LED_Amount_Pressed == 0)
{
Delay_Ms(5);
if(LED_Amount_Pressed == 0)
{
LED_Count++;
LED_Count_Flag = 1;
if(LED_Count == 33)
LED_Count = 1;
}
while(!LED_Amount_Pressed); //等待按键释放
}
}
int main()
{
uchar i = 0;
uchar Send_Data = 0; //发送的字节数据
uchar Temp = 0; //用于将32位数据分成4个字节
ulong Cdata = 0x80000000; //用来控制32位流水灯的,转化为二进制位1000 0000 0000 0000 0000 0000 0000 0000
USART_Init();// 串口初始化
while(1)
{
MR = 1;
Temp = 0;
Button_Scan(); //按键扫描
if(LED_Count_Flag == 1) //如果改变灯数的按键按下
{
Cdata = 0xffffffff << (32-LED_Count); //代表流水灯的个数
LED_Count_Flag = 0;
}
for(i = 4; i>0; i--) //分成4个字节依次发送
{
Send_Data = Cdata >> Temp;
Temp = Temp + 8;
Send_Char(Send_Data);
}
if(Dir_Flag == 0)
Cdata = _lror_(Cdata,1);
else
Cdata = _lrol_(Cdata,1);
Delay_Ms(200);
MR = 0; //消除164本身没有锁存的闪烁问题
}
}