TMS320LF2407与图形液晶显示模块接口及应用

来源:本站
导读:目前正在解读《TMS320LF2407与图形液晶显示模块接口及应用》的相关信息,《TMS320LF2407与图形液晶显示模块接口及应用》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《TMS320LF2407与图形液晶显示模块接口及应用》的详细说明。
简介:TMS320LF2407与图形液晶显示模块接口及应用

TMS320LF2407与图形液晶显示模块接口及应用

源程序代码:

(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"

constintchar1[8]={0x0fc04,0x004fc,0x0f80c,0x000f0,0x0f08,0x0080f,0x0070c,0x00003};// "D"

constintchar2[8]={0x03c18,0x04464,0x09cc4,0x00018,0x00e06,0x00808,0x00f08,0x0007};// "S"

constintchar3[8]={0x0fc04,0x044fc,0x07c44,0x00038,0x00f08,0x0080f,0x00000,0x00000};// "P"

constintchar4[16]={0x00c10,0x04404,0x0948c,0x00635,0x004f4,0x00404,0x01404,0x0000c,

0x08202,0x04282,0x02342,0x00e12,0x00a03,0x02212,0x0c342,0x00002};// "实"

constintchar5[16]={0x0fa02,0x00202,0x042ff,0x05020,0x0434c,0x0504c,0x06020,0x00020,

0x03110,0x04911,0x07f89,0x05c42,0x04f40,0x05860,0x06047,0x00040};// "验"

constintchar6[16]={0x01010,0x0ffd0,0x01090,0x0fc00,0x0a424,0x02224,0x062a3,0x00000,

0x00304,0x0ff00,0x02140,0x04718,0x01320,0x0160c,0x06021,0x00020};// "板"

//屏蔽中断子程序

void inline disable()

{

asm(" setc INTM");

}

//系统初始化子程序

voidinitial()

{

asm(" setcSXM");//符号位扩展有效

asm(" clrcOVM");//累加器中结果正常溢出

asm(" clrcCNF");// 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边)

voidLCDSTA1(E)

intE;

{

intE1FLAG;

*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边)

voidTRANS1(TRANS,E)//该函数采用形参和实参的方式传递数值,TRANS为一个形参

intTRANS,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边)

voidWRITE1(WRITE,CLMADD,E)// WRITE代表需要写入的数据,CLMADD代表要的列地址

intWRITE,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边)

voidDISP1(E)

intE;

{

intE1FLAG;

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边)

voidCLEAR1( intE)

{

intPAGEADD,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边)

voidDISOFF1(intE)

{

intE1FLAG;

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边)

voidLCD1INIT(intE)

{

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;

}

提醒:《TMS320LF2407与图形液晶显示模块接口及应用》最后刷新时间 2024-03-14 01:21:26,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《TMS320LF2407与图形液晶显示模块接口及应用》该内容的真实性请自行鉴别。