📄 main.c
字号:
//************************************************************
//*程序名称 : 按键流水灯测试程序(带按键软件去抖)
//*硬件环境 : MJ51学习板
//*CPU类型 : AT89S52@12MHz
//*程序作者 : LittleJimmy, jimmy416@163.com
//*编写日期 : 2007-8-28
//************************************************************
//============================================================
//*特别说明: 学习板中LED/数码管与LCD电路复用了P0口,且LCD侧LCD
//*电路可能会影响到LED显示,所以运行此程序时,请将J3的八个位跳
//*线连接至‘SEG X 8’一侧
//============================================================
#include <reg52.h>
unsigned char TimeCount; //计数值
unsigned char status; //状态,以RD1为准,0为红灯,1为红/黄灯,2为绿灯,3为绿/黄灯
unsigned char dispSHI,dispGE;
sbit SEGCLK = P3^3; //SPI显示相关引脚定义
sbit SEGOUT = P3^4;
sbit SEGDAT = P3^5;
sbit RD1_red = P0^0; //红绿灯相关定义,RD1为方向1,RD2为方向2
sbit RD1_yellow = P0^1;
sbit RD1_green = P0^2;
sbit RD2_red = P0^5;
sbit RD2_yellow = P0^6;
sbit RD2_green = P0^7;
unsigned char code DispCode[17]={ //SPI数码管显示码表
0x03, //code of '0'
0x9F, //code of '1'
0x25, //code of '2'
0x0D, //code of '3'
0x99, //code of '4'
0x49, //code of '5'
0x41, //code of '6'
0x1F, //code of '7'
0x01, //code of '8'
0x09, //code of '9'
0x11, //code of 'A'
0xC1, //code of 'B'
0x63, //code of 'C'
0x85, //code of 'D'
0x61, //code of 'E'
0x71, //code of 'F'
0xFF //code of ' '
};
#define REDTIME 20 //红灯时间
#define YELLOWTIME 3 //黄灯时间
#define GREENTIME 10 //绿灯时间
//****************************************************************
//* SPI数码管显示函数
//****************************************************************
void SerialDisp(unsigned int DispVal)
{
unsigned char i;
SEGOUT = 0;
for(i=0;i<16;i++)
{
SEGCLK = 0;
if( (DispVal>>i) & 0x01 )
{
SEGDAT = 1;
}
else
{
SEGDAT = 0;
}
SEGCLK = 1;
}
SEGOUT = 1;
}
//****************************************************************
//* 主函数
//****************************************************************
void main(void){
P2 = 0xFF;
P0 = 0xFF;
TimeCount = REDTIME;
dispSHI = TimeCount /10;
dispGE = TimeCount % 10;
status = 0;
P0 = 0xFF;
RD1_red=0;
RD2_green=0;
TMOD = 0x01; //定时器方式1
TH0 = 0x3C;
TL0 = 0xB0;
ET0 = 1;
TR0 = 1;
EA = 1;
while(1);
}
//****************************************************************
//* 定时器中断服务程序
//****************************************************************
void timer0_ser(void) interrupt 1 {
unsigned int disptemp;
static count=0;
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if (count >= 20){ //1S
count = 0;
TimeCount--;
dispSHI = TimeCount /10;
dispGE = TimeCount % 10;
disptemp = (DispCode[dispSHI]<<8) | DispCode[dispGE];
SerialDisp(disptemp);
if (TimeCount == 0){ //计时时间到
status++;
if (status >= 4)status = 0;
P0 = 0xFF;
switch(status){
case 0:
TimeCount = REDTIME;
RD1_red=0;
RD2_green=0;
break;
case 1:
TimeCount = YELLOWTIME;
RD1_red=0;
RD2_green=0;
RD1_yellow=0;
RD2_yellow=0;
break;
case 2:
TimeCount = GREENTIME;
RD1_green=0; RD2_red=0;
break;
case 3:
TimeCount = YELLOWTIME;
RD1_green=0;
RD2_red=0;
RD1_yellow=0;
RD2_yellow=0;
break;
default:
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -