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

📄 lcd.c

📁 TI公司的DSP(LF2407A)编写的有霍尔位置传感器的无刷直流电机控制程序,内含子程序说明
💻 C
字号:
/* ==============================================================================
System Name:  LCD

File Name:	LCD.C

Description:LCD初始化及显示所需参数的名称及单位等不变量.	

Originator:		刘平

Target dependency:	x2407
=====================================================================================
 History:
-------------------------------------------------------------------------------------
 7-19-2006  Release Rev 1.0
=================================================================================  */

#include <regs240x.h>

char table1[300]={ 
//变量字模库
0x00,0x81,0x81,0xFF,0x81,0x81,0x00,0x00,//I0
0x01,0x0F,0x30,0xC0,0x30,0x0F,0x01,0x00,//V1

0x00,0x82,0x82,0xFC,0x82,0x82,0x04,0x00,//r2
0x00,0x3C,0x4A,0x4A,0x4A,0x4A,0x2C,0x00,//e3
0x00,0x08,0x88,0xFE,0x89,0x89,0x03,0x00,//f4
0x00,0x01,0xFF,0x88,0x88,0x88,0x70,0x00,//b5

0x81,0xFF,0x81,0x81,0x81,0x42,0x3C,0x00,//D6

0x00,0x81,0xFF,0x91,0x11,0x11,0x0E,0x00,//p7
0x00,0x3E,0xC2,0x30,0x0E,0x30,0xC2,0x3E,//w8
0x00,0xFE,0x02,0x02,0xFE,0x02,0x02,0xFC,//m9

0x81,0xFF,0x89,0x08,0x08,0x89,0xFF,0x81,//H10
0x00,0x4C,0x92,0x92,0x92,0x92,0x64,0x00,//s11
0x00,0x08,0x08,0x7E,0x88,0x88,0x00,0x00,//t12

0x32,0x49,0x45,0x45,0x45,0x7E,0x40,0x00,//a13
0x00,0x81,0xFF,0x91,0x11,0x11,0x0E,0x00,//p14

}; 

char table2[]={ 
//数字字模库
0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,//0
0x00,0x00,0x00,0x82,0xFF,0x80,0x00,0x00,//1
0x00,0xC6,0xA1,0xA1,0x91,0x89,0xC6,0x00,//2
0x00,0x42,0x81,0x89,0x89,0x76,0x00,0x00,//3
0x00,0x30,0x28,0x24,0x22,0xFF,0x20,0x00,//4
0x00,0x4F,0x89,0x89,0x89,0x89,0x71,0x00,//5
0x00,0x7E,0x89,0x89,0x89,0x89,0x72,0x00,//6
0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,//7
0x00,0x76,0x89,0x89,0x89,0x89,0x76,0x00,//8
0x00,0x4E,0x91,0x91,0x91,0x91,0x7E,0x00,//9
};  

void LCDIOinit()
{
	MCRC=MCRC&0x0c3FF;		    	          	  // IOPF2,F3,F4,F5端口配置为一般的I/O功能
    PFDATDIR=(PFDATDIR|0x03c00)&0x0ff23;	    // IOPF2,F3,F4,F5端口配置为输出
    MCRA=MCRA&0x00c7;		    	              // 配置IOPA[3-5],IOPB[0-7]为一般I/O口功能
    PADATDIR=0x0FF00;       					  // IOPA[3-4]为输出,且全部为0 
}                   
    
//读液晶显示器的状态子程序,形参E代表处理的液晶的边(E1或E2边)     
void LCDSTA1(E)              
int E;
{
  int E1FLAG,i=0;
  PBDATDIR=PBDATDIR&0x0000;                    //IOPB口为输入
     if(E==1) 
     PADATDIR=0x0FF18;                         //E1=1
    else   PADATDIR=0x0FF20;                   //E2=1

	PFDATDIR=(PFDATDIR|0x0008)&0xfffb;                          //	LCD_RW = 1;
	                                           //	LCD_DI = 0;
	while(1)
	{		
		PFDATDIR=PFDATDIR|0x0010;			   //LCD_E = 1;
		for(i=0; i<2; i++){}
		PFDATDIR=PFDATDIR&0x0FFef;			   //LCD_E = 0;
		E1FLAG=PBDATDIR&0x0080;                // 读液晶状态
		if(E1FLAG==0x0000)break;			   //若液晶空闲,则停止等待
	}
}

