📄 led.c
字号:
#include "2407c.h"
#define T1MS 0x9c3f /* 9c3fH=40000-1 */
/*ioport unsigned int port8000;
ioport unsigned int port8005;
ioport unsigned int port8007;*/
void interrupt gptime1(void); /* 中断服务程序,定时器计数T1MS次时中断调用 */
void gp_init(void); /* 定时器初始化 */
unsigned int uWork,nCount;
int * pf;
unsigned int uWork,nCount;
int * pf;
void Delay(unsigned int nTime);
void SetLEDArray1(int nNumber); // 修改显示内容
void RefreshLEDArray1(); // 刷新显示
interrupt void XINT2_isr(void);
void EndICETEKCTR();
#define T46uS 0x0d40
#define SCANCODE_0 0x70
#define SCANCODE_1 0x69
#define SCANCODE_2 0x72
#define SCANCODE_3 0x7A
#define SCANCODE_4 0x6B
#define SCANCODE_5 0x73
#define SCANCODE_6 0x74
#define SCANCODE_7 0x6C
#define SCANCODE_8 0x75
#define SCANCODE_9 0x7D
#define SCANCODE_Del 0x49
#define SCANCODE_Enter 0x5A
#define SCANCODE_Plus 0x79
#define SCANCODE_Minus 0x7B
#define SCANCODE_Mult 0x7C
#define SCANCODE_Divid 0x4A
#define SCANCODE_Num 0x77
ioport int port8000;
ioport int port8001;
ioport int port8002;
ioport int port8003;
ioport int port8004;
ioport int port8005;
ioport int port8006;
ioport int port8007;
#define CTRGR port8000
#define CTRLCDCMDR port8001
#define CTRKEY port8001
#define CTRLCDCR port8002
#define CTRCLKEY port8002
#define CTRLCDLCR port8003
#define CTRLCDRCR port8004
#define CTRLA port8005
#define CTRLR port8007
int var1 = 0;
int var2 = 0;
int var3 = 0;
int test_count = 0;
int Test_flag = 0;
int Test_var = 0;
int Test_status[32];
#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
int a=0;
unsigned int uWork,nTimeCount,nTimeMS;
unsigned int uLightStatusEW,uLightStatusSN;
unsigned int bHold;
unsigned char ledbuf[8],ledx[8];
unsigned char led[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
};
void interrupt xint(void);
main()
{
int i;
int nWork1,nWork2,nWork3,nWork4,k;
int nNowStatus,nOldStatus,nOldTimeCount,nSaveTimeCount,nSaveStatus;
unsigned int nScanCode;
nTimeCount=0; bHold=0;
uLightStatusEW=uLightStatusSN=0;
nNowStatus=0; nOldStatus=1; nOldTimeCount=0;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗中断 */
*SCSR1=0x81fe; /* 设置DSP运行频率40m */
(*MCRB)=0;
asm(" setc INTM"); /* 关中断,进行关键设置时不允许发生中断,以免干扰 */
uWork=(*MCRC); /* 将PWM12/IOPE6设置成通用I/O口,以控制实验箱上指示灯 */
uWork&=0x0ffbf;
(*MCRC)=uWork;
CTRGR=0; // 初始化ICETEK-CTR
CTRGR=0x80;
CTRGR=0;
CTRGR=0x82;
CTRLR=0; // 关闭东西方向的交通灯
CTRLR=0x40; // 关闭南北方向的交通灯
CTRLR=0x0c1; // 开启发光二极管显示阵列
for ( k=0;k<8;k++ )
{
ledbuf[k]=0x0ff; // 显示为空白
ledx[k]=(k<<4); // 生成显示列控制字
}
k=CTRLCDCR; // 清除键盘缓冲区
gp_init(); /* 设置定时器 */
*IMR=0x2; /* 使能定时器中断(INT2&INT1) */
*IFR=0xffff; /* 清除中断标志 */
*XINT2CR=0x1; //使能外部中断2
asm(" clrc INTM"); /* 开中断 */
//*T1CON = 0x1040; /* 启动计数器 */
//gp_init(); /* 设置定时器 */
//*IMR=0x2; /* 使能定时器中断(INT2) */
//*IFR=0xffff; /* 清除中断标志 */
/*port8000=0; // 初始化ICETEK-CTR
port8000=0x80;
port8000=0;
port8000=0x82;
port8007=0; // 关闭东西方向的交通灯
port8007=0x40; // 关闭南北方向的交通灯
asm(" clrc INTM");*/ /* 开中断 */
// 根据计时器计数切换状态
// 根据状态设置计数和交通灯状态
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; // 设置交通灯状态
RefreshLEDArray1(); // 刷新发光二极管显示
nScanCode=CTRKEY; // 读键盘扫描码
nScanCode&=0x0ff;
if ( nScanCode==SCANCODE_Enter ) break;
}
EndICETEKCTR();
exit(0);
}
// 中断服务程序:响应INT2中断
void interrupt gptime1(void) /* 中断服务程序定义,须使用interrupt声 */
{
uWork=(*PIVR); /* 读外设中断向量寄存器*/
switch(uWork)
{
case 0x27: /* T1PINT,0x27为定时器1的周期中断的向量值 */
{
(*EVAIFRA)=0x80; /* 清除中断标志T1PINT */
nCount++;
if ( nCount>=500 ) /* 计数500此=500ms=0.5秒*/
{
uWork=(*PEDATDIR); /* 设置指示灯状态翻转一次 */
uWork|=0x4000;
uWork^=0x0040;
(*PEDATDIR)=uWork;
nCount=0;
}
break;
}
}
}
void gp_init(void)
{
*EVAIMRA = 0x80; /* 使能T1PINT即通用定时器1周期中断 */
*EVAIFRA = 0xffff; /* 清除中断标志 */
*GPTCONA = 0x0000;
*T1PR = T1MS; /* 周期寄存器=40000 */
*T1CNT = 0; /* 计数初值=0 */
*T1CON = 0x1040; /* 启动计数器 */
}
void Delay(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<64;jj++ )
{
kk++;
}
}
}
// 设置发光二极管显示内容
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]=~led[k+i];
ledbuf[3-i]=~led[kk+i];
}
}
// 将缓存中点阵送发光二极管显示
void RefreshLEDArray1()
{
int i;
for ( i=0;i<8;i++ )
{
CTRGR=ledx[i];
CTRLA=ledbuf[i];
}
}
void EndICETEKCTR()
{
int k;
CTRLR=0; // 关闭东西方向的交通灯
CTRLR=0x40; // 关闭南北方向的交通灯
CTRLR=0x0c0; // 关闭发光二极管显示阵列
k=CTRLCDCR; // 清除键盘缓冲区
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -