并行口扩展4个8位并行输出口

#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本身没有锁存的闪烁问题
  } 
  
}

猜你喜欢

转载自blog.csdn.net/yilongdashi/article/details/80827205