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

📄 light.c

📁 交通指示灯程序,实现红绿信号灯转换,完成指示结果
💻 C
字号:
#include "ICETEK-C6713-A.h"

#define nStatusNSGreenEWRed 160
#define nStatusNSFlashEWRed 184
#define nStatusNSYellowEWRed 200
#define nStatusNSRedEWYellow 216
#define nStatusNSRedEWGreen 376
#define nStatusNSRedEWFlash 400
#define nStatusNSRedEWYellow1 416
#define nStatusNSYellowEWRed1 432
#define nTotalTime 448
#define nStatusHold 160

#define statusNSGreenEWRed 0
#define statusNSFlashEWRed 1
#define statusNSYellowEWRed 2
#define statusNSRedEWYellow 3
#define statusNSRedEWGreen 4
#define statusNSRedEWFlash 5
#define statusHold 6

void InitDSP();
void InitInterrupt();
void SetLEDArray1(int nNumber);		// 修改显示内容
void RefreshLEDArray();			// 刷新显示

unsigned int uWork,nTimeCount;
unsigned short int uLightStatusEW,uLightStatusSN;
unsigned int bHold;
unsigned char ledbuf[8],ledx[8];
unsigned char mled[40]=
{
	0x7E,0x81,0x81,0x7E,0x00,0x02,0xFF,0x00,
	0xE2,0x91,0x91,0x8E,0x42,0x89,0x89,0x76,
	0x38,0x24,0x22,0xFF,0x4F,0x89,0x89,0x71,
	0x7E,0x89,0x89,0x72,0x01,0xF1,0x09,0x07,
	0x76,0x89,0x89,0x76,0x4E,0x91,0x91,0x7E
};
main()
{
	int nWork1,nWork2,nWork3,nWork4;
	int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;
	unsigned int nScanCode;
	
	nTimeCount=0; bHold=0;
	uLightStatusEW=uLightStatusSN=0;
	nNowStatus=0; nOldStatus=1; nOldTimeCount=0;
    init_emif();	// 初始化emif
    InitCTR();		// 初始化ICETEK-CTR
    CTRGR=2;		// IOPE=1 打开I/O端口控制指示灯功能, 见ICETEK-CTR的全局控制寄存器描述
    CTRLR=0x0c1;	// 打开发光二极管阵列
	// 清除显示
	for ( nWork1=0;nWork1<8;nWork1++ )
	{
		ledbuf[nWork1]=0x0ff;		// 显示为空白
		ledx[nWork1]=(nWork1<<4);	// 生成显示列控制字
	}
	RefreshLEDArray();
	InitInterrupt();
	// 根据计时器计数切换状态
	// 根据状态设置计数和交通灯状态
	while ( 1 )			
	{
		if ( bHold && nNowStatus==statusHold )	
		{
			if ( nTimeCount>=nStatusHold )
			{
				nNowStatus=nSaveStatus;
				nTimeCount=nSaveTimeCount;
				bHold=0;
			}
		}
		else if ( nTimeCount<nStatusNSGreenEWRed )	nNowStatus=statusNSGreenEWRed;
		else if ( nTimeCount<nStatusNSFlashEWRed )	nNowStatus=statusNSFlashEWRed;
		else if ( nTimeCount<nStatusNSYellowEWRed )	nNowStatus=statusNSYellowEWRed;
		else if ( nTimeCount<nStatusNSRedEWYellow )	nNowStatus=statusNSRedEWYellow;
		else if ( nTimeCount<nStatusNSRedEWGreen )	nNowStatus=statusNSRedEWGreen;
		else if ( nTimeCount<nStatusNSRedEWFlash )	nNowStatus=statusNSRedEWFlash;
		else if ( nTimeCount<nStatusNSRedEWYellow1 )	nNowStatus=statusNSRedEWYellow;
		else if ( nTimeCount<nStatusNSYellowEWRed1 )	nNowStatus=statusNSYellowEWRed;
		if ( nNowStatus==nOldStatus )
		{
			switch ( nNowStatus )
			{
				case statusNSFlashEWRed:
					nWork1=nTimeCount-nStatusNSGreenEWRed;
					nWork2=nStatusNSYellowEWRed-nStatusNSFlashEWRed;
					nWork3=nWork2/3;
					nWork4=nWork3/2;
					if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )
						uLightStatusSN=( (nWork1%nWork3)<=nWork4 )?(0x49):(0x40);
					break;
				case statusNSRedEWFlash:
					nWork1=nTimeCount-nStatusNSRedEWGreen;
					nWork2=nStatusNSRedEWYellow1-nStatusNSRedEWFlash;
					nWork3=nWork2/3;
					nWork4=nWork3/2;
					if ( nWork1>=0 && nWork2>0 && nWork3>0 && nWork4>0 )
						uLightStatusEW=( (nWork1%nWork3)<=nWork4 )?(0x09):(0x00);
					break;
				case statusNSGreenEWRed:
					nWork1=nStatusNSGreenEWRed/20;
					if ( nWork1>0 )
					{
						nWork2=20-nTimeCount/nWork1;
						if ( bHold )
						{
							if ( nWork2>10 )
							{
								nTimeCount=nWork1*10;
								nWork2=10;
							}
						}
						if ( nOldTimeCount!=nWork2 )
						{
							nOldTimeCount=nWork2;
							SetLEDArray1(nWork2);
						}
					}
					break;
				case statusNSRedEWGreen:
					nWork1=(nStatusNSRedEWGreen-nStatusNSRedEWYellow)/20;
					if ( nWork1>0 )
					{
						nWork2=20-(nTimeCount-nStatusNSRedEWYellow)/nWork1;
						if ( bHold )
						{
							if ( nWork2>10 )
							{
								nTimeCount=nStatusNSRedEWYellow+nWork1*10;
								nWork2=10;
							}
						}
						if ( nOldTimeCount!=nWork2 )
						{
							nOldTimeCount=nWork2;
							SetLEDArray1(nWork2);
						}
					}
					break;
				case statusHold:
					nWork1=nStatusHold/20;
					if ( nWork1>0 )
					{
						nWork2=20-nTimeCount/nWork1;
						if ( nOldTimeCount!=nWork2 )
						{
							nOldTimeCount=nWork2;
							SetLEDArray1(nWork2);
						}
					}
					break;
			}
		}
		else
		{
			if ( bHold )
			{
				nSaveStatus=nNowStatus;
				nSaveTimeCount=nTimeCount;
				nNowStatus=statusHold;
				nTimeCount=0;
				if ( nSaveStatus==statusNSFlashEWRed || nSaveStatus==statusNSYellowEWRed )
				{
					nSaveStatus=statusNSRedEWGreen;
					nSaveTimeCount=nStatusNSRedEWYellow;
				}
				else if ( nSaveStatus==statusNSRedEWFlash || nSaveStatus==statusNSRedEWYellow )
				{
					nSaveStatus=statusNSGreenEWRed;
					nSaveTimeCount=0;
				}
			}
			nOldStatus=nNowStatus;
			switch ( nNowStatus )
			{
				case statusNSGreenEWRed:
					uLightStatusEW=0x24; uLightStatusSN=0x49;
					SetLEDArray1(20);
					break;
				case statusNSFlashEWRed:
					uLightStatusEW=0x24; uLightStatusSN=0x49;
					SetLEDArray1(0);
					break;
				case statusNSYellowEWRed:
					uLightStatusEW=0x24; uLightStatusSN=0x52;
					SetLEDArray1(20);
					break;
				case statusNSRedEWYellow:
					uLightStatusEW=0x12; uLightStatusSN=0x64;
					SetLEDArray1(20);
					break;
				case statusNSRedEWGreen:
					uLightStatusEW=0x09; uLightStatusSN=0x64;
					SetLEDArray1(20);
					break;
				case statusNSRedEWFlash:
					uLightStatusEW=0x09; uLightStatusSN=0x64;
					SetLEDArray1(0);
					break;
				case statusHold:
					uLightStatusEW=0x24; uLightStatusSN=0x64;
					SetLEDArray1(20);
					break;
			}
		}
		CTRLR=uLightStatusEW; CTRLR=uLightStatusSN;	// 设置交通灯状态	
		RefreshLEDArray();	// 刷新发光二极管显示
		nScanCode=CTRKEY;	// 读键盘扫描码
		nScanCode&=0x0ff;
		if ( nScanCode==SCANCODE_Enter )	break;
	}
	CloseCTR();
	exit(0);
}

