📄 iopin1.c
字号:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
void Delay(unsigned int nTime);
void SetLEDArray1(int nNumber); // 修改显示内容
void RefreshLEDArray1(); // 刷新显示
interrupt void cpu_timer0_isr(void);
interrupt void XINT2_isr(void);
void EndICETEKCTR();
#define XINT2CR (*((unsigned int *)0x7071))
#define XNMICR (*((unsigned int *)0x7077))
#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
#define CTRGR *(int *)0x108000
#define CTRLCDCMDR *(int *)0x108001
#define CTRKEY *(int *)0x108001
#define CTRLCDCR *(int *)0x108002
#define CTRCLKEY *(int *)0x108002
#define CTRLCDLCR *(int *)0x108003
#define CTRLCDRCR *(int *)0x108004
#define CTRLA *(int *)0x108005
#define CTRLR *(int *)0x108007
Uint16 var1 = 0;
Uint16 var2 = 0;
Uint16 var3 = 0;
Uint16 test_count = 0;
Uint16 Test_flag = 0;
Uint16 Test_var = 0;
Uint16 Test_status[32];
#define uLightStatusEW=0x24; uLightStatusSN=0x49;
SetLEDArray1(20); 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 main(void)
{
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;
//InitSysCtrl();//初始化cpu
InitPll(0x0);
DINT;//关中断
InitPieCtrl();//初始化pie寄存器
IER = 0x0000;//禁止所有的中断
IFR = 0x0000;
InitPieVectTable();//初始化pie中断向量表
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序
PieVectTable.XINT2 = &XINT2_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
//EALLOW; // This is needed to write to EALLOW protected registers
//PieVectTable.XINT2 = &XINT2_isr;
//EDIS; // This is needed to disable write to EALLOW protected registers
CpuTimer0.RegsAddr = &CpuTimer0Regs;
// Initialize timer period to maximum:
CpuTimer0Regs.PRD.all = 0xffff;
//CpuTimer0Regs.PRDH.all = 0xffff;
// Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
CpuTimer0Regs.TPR.all = 0xff09;
CpuTimer0Regs.TIM.all = 0xffff;
//CpuTimer0Regs.TIMH.all = 0xffff;
CpuTimer0Regs.TPRH.all = 0;
// Make sure timer is stopped:
CpuTimer0Regs.TCR.bit.TSS = 1;
CpuTimer0Regs.TCR.bit.SOFT = 1;
CpuTimer0Regs.TCR.bit.FREE = 1;
// Reload all counter register with period value:
CpuTimer0Regs.TCR.bit.TRB = 1;
CpuTimer0Regs.TCR.bit.TIE = 1;
// Reset interrupt counters:
CpuTimer0.InterruptCount = 0;
// Enable CPU INT1 which is connected to CPU-Timer 0:
IER |= M_INT1;
// Enable TINT0 in the PIE: Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx5 = 1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
XINT2CR =0x1;/*打开管脚xint2外中断*/
//XNMICR=0x1;/*打开nmi中断*/
// Enable global Interrupts and higher priority real-time debug events:
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
CTRGR=0; // 初始化ICETEK-CTR
CTRGR=0x80;
CTRGR=0;
CTRLR=0; // 关闭东西方向的交通灯
CTRLR=0x40; // 关闭南北方向的交通灯
CTRLR=0x0c1; // 开启发光二极管显示阵列
for ( k=0;k<8;k++ )
{
ledbuf[k]=0x0ff; // 显示为空白
ledx[k]=(k<<4); // 生成显示列控制字
}
k=CTRLCDCR; // 清除键盘缓冲区
StartCpuTimer0();//启动定时器0
// 根据计时器计数切换状态
// 根据状态设置计数和交通灯状态
while ( 1 )
{
/* if ( bHold && nNowStatus==statusHold )//6
{
if ( nTimeCount>=nStatusHold )//160
{
nNowStatus=nSaveStatus;
nTimeCount=nSaveTimeCount;
bHold=0;
}
}*/
if(bHold==0){
uLightStatusEW=0x24;
uLightStatusSN=0x49;
SetLEDArray1(20);
}
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
{
//interrupt
/* 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;*/
}
}
if(nTimeCount>=nTotalTime){
bHold=0;
nTimeCount=0;
}
}
CTRLR=uLightStatusEW; CTRLR=uLightStatusSN; // 设置交通灯状态
RefreshLEDArray1(); // 刷新发光二极管显示
nScanCode=CTRKEY; // 读键盘扫描码
nScanCode&=0x0ff;
if ( nScanCode==SCANCODE_Enter ) break;
}
EndICETEKCTR();
exit(0);
}
interrupt void cpu_timer0_isr(void)
{
//CpuTimer0.InterruptCount++;
// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
CpuTimer0Regs.TCR.bit.TIF = 1;
CpuTimer0Regs.TCR.bit.TRB = 1;
nTimeMS++;
if ( nTimeMS>=5 )
{
nTimeMS=0;
nTimeCount++;
nTimeCount%=nTotalTime;
}
}
interrupt void XINT2_isr(void)
{
//StopCpuTimer0();
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
bHold=1;
nTimeCount=0;
//StartCpuTimer0();
}
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; // 清除键盘缓冲区
}
//===========================================================================
// No more.
//========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -