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

📄 main.c

📁 基于ADS1.2+HJTAG+LPC2119的CAN总线调试程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                 Zhejiang University
**                          Institute of Industry Process Control 
**                                   WJW's Studio!
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2007-08-07
** Last Version:		1.0
** Descriptions:		The main() function
**------------------------------------------------------------------------------------------------------
** Modified by:         Jianwei Wang   
** Modified date:       2007-08-17
** Version:             1.0
** Descriptions:       CAN test
**------------------------------------------------------------------------------------------------------
**/

#include "config.h"
#include "string.h"

#define  LCDRS  (1 << 22)	// P1.24控制LCD使能(下降沿使能),P1.25控制LCD背光开关(未使用)
#define  LCDRW  (1 << 21)   // P1.16~P1.23为八位数据,且P1.16为低位
#define  LCDEN  (1 << 24)   // P0.22控制LCD寄存器(0指令,1数据),P0.21控制LCD读写(0写,1读)
#define  LCDOFF (1 << 25)
#define  LCD8   (0xFF << 16)

#define  KEY1   (1 << 16)   // P0.16~P0.20五个按键,低电平为有键按下,P0.16为Key1
#define  KEY2   (1 << 17)  
#define  KEY3   (1 << 18)  
#define  KEY4   (1 << 19)  
#define  KEY5   (1 << 20)  
#define  KEY    KEY1|KEY2|KEY3|KEY4|KEY5

uint32   CAN_Bps=(0<<23)|(1<<20)|(3<<16)|(0<<14)|3; //CAN通信波特率
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly	延时参数,值越大,延时越久。i<500,约为50us。
** 出口参数 :无          
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<500; i++);
}

/////////////////////////////////////////
uchar scankey(void) //扫描键值
{                  
	uint32 c,d;
	d=KEY;
	c=IO0PIN & d;
	if(c==0x1F0000)// 都为高,无键按下
		return 0;
		
		///否则有键按下

	switch(c)
	{
		case 0xF0000:
			return 5; 
		case 0x170000:
			return 4;
		case 0x1B0000:
			return 3;
		case 0x1D0000:   
			return 2;
		case 0x1E0000:   
			return 1;	
		default: 
			return 0;
	}
}

//////////////////////////////////////////
uchar getkey(void)//取健值
{	
	uchar key_num=0;
	if((key_num=scankey())==0)
		return 0;
	DelayNS(400);//20ms
	if((key_num=scankey())==0)
		return 0;
	while(scankey()!=0);//等待健放开
	return key_num;		
}

///////////////////////////////////////////////
void lcd_sendCmd(uchar cmd)
{   
    uint32 cmd32=0x00FF0000;
    IO1CLR=cmd32;
    cmd32=cmd;
    cmd32=(cmd32<<16);
    
    IO0CLR=LCDRS;
	IO0CLR=LCDRW;
	IO1SET=LCDEN; 
	IO1SET=cmd32;
	DelayNS(40);//2ms Delay
	IO1CLR=LCDEN;
	IO0SET=LCDRW;
	
}

//////////////////////////////////////////////////
void lcd_sendData(uchar dt)
{	
    uint32 dt32=0x00FF0000;
    IO1CLR=dt32;
    dt32=dt;
    dt32=(dt32<<16);   

	IO0SET=LCDRS;
	IO0CLR=LCDRW;
	IO1SET=LCDEN;
	IO1SET=dt32;
	DelayNS(1);//50us Delay
	IO1CLR=LCDEN;
	IO0SET=LCDRW;
}



void lcd_init(void)
{	
    lcd_sendCmd(0x01);//clear
	lcd_sendCmd(0x02);//cursor return home
	lcd_sendCmd(0x38);//0011 1000 function set:8bits 2 lines 5*7dots
	lcd_sendCmd(0x06);//0000 0110 entry mode set:cursor increment,display no shift
	lcd_sendCmd(0x0f);//0000 1100 display cotrol:display/cursor(NO) both on,cur NOT blink
}