// 定时器中断服务程序,进行时钟计数
void interrupt Timer()
{
	nTimeCount++;
	nTimeCount%=nTotalTime;
}

// 设置发光二极管显示内容
void SetLEDArray1(int nNumber)
{
	int i,k,kk,kkk;
	
	kkk=nNumber; 
	k=kkk/10*4; kk=kkk%10*4;
	for ( i=0;i<4;i++ )
	{
		ledbuf[7-i]=~mled[k+i];
		ledbuf[3-i]=~mled[kk+i];
	}
}

void InitInterrupt()
{
	// 设置中断控制寄存器
	CSR&=0xfffffffe;	// 关中断 GIE=0
	ISTP=0x00000c00;	// 重置中断向量表到0C00h
   	IMH=0x08000000;		// 指定Timer1产生int15中断
   	IML=0x0a0;			// 指定xint5中断
   	ICR=0xff;			// 清除等待的中断
	IER=0x8023;			// 使能int15、xint5中断
	// 设置定时器产生中断信号的频率
	TIMER1PRD=781250;	// 定时器1的周期=781250, 0.25s
	TIMER1CTL=0x3c0;	// 开始计数
	CSR=CSR|1; 			// 开中断
}

void interrupt XINT5(void)	// XINT2中断服务程序
{
	bHold=1;
}





⌨️ 快捷键说明

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