📄 main.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 + -