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

📄 lcd.c

📁 2407DSP开发应用程序实例(有14个常用模块程序)
💻 C
字号:
//(2)主程序
//该程序利用C语言实现液晶的显示,字库以字的形式存储.该程序执行后,实验板上的液晶
//片上显示两行相同的"DSP 实验板"字母和汉字的字样液晶要求每次送一个字节(8位)
//的数据;为了节约存储空间液晶的显示字库在DSP中以字(16位)形式存储,但在   
//下面的程序中可以通过巧妙.简单的方法解决这个问题,详细的方法风程序
#include "f2407_c.h"

const   int  char1[8]={0x0fc04,0x004fc,0x0f80c,0x000f0,0x0f08,0x0080f,0x0070c,0x00003};  //"D"
const   int  char2[8]={0x03c18,0x04464,0x09cc4,0x00018,0x00e06,0x00808,0x00f08,0x0007};  //"S"
const   int  char3[8]={0x0fc04,0x044fc,0x07c44,0x00038,0x00f08,0x0080f,0x00000,0x00000}; //"P"
const	int	 char4[16]={0x00c10,0x04404,0x0948c,0x00635,0x004f4,0x00404,0x01404,0x0000c,
		     0x08202,0x04282,0x02342,0x00e12,0x00a03,0x02212,0x0c342,0x00002};           // "实" 
const	int	 char5[16]={0x0fa02,0x00202,0x042ff,0x05020,0x0434c,0x0504c,0x06020,0x00020,
		     0x03110,0x04911,0x07f89,0x05c42,0x04f40,0x05860,0x06047,0x00040};           // "验" 
const	int	 char6[16]={0x01010,0x0ffd0,0x01090,0x0fc00,0x0a424,0x02224,0x062a3,0x00000,
		     0x00304,0x0ff00,0x02140,0x04718,0x01320,0x0160c,0x06021,0x00020};           // "板"



//屏蔽中断子程序
void inline disable()
{
   asm(" setc INTM");
}

//系统初始化子程序
void initial()
{
    asm(" setc	SXM");				              // 抑制符号位扩展
	asm(" clrc	OVM");					          // 累加器中结果正常溢出
	asm(" clrc	CNF");					          // B0被配置为数据存储空间
	asm(" setc	INTM");					          // 禁止所有中断
	*SCSR1=0x81FE;					              // CLKIN=6M,CLKOUT=4*CLKIN=24M
	*WDCR=0x0E8;					              // 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     						              // 即WDC位复位后的缺省值,故可以用
		      						              // 软件禁止看门狗
	*IMR=0x0000;						          // 禁止所有中断
	*IFR=0x0FFFF;					              // 清除全部中断标志,"写1清0"
	*MCRC=*MCRC&0x0FBFF;		    	          // IOPF2端口配置为一般的I/O功能
    *PFDATDIR=(*PFDATDIR|0x0400)&0x0FFFB;	      //不使能74HC273芯片
    *MCRA=*MCRA&0x000F;		    	              // 配置IOPA[4-7,IOPB[0-7]为一般I/O口功能
    *PADATDIR=(*PADATDIR|0x0F000)&0x0FF0F;        // IOPA[4-7]为输出,且全部为0 
    disable();      				              // 总中断禁止

    
}                   
    
//读液晶显示器的状态子程序,形参E代表处理的液晶的边(E1或E2边)     
void LCDSTA1(E)              
int E;
{
  int E1FLAG;
  *PBDATDIR=*PBDATDIR&0x00FF;                     //IOPB口为输入
  while(1)
  {
     if(E=1) 
     *PADATDIR=(*PADATDIR|0x00A0)&0X0FFAF;        //E1=1,E2=0,R/W=1,A0=0,以便读液晶的状态
    else   *PADATDIR=(*PADATDIR|0x0060)&0X0FF6F;  //E1=0,E2=1,R/W=1,A0=0,以便读液晶的状态
     E1FLAG=*PBDATDIR&0X0080;
     if(E1FLAG==0X0000) break;  			      //若液晶空闲,则停止等待
 }
  
}

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

