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

📄 main.c

📁 TI的2812控制交通灯
💻 C
字号:

#include "F2812_DataType.h"
#include "F2812_Reg.h"
#include "F2812_Init.h"

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];

Uint16 PASS_flag = 0;


int  r16,r17,r18,r21,r22,r23,r24,r25;
int  m,n;
unsigned int  lcdtab,uWork;
char  lcddata[128];
char  lcddata1[128];

//显示所需字模
char hz18[]=
{
/*--  文字: 空白  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

char hza[]=
{
/*--  文字:  A  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x07,0x1C,0x03,0x00,0x00,0x04,0x1C,0xE4,0x40,0x40,0xC4,0x3C,0x04,
};
char hzb[]=
{
/*--  文字:  B  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x0E,0x11,0x11,0x11,0x1F,0x10,0x00,0x70,0x88,0x04,0x04,0x04,0xFC,0x04,
};
char hzc[]=
{
/*--  文字:  C  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1C,0x10,0x10,0x10,0x10,0x0C,0x03,0x00,0x10,0x08,0x04,0x04,0x04,0x18,0xE0,
};
char hzd[]=
{
/*--  文字:  D  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x10,0x1F,0x10,0x00,0xF0,0x08,0x04,0x04,0x04,0xFC,0x04,
};
char hze[]=
{
/*--  文字:  E  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x10,0x17,0x11,0x11,0x1F,0x10,0x00,0x18,0x04,0xC4,0x04,0x04,0xFC,0x04,
};
char hzf[]=
{
/*--  文字:  F  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x10,0x17,0x11,0x11,0x1F,0x10,0x00,0x00,0x00,0xC0,0x00,0x04,0xFC,0x04,
};
//数字显示字模二维数组
char dig[10][16]=
{
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,
/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,
/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x11,0x10,0x10,0x10,0x0E,0x00,0x00,0x0C,0x84,0x44,0x24,0x14,0x0C,0x00,
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0C,0x12,0x11,0x11,0x10,0x0C,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x18,0x00,
/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x1F,0x08,0x04,0x03,0x00,0x00,0x00,0x24,0xFC,0x24,0x24,0x20,0xE0,0x00,
/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0x11,0x11,0x10,0x1F,0x00,0x00,0x70,0x88,0x04,0x04,0x84,0x98,0x00,
/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x18,0x11,0x11,0x08,0x07,0x00,0x00,0x70,0x88,0x04,0x04,0x88,0xF0,0x00,
/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x1C,0x13,0x10,0x10,0x1C,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,
/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00,
/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x88,0x44,0x44,0x8C,0x00,0x00,
};

void Test_Key(void);

void main(void)
{
	Init_F2812();
	
	Test_Key();
}

#define LCD_E_SET()		GpioDataRegs->GPFSET.all=BIT4
#define LCD_E_RESET()	GpioDataRegs->GPFCLEAR.all=BIT4
#define LCD_RW_SET()	GpioDataRegs->GPFSET.all=BIT5
#define LCD_RW_RESET()	GpioDataRegs->GPFCLEAR.all=BIT5
#define LCD_DI_SET()	GpioDataRegs->GPFSET.all=BIT2
#define LCD_DI_RESET()	GpioDataRegs->GPFCLEAR.all=BIT2
#define LCD_CS1_SET()	GpioDataRegs->GPFSET.all=BIT0
#define LCD_CS1_RESET()	GpioDataRegs->GPFCLEAR.all=BIT0
#define LCD_CS2_SET()	GpioDataRegs->GPFSET.all=BIT1
#define LCD_CS2_RESET()	GpioDataRegs->GPFCLEAR.all=BIT1


void LCD_DATA(unsigned char datas)
{
	Uint16 tempF,tempB;
	
	tempF=GpioDataRegs->GPFDAT.all;
	tempB=GpioDataRegs->GPBDAT.all;
	
	tempF&=0xbfff;//~(((Uint16)1)<<14);
	tempF|=(((Uint16)datas)&0x0001)<<14;
	
	tempB&=~((Uint16)0x013f);
	tempB|=(((Uint16)datas&(0x003f<<1))>>1)|(((Uint16)datas&0x80)<<1);
	
	GpioDataRegs->GPFDAT.all=tempF;
	GpioDataRegs->GPBDAT.all=tempB;
}

#define IODELAY()	Delay(5)	//asm (" RPT #200 || NOP")

Uint16 Delay_cnt;
void Delay(unsigned int nDelay)
  {
  int i,j;
  for(i=0;i<nDelay;i++)
  for(j=0;j<2;j++)
      Delay_cnt++;
      
   }

void Lcd_Write(unsigned char CSx,unsigned char Type,unsigned char datas)
{
	LCD_E_RESET();
	LCD_RW_RESET();
	if(Type==0)
		LCD_DI_RESET();
	else
		LCD_DI_SET();
	if(CSx==1)
		LCD_CS1_RESET();
	else if(CSx==2)
		LCD_CS2_RESET();
	IODELAY();
	LCD_E_SET();
	IODELAY();
	LCD_DATA(datas);
	IODELAY();
	LCD_E_RESET();
	IODELAY();
	if(CSx==1)
		LCD_CS1_SET();
	else if(CSx==2)
		LCD_CS2_SET();
	LCD_RW_SET();
	IODELAY();
}

#define CS1 	1
#define CS2 	2
#define CMD 	0
#define DATAS 	1

#define LCD_CMD_OFF		0x3e
#define LCD_CMD_ON		0x3f

void display_cs0(void)
{
	unsigned int i;
	unsigned int j;
	Lcd_Write(CS2,CMD,0xc0);
	for(i=184;i<192;i++)
	{
		for(j=0;j<64;j++)
			Lcd_Write(CS2,DATAS,0);
		Lcd_Write(CS2,CMD,i);
		Lcd_Write(CS2,CMD,130);
	}
}


void display_cs1(void)
 {
	unsigned int i;
	unsigned int j;
	Lcd_Write(CS1,CMD,0xc0);
	for(i=184;i<192;i++)
	{
		for(j=0;j<64;j++)
			Lcd_Write(CS1,DATAS,0);
		Lcd_Write(CS1,CMD,i);
		Lcd_Write(CS1,CMD,130);
	}
}


void display4(void)
 {
	int i=0,j;	
	for(;r23!=r25;r23--)
	{
		Lcd_Write(CS2,CMD,r24);
		Lcd_Write(CS2,CMD,r23);
		Lcd_Write(CS2,CMD,0xc0);     
		for(j=0;j<r22;j++)
			Lcd_Write(CS2,DATAS,lcddata[i++]);
	}
}

void display5(void)
{
	int i=0,j;	
	for(;r23!=r25;r23--)
	{
		Lcd_Write(CS1,CMD,r24);
		Lcd_Write(CS1,CMD,r23);
		Lcd_Write(CS1,CMD,0xc0);     
		for(j=0;j<r22;j++)
			Lcd_Write(CS1,DATAS,lcddata1[i++]);
	}  
}

void Disp_Sleep(unsigned int c)
{
	while(c--)
	Delay(10000);
}

#define DISP_SLEEP_TIMES  100

#define KEY_IODELAY() Delay(5)

Uint8 Scankey_InOut(Uint8 Row)
{
	Uint16 Temp;	
	KEY_IODELAY();
	Temp=GpioDataRegs->GPBDAT.all;
	KEY_IODELAY();
	Temp&=~(BIT9|BIT10|BIT6|BIT7);
	Temp|= ((Row&0x01)<<9)|((Row&0x02)<<(10-1))|((Row&0x04)<<(6-2))|((Row&0x08)<<(7-3));
	GpioDataRegs->GPBDAT.all=Temp;
	KEY_IODELAY();
	Temp=GpioDataRegs->GPFDAT.all&0x7fff;
	Temp|=P_cpld[0]&0x8000;
	//Temp|=0x8000;
	return (Uint8)((Temp&0x8000)? 1:0)|((Temp&BIT3)? 2:0)|((Temp&BIT6)? 4:0)|((Temp&BIT7)? 8:0);
}

Uint8 Key_Tab[4]={0xfe,0xfd,0xfb,0xf7};

Uint16 Scankey(void)
{
	Uint16 i,Key,Datas;
	if((Scankey_InOut(0)&0x0f)==0x0f)
		return 0;
	for(i=0;i<4;i++)
	{
		Key=Scankey_InOut(Key_Tab[i])&0x0f;
		if(Key==0x0f)
			continue;
		switch(Key)
		{
			case 0x0e: Datas=(i*4)+1;	break;
			case 0x0d: Datas=(i*4)+2;	break;
			case 0x0b: Datas=(i*4)+3;	break;
			case 0x07: Datas=(i*4)+4;	break;
			default:   Datas=0;
		}
		break;		
	}
	if(Key==0x0f)
		Datas=0;
	return Datas;
}


void Test_Key(void)
{
     Uint16 dbScanCode;
     EALLOW();
          
    GpioMuxRegs->GPAMUX.all=0x0000;   // Configure MUXs as digital I/Os or
    GpioMuxRegs->GPBMUX.all=0x0000;   // peripheral I/Os
    GpioMuxRegs->GPDMUX.all=0x0000;
    GpioMuxRegs->GPFMUX.all=0x0000;         
    GpioMuxRegs->GPEMUX.all=0x0000; 
    GpioMuxRegs->GPGMUX.all=0x0000;
                                        
    GpioMuxRegs->GPADIR.all=0x0000;   // GPIO PORTs  as output   // GPIO DIR select GPIOs as output 
    GpioMuxRegs->GPBDIR.all=0x0000|BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT8|BIT6|BIT7|BIT9|BIT10;
    GpioMuxRegs->GPDDIR.all=0x0000;
    GpioMuxRegs->GPEDIR.all=0x0000;        
    GpioMuxRegs->GPFDIR.all=0x0000|BIT0|BIT1|BIT2|BIT5|BIT4|BIT14; 
    GpioMuxRegs->GPGDIR.all=0x0000;

    GpioMuxRegs->GPAQUAL.all=0x0001;  // Set GPIO input qualifier values
    GpioMuxRegs->GPBQUAL.all=0x0001;   
    GpioMuxRegs->GPDQUAL.all=0x0001;
    GpioMuxRegs->GPEQUAL.all=0x0001;
 
    EDIS();	

	P_cpld[0]=0x17fc;

 //显示LCD页面
         r16=0x3e;   //关液晶
         //write_ins0();
         Lcd_Write(CS1,CMD,LCD_CMD_OFF);
         Lcd_Write(CS2,CMD,LCD_CMD_OFF);
         r16=0x3f;   //开液晶
         //write_ins0();
         //write_ins1();
         Delay(100); 
         
         Lcd_Write(CS1,CMD,LCD_CMD_ON);
         Lcd_Write(CS2,CMD,LCD_CMD_ON);
		 Delay(100);

         //Delay(100);
//l1:
         //r16=0x0c0;		//设置显示起始地址 =0
         //write_ins0();
         Lcd_Write(CS1,CMD,0xc0);
//long2:   
         //r16=0x0bf;		//设置 X=7
         //write_ins0();
         Lcd_Write(CS1,CMD,0xbf);
         //Delay(100);
         //r16=0x040;		//设置 Y=0
         //write_ins0();
         Lcd_Write(CS1,CMD,0x40);
         Delay(100);

         display_cs0();
         display_cs1(); 
                
         Delay(1000);
         
         
         //Test_Row_Out();
         
       while(1)
       {
	     Delay(10);
	     dbScanCode=Scankey();
	     if((dbScanCode<1)||(dbScanCode>0x10))
	     	continue;
	     switch(dbScanCode)
	     {               
	       
	        case 0x0001:
	   			memcpy(lcddata1,dig[1],16);		
	        break;
	        case 0x0002:
	   			memcpy(lcddata1,dig[2],16);		
	        break;
			case 0x0003:
	   			memcpy(lcddata1,dig[3],16);		
			break;
			case 0x0004:	//A:       
	   			memcpy(lcddata1,hza,16);		
	          	break;
			 case 0x0005:
	   			memcpy(lcddata1,dig[4],16);		
	        	break;
		
			case 0x0006:
	   			memcpy(lcddata1,dig[5],16);		
	        break;
	        case 0x0007: 
	   			memcpy(lcddata1,dig[6],16);		
			break;
			case 0x0008://B
	   			memcpy(lcddata1,hzb,16);		
			break;
			case 0x0009:
	   			memcpy(lcddata1,dig[7],16);		
			break;
			case 0x000a:
	   			memcpy(lcddata1,dig[8],16);		
		    break;
			case 0x000b: 
	   			memcpy(lcddata1,dig[9],16);		
			break;
			case 0x000c: //C
	   			memcpy(lcddata1,hzc,16);		
			break;
			case 0x000d://E
	   			memcpy(lcddata1,hze,16);		
			break;
			case 0x000e://0 
	   			memcpy(lcddata1,dig[0],16);		
			break;
			case 0x000f://F 
	   			memcpy(lcddata1,hzf,16);		
			break;
			case 0x0010: //D
	   			memcpy(lcddata1,hzd,16);		
			break;
	        }
         r22=0x08; 
         r23=0xbd; 
         r24=0x78; 
         r25=0xbb; 
         display5();    
       
       }

}




⌨️ 快捷键说明

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