//对液晶显示器发指令子程序,形参E代表处理的液晶的边(E1或E2)
void TRANS1(TRANS,E)   //该函数采用形参和实参的方式传递数值,TRANS为一个形参

int TRANS,E;
{  int i=0;
   LCDSTA1(E);							       //判断液晶是否为忙
   PBDATDIR=PBDATDIR|0x0FF00;				   //IOPB口为输出
   if(E==1)   PADATDIR=0x0FF18;                //E1=1,
    else   PADATDIR=0x0FF20;                   //E2=1,
   PFDATDIR=(PFDATDIR&0x0FFf3)|0x0010;                           //LCD_RW = 0;
	                                           //LCD_DI = 0;
                                               //LCD_E = 1;
   PBDATDIR=(PBDATDIR&0x0FF00)|TRANS;		   //需要写入的命令字送入数据线
	for(i=0; i<2; i++){}	
	PFDATDIR=PFDATDIR&0x0FFef; 				   //LCD_E = 0;
}

//对液晶显示器写数据子程序,注意在此子程序中列地址没有加1,需要用户在外对其进行操作,形参E代表处理的液晶的边(E1或E2)
void WRITE1(WRITE,Yaddress,E)			       //WRITE代表需要写入的数据,Yaddress代表需要的列地址
int WRITE,Yaddress,E;
{
int i=0;
TRANS1(Yaddress,E); 					        //设置列地址
LCDSTA1(E);				   		                //查询液晶是否空闲
PBDATDIR=PBDATDIR|0x0FF00;					    //IOPB口为输出
if(E==1)  PADATDIR=0x0FF18;					    //E1=1
 else  PADATDIR=0x0FF20; 					    //E1=0,E2=1
   PFDATDIR=(PFDATDIR|0x0014)&0x0fff7;// LCD_RW = 0;
					//LCD_DI = 1;
					//LCD_E = 1;
	PBDATDIR=(PBDATDIR&0x0FF00)|WRITE;		    //写入数据
	for(i=0; i<2; i++){}
	PFDATDIR=PFDATDIR&0x0FFef; 				    //LCD_E = 0;

}
//开E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISP1(E)
int E;
{
    int E1FLAG,i=0;
   while(1)
 {
  TRANS1(0x03F,E);				              	//送出控制字
  LCDSTA1(E);			                        //判断液晶是否为忙
  PBDATDIR=PBDATDIR&0x00ff;					    //IOPB口为输入
  if(E==1)   PADATDIR=0x0FF18;                  //E1=1
    else    PADATDIR=0x0FF20;     			    //E1=0,E2=1
   PFDATDIR=(PFDATDIR|0x0018)&0x0fffb;// LCD_RW = 1;
					//LCD_DI = 0;
					//LCD_E = 1;
	for(i=0; i<2; i++){}
	PFDATDIR=PFDATDIR&0x0ffef; 			     	//LCD_E = 0;
     E1FLAG=PBDATDIR&0x0020;				 	// 读液晶状态
      if(E1FLAG==0x0000) break;  		        //如果液晶被打开,则退出循环
  }
}

//E1边清屏子程序,形参E代表处理的液晶的边(E1或E2)
void CLEAR1(int E)
{
  int PAGENUM,Yaddress;		    				 //定义所需要的局部变量
   for (PAGENUM=0x0B8; PAGENUM<=0x0BF; PAGENUM++)
  {
      TRANS1(PAGENUM,E);              			//设置相应的页地址
     for(Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
     {
       WRITE1(0x00,Yaddress,E);			         //向相应的列送0以清屏
     }
  }
}

//关E1显示子程序,形参E代表处理的液晶的边(E1或E2)
void DISOFF1(int E)
{

    int E1FLAG,i=0;
   while(1)
 {
  TRANS1(0x3E,E);					            //送出控制字
  LCDSTA1(E);			                        //判断液晶是否为空闲
  PBDATDIR=PBDATDIR&0x00FF;				        //IOPB口为输入
  if(E==1)  PADATDIR=0x0FF18;           		//E1=1
    else    PADATDIR=0x0FF20;					//E1=0
   PFDATDIR=(PFDATDIR|0x0018)&0x0fffb;// LCD_RW = 1;
					//LCD_DI = 0;
					//LCD_E = 1;
	for(i=0; i<2; i++){}
	PFDATDIR=PFDATDIR&0x0FFef; 			    	//LCD_E = 0;
     E1FLAG=PBDATDIR&0x0020;				    // 读液晶状态
      if(E1FLAG==0x0020) break;  		        //如液晶关闭,则退出循环

  }
}


//LCD的E1初始化子程序,形参E代表处理的液晶的边(E1或E2)
void LCD1INIT(int E)
{
  DISOFF1(E);						              //关显示E1
  TRANS1(0x0A4,E);					              //不静态显示驱动
  TRANS1(0x0A9,E);					              //占空比为1/32
  TRANS1(0x0E2,E);					              //复位
  TRANS1(0x0A0,E);					              //ADC选择正常输出
  CLEAR1(E);						              //清屏
  DISP1(E);					    	              //开显示
  
}

//参数名和单位显示子程序,入口为存储字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数 
DISPLAY1(n,m,E,PAGADD,Yaddress)
int  n,PAGADD,Yaddress,E;	                 	 // 定义所需要的局部变量 
{
  int K;
  char TEMP;
  TRANS1(0x0C0,E);				                 // 从第0行开始显示 
  TRANS1(PAGADD,E);				                 // 送需要显示的页地址 
  n=n*m;
  for(K=0;K<m;K++,Yaddress++)
  {
    TEMP=table1[K+n];
    WRITE1(TEMP,Yaddress,E);	                 // 送需要显示的数据字节 
  }
}

//参数值显示子程序,入口为存储数字字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数 
DISPLAY2(n,m,E,PAGADD,Yaddress)
int  n,PAGADD,Yaddress,E;	                  	// 定义所需要的局部变量 
{
  int K;
  char TEMP;
  TRANS1(0x0C0,E);				                // 从第0行开始显示 
  TRANS1(PAGADD,E);				                // 送需要显示的页地址 
  n=n*m;
  for(K=0;K<m;K++,Yaddress++)
  {
    TEMP=table2[K+n];
    WRITE1(TEMP,Yaddress,E);	                // 送需要显示的数据字节 
  }
}
//LCD初始化程序
void LCD_INIT()
{
  	LCDIOinit();
    LCD1INIT(1);					             // LCD的E1边初始化 
    LCD1INIT(2);					             // LCD的E2边初始化 
    //com=PFDATDIR;
}

//LCD显示程序
void LCD_disp1()
{
	LCD_INIT();

//显示电流给定值Iref
	DISPLAY1(0,8,1,0xB8,0x40);//I
    DISPLAY1(2,8,1,0xB8,0x48);//r 
    DISPLAY1(3,8,1,0xB8,0x50);//e 
    DISPLAY1(4,8,1,0xB8,0x58);//f 
//显示电流反馈值Ifb
	DISPLAY1(0,8,2,0xB8,0x40);//I
    DISPLAY1(4,8,2,0xB8,0x48);//f
    DISPLAY1(5,8,2,0xB8,0x50);//b
//显示转速给定值Vref
	DISPLAY1(1,8,1,0xBa,0x40);//V
    DISPLAY1(2,8,1,0xBa,0x48);//r 
    DISPLAY1(3,8,1,0xBa,0x50);//e 
    DISPLAY1(4,8,1,0xBa,0x58);//f 
//显示电流反馈值Ifb
	DISPLAY1(1,8,2,0xBa,0x40);//V
    DISPLAY1(4,8,2,0xBa,0x48);//f
    DISPLAY1(5,8,2,0xBa,0x50);//b
//显示PWM频率fpwm
	DISPLAY1(4,8,1,0xBc,0x40);//f
	DISPLAY1(7,8,1,0xBc,0x48);//p
	DISPLAY1(8,8,1,0xBc,0x50);//w
	DISPLAY1(9,8,1,0xBc,0x58);//m
//显示PWM占空比Dpwm
	DISPLAY1(6,8,2,0xBc,0x40);//D
	DISPLAY1(7,8,2,0xBc,0x48);//p
	DISPLAY1(8,8,2,0xBc,0x50);//w
	DISPLAY1(9,8,2,0xBc,0x58);//m
//显示换向的状态,0~5中的一个.St
	DISPLAY1(10,8,1,0xBe,0x40);//H
	DISPLAY1(11,8,1,0xBe,0x48);//S
    DISPLAY1(12,8,1,0xBe,0x50);//t
//显示霍尔换向表,6个Hmap
	DISPLAY1(10,8,2,0xBe,0x40);//H
	DISPLAY1(9,8,2,0xBe,0x48);//m
    DISPLAY1(13,8,2,0xBe,0x50);//a
    DISPLAY1(14,8,2,0xBe,0x58);//p

}

⌨️ 快捷键说明

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