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

📄 iopin1.c

📁 交通灯的小程序
💻 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 + -