📄 led_traffic_light.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 + -