⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led_traffic_light.c

📁 点阵式交通灯(采用8*8双色点阵)可模拟十字路口交通灯
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>


#define uchar unsigned char
#define uint  unsigned int
#define BLKN 8

#define pa XBYTE[0X1FFF]        //数据到a
#define con8255 XBYTE[0XdFFF]       //写控制字

unsigned char idata dispram[128];
//unsigned char xdata dispram[128] _at_ 0x0000;
uchar temp;
uchar sec=40;

sbit GDAT0=P1^6;    //0绿串行信号输入
sbit RDAT0=P1^7;    //0红串行信号输入
sbit OE0=P1^5;        //0使能端 低电平有效
sbit SCLK_5950=P1^4;      //0移位时钟脉冲
sbit RCK_5950=P1^3;      //0输出锁存器控制脉冲

//sbit GDAT1=P1^6;    //1绿串行信号输入
//sbit RDAT1=P1^7;    //1红串行信号输入
//sbit OE1=P1^5;        //1使能端 低电平有效
//sbit SCLK_5951=P1^4;      //1移位时钟脉冲
//sbit RCK_5951=P1^3;      //1输出锁存器控制脉冲





uchar i,j,k,l,m,t,jj;
uchar n=0; //时钟中用
uchar flag=1;

uchar code shuzi[10][16]={
    {0xFF,0xFF,0xFF,0x83,0x39,0x39,0x31,0x29,0x29,0x19,0x39,0x39,0x83,0xFF,0xFF,0xFF,},  //0
    {0xFF,0xFF,0xFF,0xE7,0xC7,0x87,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0x81,0xFF,0xFF,0xFF,},  //1
    {0xFF,0xFF,0xFF,0x83,0x39,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x39,0x01,0xFF,0xFF,0xFF,},  //2
    {0xFF,0xFF,0xFF,0x83,0x39,0xF9,0xF9,0xC3,0xF9,0xF9,0xF9,0x39,0x83,0xFF,0xFF,0xFF,},  //3
    {0xFF,0xFF,0xFF,0xF3,0xE3,0xC3,0x93,0x33,0x01,0xF3,0xF3,0xF3,0xE1,0xFF,0xFF,0xFF,},  //4
    {0xFF,0xFF,0xFF,0x01,0x3F,0x3F,0x3F,0x03,0xF1,0xF9,0xF9,0x39,0x83,0xFF,0xFF,0xFF,},  //5
    {0xFF,0xFF,0xFF,0xC7,0x9F,0x3F,0x3F,0x03,0x39,0x39,0x39,0x39,0x83,0xFF,0xFF,0xFF,},  //6
    {0xFF,0xFF,0xFF,0x01,0x39,0xF9,0xF9,0xF3,0xE7,0xCF,0xCF,0xCF,0xCF,0xFF,0xFF,0xFF,},  //7
    {0xFF,0xFF,0xFF,0x83,0x39,0x39,0x39,0x83,0x39,0x39,0x39,0x39,0x83,0xFF,0xFF,0xFF,},  //8
    {0xFF,0xFF,0xFF,0x83,0x39,0x39,0x39,0x81,0xF9,0xF9,0xF9,0xF3,0x87,0xFF,0xFF,0xFF,},  //9
   };


uchar code fangxiang[4][32]={
    {0xFF,0xFF,0xFE,0xFF,0xFC,0xFF,0xF8,0xFF,0xF0,0xFF,0xE0,0x01,0xC0,0x01,0x80,0x01,
     0x80,0x01,0xC0,0x01,0xE0,0x01,0xF0,0xFF,0xF8,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,},
    {0xFF,0xFF,0xFE,0x7F,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xE0,0x07,0xC0,0x03,0x80,0x01,
     0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xF8,0x1F,0xFF,0xFF,},
    {0xFF,0xFF,0xFF,0x7F,0xFF,0x3F,0xFF,0x1F,0xFF,0x0F,0x80,0x07,0x80,0x03,0x80,0x01,
     0x80,0x01,0x80,0x03,0x80,0x07,0xFF,0x0F,0xFF,0x1F,0xFF,0x3F,0xFF,0x7F,0xFF,0xFF,},
    {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},
   };



void sdelay(int k)      //短延时
{
   while(k--);
}
void delay(int ms)      //延时n*ms
{
   int k;
   while(ms--)
   {
     for(k=0; k<250; k++)
     {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
     }
   }
}

  void clearram()                 //清除内存空间
       {
          for(m=0;m<128;m++)
            {
               dispram[m]=0xff;
            }
       }