//////////////////////////////////////////////////////////
void lcd_disp(char *str,uint8 line)
{	
	uint8 i=0x0;

	if(!line)
	{
		lcd_sendCmd(0x80);
		while(*str!='\0'&&(i++)<16)
			lcd_sendData(*(str++));
		while((i++)<16)
			lcd_sendData(' ');
	}
	else
	{
		lcd_sendCmd(0xc0);
		while(*str!='\0'&&(i++)<16)
			lcd_sendData(*(str++));
		while((i++)<16)
			lcd_sendData(' ');
	 }
}


////////////////////////////////////////////////
void lcd_dispCursor(uchar x,uchar y)
{
	lcd_sendCmd((x==0)?(0x80+y):(0xc0+y));
}

////////////////////////////////////////////////
void showmessage(char *str)
{                      //动态显示字符,可显示n个字符,一般用于开机画面或想炫一把地显示时才用
	uchar i,j;
	char tempstr[16]="                ";	
	lcd_disp(" Welcome to IIPC",1);
	for(i=0;i<15;i++)
	{
		for(j=0;j<i;j++)
		{
			tempstr[15-i+1+j]=str[j];
		}
		lcd_disp(tempstr,0);
		for(j=0;j<7;j++)
		{
			if(getkey()!=0)
			    return;
			DelayNS(400);//2ms*10
		}
	}
	
	i=strlen(str);
	
	for(i=0;i<strlen(str)-2;i++)
	{
		lcd_disp(&(str[i]),0);
		for(j=0;j<7;j++)
		{
			if(getkey()!=0)
				return;
			DelayNS(400);
		}
	}
	
}
void CAN2Init(void)
{ 
    PINSEL1 = PINSEL1&(~((uint32)0x0F<<14));    
    PINSEL1 = PINSEL1|((uint32)0x05<<14); 
    CAN2MOD = CAN2MOD|0x01; //复位CAN2控制器
    CAN2BTR = CAN_Bps;      //时序方式,即波特率 
    CAN2EWL = 0x60;         //错误警告阈值
    CAN2IER = 0x00;         //设置中断
    CAN2MOD = CAN2MOD|0x04;
    CAN2MOD = CAN2MOD&0x0FE;//使能CAN2控制器
}


/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :Uart1试验。
** 调试说明 :
*********************************************************************************************************
*/
int main (void)
{   
    uint32 TFI=(0<<31|0<<30|8<<16|0x00);//8字节数据帧,11位标识符
    uint32 TDA1=0x44332211;
    uint32 TDB1=0x88776655;
main2:
    PINSEL0 = 0x00000000;	
    PINSEL1 = 0x00000000;		// 设置管脚P0[16:31]连接GPIO
	PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIO
	IO1DIR = LCD8|LCDEN|LCDOFF; // 设置控制口为输出
	IO0DIR = LCDRS|LCDRW;	   
    IO1CLR = LCDEN;    
    
    lcd_init();
    CAN2Init();
    
    CAN2TFI1 = TFI;     //8字节数据帧,11位标识符
    CAN2TID1 = 0xAA;           //帧ID  
    CAN2TDA1 = TDA1;           //前4字节数据  
    CAN2TDB1 = TDB1;           //后4字节数据
    CAN2CMR  = (1<<5)|3;             //选择缓冲1并发送 
    
    goto main2;
    while(1);
/*
Start:  
  	                            for(;;)
								{   										 
									lcd_disp(Uart1Buf,0);
									lcd_disp(Uart1Screen[0],1);
									while((key_num=getkey())==0){
									    if (Rec_new==0)
									      Uart1Buf[15]='s';
									    else     
										  Uart1Buf[15]='!';
										lcd_disp(Uart1Buf,0);  
										}
									switch(key_num)
									{	
										case 1:
										    Uart1Buf[9]=0x7E;
										    lcd_disp(Uart1Buf,0); 
					                        UART1_SendStr(SendBuf);
					                        DelayNS(4000);
					                        Uart1Buf[9]=0x20;
										    lcd_disp(Uart1Buf,0); 
									    	break;
										case 2: SetUart1();											
											break;
										case 4: 
										    lcd_disp2(RecBuf,0); 
										    lcd_disp("AnyKey to Return",1);
										    Rec_new =0;
										    while((key_num=getkey())==0){;}//任意键退出										       
										    break; 										
										case 3: goto U_break;
										    
										default: break;
									}
								}
								
U_break:
        goto Start;*/
    return 0;

}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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