int TRANS,E;
{
   LCDSTA1(E);							          //判断液晶是否为忙
*PBDATDIR=*PBDATDIR|0X0FF00;					  //IOPB口为输出
 if(E==1)  *PADATDIR=(*PADATDIR|0X0080)&0X0FF8F;  //E1=1,E2=0,R/W=0,A0=0,以便写入命令字
 else  *PADATDIR=(*PADATDIR|0X0040)&0X0FF4F;	  //E1=0,E2=1,R/W=0,A0=0,以便写入命令字
*PBDATDIR=(*PBDATDIR|0X0FF00)|TRANS;		      //需要写入的命令字送入数据线
if(E==1)  *PADATDIR=*PADATDIR&0X0FF7F;		      //E1=1写入指字
else *PADATDIR=*PADATDIR&0X0FFBF;		          //E2=0,写入指字

}

//对液晶显示器写数据子程序,注意在此子程序中列地址没有加1,需要用户在外对其进行操作,形参E代表处理的液晶的边(E1或E2)
void WRITE1(WRITE,CLMADD,E)			              //WRITE代表需要写入的数据,CLMADD代表需要的列地址
int WRITE,CLMADD,E;
{
TRANS1(CLMADD,E); 					              //设置列地址
LCDSTA1(E);				   		                  //查询液晶是否空闲
*PBDATDIR=*PBDATDIR|0X0FF00;					  //IOPB口为输出
if(E==1)  *PADATDIR=(*PADATDIR|0X0090)&0X0FF9F;	  //E1=1,E2=0,R/W=0,A0=1,以便写入要显示的数据
 else  *PADATDIR=(*PADATDIR|0X0050)&0X0FF5F;	  //E1=0,E2=1,R/W=0,A0=1,以便写入要显示的数据
*PBDATDIR=(*PBDATDIR|0X0FF00)|WRITE;		      //需要写入的数据送入数据线
if(E==1)  *PADATDIR=*PADATDIR&0X0FF7F;	          //E1=1写入数据
else *PADATDIR=*PADATDIR&0X0FFBF;		          //E2=0,写入数据

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

    int E1FLAG;
   while(1)
 {
  TRANS1(0X0AF,E);				              	  //送出控制字
  LCDSTA1(E);			                          //判断液晶是否为忙
  *PBDATDIR=*PBDATDIR|0X00FF;					  //IOPB口为输入
  if(E=1)  *PADATDIR=(*PADATDIR|0x00A0)&0X0FFAF;  //E1=1,E2=0,R/W=1,A0=0,以便读液晶的状态
    else   *PADATDIR=(*PADATDIR|0x0060)&0X0FF6F;  //E1=0,E2=1,R/W=1,A0=0,以便读液晶的状态
     E1FLAG=*PBDATDIR&0X0020;
     if(E1FLAG==0X0000) break;  			      //若液晶没有打开,则继续打开

  }
}

//E1边清屏子程序,形参E代表处理的液晶的边(E1或E2)
void CLEAR1(int E)
{
  int PAGADD,PAGENUM,CLMADD,CLMSUM;		     //定义所需要的局部变量
  for(PAGENUM=0X40,PAGADD=0X0B8;PAGENUM>0;PAGENUM--,PAGADD++)
  {
    TRANS1(PAGADD,E);			                 //设置相应的页地址
     for(CLMSUM=0X00;CLMSUM<0X3E;CLMSUM++)
     {
       LCDSTA1(E); 				                 //查询液晶是否空闲
       WRITE1(0X00,CLMSUM,E);			         //向相应的列送0以清屏
     }
  }
}

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

    int E1FLAG;
   while(1)
 {
  TRANS1(0X0AE,E);					              //送出控制字
  LCDSTA1(E);			                          //判断液晶是否为空闲
  *PBDATDIR=*PBDATDIR|0X00FF;				      //IOPB口为输入
  if(E=1)  *PADATDIR=(*PADATDIR|0x00A0)&0X0FFAF;  //E1=1,E2=0,R/W=1,A0=0,以便读液晶的状态
    else   *PADATDIR=(*PADATDIR|0x0060)&0X0FF6F;  //E1=0,E2=1,R/W=1,A0=0,以便读液晶的状态
     E1FLAG=*PBDATDIR&0X0020;
     if(E1FLAG==0X0000) 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);						              //清屏
  LCDSTA1(E);						              //判断液晶是否为空闲
  DISP1(E);					    	              //开显示
  
}