void WR_hong0(uchar temp1)        //将上半部红显示数据送入74HC595内部移位寄存器
{
     //uchar j;
      for (j=0;j<8;j++)
     {
      temp1=temp1<<1;
      RDAT0=CY;

      SCLK_5950=1;                     //上升沿发生移位
       //_nop_();
       //_nop_();
      SCLK_5950=0;
     }
}
 /*
void WR_hong1(uchar temp1)        //将上半部红显示数据送入74HC595内部移位寄存器
{
     //uchar j;
      for (j=0;j<8;j++)
     {
      temp1=temp1<<1;
      RDAT1=CY;

      SCLK_5951=1;                     //上升沿发生移位
       //_nop_();
       //_nop_();
      SCLK_5951=0;
     }
}
   */
void WR_lv0(uchar temp1)              //将上半绿红显示数据送入74HC595内部移位寄存器
{
    //uchar j;
      for (j=0;j<8;j++)
     {
      temp1=temp1<<1;
      GDAT0=CY;
      SCLK_5950=1;                     //上升沿发生移位
       //_nop_();
       //_nop_();
      SCLK_5950=0;
     }
}
    /*
void WR_lv1(uchar temp1)              //将上半绿红显示数据送入74HC595内部移位寄存器
{
    //uchar j;
      for (j=0;j<8;j++)
     {
      temp1=temp1<<1;
      GDAT1=CY;

      SCLK_5951=1;                     //上升沿发生移位
       //_nop_();
       //_nop_();
      SCLK_5951=0;
     }
}
     */

 void OUT_5950(void)      //将上半部移位寄存器内的数据锁存到输出寄存器并显示
{
    RCK_5950=0;
    //_nop_();
    //_nop_();
    RCK_5950=1;                       //上升沿将数据送到输出锁存器
   // _nop_();
   // _nop_();
   // _nop_();
   // RCK_595=0;
}
   /*
 void OUT_5951(void)      //将上半部移位寄存器内的数据锁存到输出寄存器并显示
{
    RCK_5951=0;
    //_nop_();
    //_nop_();
    RCK_5951=1;                       //上升沿将数据送到输出锁存器
   // _nop_();
   // _nop_();
   // _nop_();
   // RCK_595=0;
}
     */



void timer0(void) interrupt 1
   {
     TH0=0xf6;
      //TH0=0xfa;
     TL0=0xb6;
     OE0=1;
    // OE1=1;
     pa++;
     pa&=0x0f;
     SCLK_5950=0;
     RCK_5950=1;
    // SCLK_5951=0;
    // RCK_5951=1;
      for (i=0; i<8; i++)
        {
             
               temp=dispram[pa*BLKN+i];        //取显示数据

                if(flag%2)
                  {
                      //WR_lv1(temp);
                       WR_lv0(temp);/*
                     if(i==4||i==5)
                       {
                         //WR_lv1(temp);
                         WR_lv0(temp);
                       }
                      else
                       {
                         //WR_hong1(temp);
                         WR_hong0(temp);

                       }    */
                  }
                 else
                   {
                     //WR_lv0(temp);
                   if(i==4||i==5)
                       {
                         // WR_lv1(temp);
                         WR_lv0(temp);
                       }
                      else
                       {
                        // WR_hong1(temp);
                         WR_hong0(temp);
                       }
                   }
              //  OUT_5951();
                OUT_5950();
        }
              // OE1=0; //开显示
               OE0=0; //开显示

   }

void timer1(void) interrupt 3         //时钟
   {
       TH1=0x3c;TL1=0xb0;
       n++;

            if(n==40)
             {
                n=0;
                sec--;
                if(sec==0)
                 {
                    flag--;
                    sec=40;
                 }
             }
   }

void main()
  {
      TH0=0xFa;TL0=0xb6;
      TH1=0x3c;TL0=0xb0;
      TMOD=0x11;
      IP=0x20;
      EA=1;
      ET0=1;ET1=1;
      TR0=1;TR1=1;
      con8255=0x80;
      pa=0xff;
      clearram();
        while(1)
           {

             for(k=0;k<16;k++)
               {

                     if(sec<=10&&n<=20&&flag)
                      {
                        dispram[k*BLKN]=fangxiang[3][2*k];
                        dispram[k*BLKN+1]=fangxiang[3][2*k+1];
                        dispram[k*BLKN+2]=fangxiang[3][2*k];
                        dispram[k*BLKN+3]=fangxiang[3][2*k+1];
                        dispram[k*BLKN+6]=fangxiang[3][2*k];
                        dispram[k*BLKN+7]=fangxiang[3][2*k+1];
                      }
                     else
                      {
                      dispram[k*BLKN]=fangxiang[0][2*k];
                      dispram[k*BLKN+1]=fangxiang[0][2*k+1];

                      dispram[k*BLKN+2]=fangxiang[1][2*k];
                      dispram[k*BLKN+3]=fangxiang[1][2*k+1];

                      dispram[k*BLKN+6]=shuzi[sec/10][k];
                      dispram[k*BLKN+7]=shuzi[sec%10][k];
                      }
                      dispram[k*BLKN+4]=fangxiang[2][2*k];
                      dispram[k*BLKN+5]=fangxiang[2][2*k+1];
                }
           }
  }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -