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