// 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址
// 和选中的E1或E2的边数 
DISPLAY1(ARRAY,E,PAGADD,CLMADD)
int  *ARRAY,PAGADD,CLMADD,E;	                  // 定义所需要的局部变量 
{
  int K,TEMP;
  TRANS1(0X0C0,E);				                  // 从第0行开始显示 
  TRANS1(PAGADD,E);				                  // 送需要显示的页地址 
  for(K=0;K<8;K++,CLMADD++,ARRAY++)
  {
    TEMP=*ARRAY&0X00FF;
    WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
    CLMADD++;
    TEMP=(*ARRAY&0X0FF00)>>8;
    WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
  }
  CLMADD=CLMADD-16;				                  // 恢复列地址 
  PAGADD=PAGADD+1;				                  // 页地址加1 
  TRANS1(PAGADD,E);
  for(;K<16;K++,CLMADD++,ARRAY++)
  {
    TEMP=*ARRAY&0X00FF;
    WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
    CLMADD++;
    TEMP=(*ARRAY&0X0FF00)>>8;
    WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
  }
}
// 数字和字母显示子程序,入口为存储字母或数字库的数组的首地址,页地址和
// 始列地址和选中的E1或E2的边数 
DISPLAY2(ARRAY,E,PAGADD,CLMADD)
int  *ARRAY,PAGADD,CLMADD,E;	                  // 定义所需要的局部变量 
{
  int K,TEMP;
  TRANS1(0X0C0,E);			                      // 从第0行开始显示 
  TRANS1(PAGADD,E);		                          // 送需要显示的页地址 
  for(K=0;K<4;K++,CLMADD++,ARRAY++)
  {
      TEMP=*ARRAY&0X00FF;
      WRITE1(TEMP,CLMADD,E);	                  // 送需要显示的数据字节 
      CLMADD++;
      TEMP=(*ARRAY&0X0FF00)>>8;
      WRITE1(TEMP,CLMADD,E);	                  // 送需要显示的数据字节 
  }
  CLMADD=CLMADD-8;			                      // 恢复列地址 
  PAGADD=PAGADD+1;			                      // 页地址加1 
  TRANS1(PAGADD,E);
  for(;K<8;K++,CLMADD++,ARRAY++)
  {
     TEMP=*ARRAY&0X00FF;
     WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
     CLMADD++;
     TEMP=(*ARRAY&0X0FF00)>>8;
     WRITE1(TEMP,CLMADD,E);	                      // 送需要显示的数据字节 
  }
}
// 主程序 
main()
{
  initial();						              // 系统初始化 
// 显示第1行"DSP  实验板" 
  LCD1INIT(1);					                  // LCD的E1边初始化 
  LCD1INIT(2);					                  // LCD的E2边初始化 
  DISPLAY2(char1,1,0x0BA,00);	                  // 调用字母和数字显示子程序   
  DISPLAY2(char2,1,0x0BA,8);	                  // 调用字母和数字显示子程序 
  DISPLAY2(char3,1,0x0BA,17);	                  // 调用字母和数字显示子程序 
  DISPLAY1(char4,2,0x0BA,0);	                  // 调用汉字显示子程序 
  DISPLAY1(char5,2,0x0BA,15);	                  // 调用汉字显示子程序 
  DISPLAY1(char6,2,0x0BA,30);	                  // 调用汉字显示子程序 
// 显示第2行"DSP  实验板" 
  DISPLAY2(char1,1,0x0B8,00);	                  // 调用字母和数字显示子程序   
  DISPLAY2(char2,1,0x0B8,8);	                  // 调用字母和数字显示子程序 
  DISPLAY2(char3,1,0x0B8,17);	                  // 调用字母和数字显示子程序 
  DISPLAY1(char4,2,0x0B8,0); 	                  // 调用汉字显示子程序 
  DISPLAY1(char5,2,0x0B8,15);	                  // 调用汉字显示子程序 
  DISPLAY1(char6,2,0x0B8,30);	                  // 调用汉字显示子程序 
}
// 如若因干扰引起中断的误执行,则执行此中断服务程序
void interrupt nothing()
{
  return;
}






























⌨️ 快捷键说明

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