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

📄 tms320lf2407与图形液晶显示模块接口及应用.txt

📁 TMS320LF2407与图形液晶显示模块接口及应用
💻 TXT
字号:
源程序代码:
(1)	所需的复位和中断向量定义文件“vectors.asm”
	.title		 	"vectors.asm"
	.ref		 	_c_int0,_nothing
	.sect		 	".vectors"
reset:	  	b	  	_c_int0
int1:	  	b	  	_nothing	
int2:      	b 	 	_nothing
int3:		b	 	_nothing
int4:		b	 	_nothing
int5:		b   		_nothing
int6:		b	 	_nothing
(2)主程序
// 该程序利用C语言实现液晶的显示,字库以字的形式存储.该程序执行后,实验板上的液
*晶片上显示两行相同的"DSP  实验板"字母和汉字字样液晶要求每次送一个字节的
*(8位)数据,而为了节约存储空间,液晶的显示字库在DSP中以字(16位)的形式存储,但在
*下面的程序中可以通过巧妙简单的方法解决这个问题,详细方法见程序 
#include  "register.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被配置为数据存储空间 
*SCSR1=0x81FE;			// CLKIN=6M,CLKOUT=4*CLKIN=24M 
*WDCR=0x0E8;				// 不使能看门狗,因为SCSR2中的WDOVERRIDE即
// WD保护位复的缺省值为1,故可以用软件禁止看门狗 
*IMR=0X00;				// 中断禁止 
*IFR=0x0FFFF;				// 清除全部中断标志,"写1清0" 
*MCRC=*MCRC&0X0FBFF;	// IOPF2口为通用的IO口 
*PFDATDIR=(*PFDATDIR|0X0400)&0XFFFB;	// 不使能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|0XFF00;	// 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=0,写入指令 
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|0XFF00;	// 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=0,写入数据 
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==0)  break;		// 如果液晶没被打开,则继续打开 
}
}
// E1边清屏子程序,形参E代表处理的液晶的边(E1或E2边) 
void	CLEAR1( int  E)
{	
int	PAGEADD,PAGENUM,CLMADD,CLMSUM;// 定义所需要的局部变量 
for(PAGENUM=0X04,PAGEADD=0x0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
{
TRANS1(PAGEADD,E);					// 设置相应的页地址 
	for(CLMSUM=0X00;CLMSUM<0X3E;CLMSUM++)
	{
LCDSTA1(E);						// 判断液晶是否为空闲 
WRITE1(0X00,CLMSUM,E);			// 向相应的列送0以清屏 
}
}
}
// 关 E1显示子程序,形参E代表处理的液晶的边(E1或E2边) 
void	DISOFF1(int  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==1)		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();						// 系统初始化 
// 显示第一行"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);	// 调用汉字显示子程序 
// 显示第行行"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 + -