![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| TMS320LF2407与图形液晶显示模块接口及应用 | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
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" const int char1[8]={0x0fc04,0x004fc,0x const int char2[8]={0x const int char3[8]={0x0fc04,0x044fc,0x const int char4[16]={0x 0x08202,0x04282,0x02342,0x00e12,0x const int char5[16]={0x0fa02,0x00202,0x042ff,0x05020,0x 0x03110,0x04911,0x const int char6[16]={0x01010,0x0ffd0,0x01090,0x0fc00,0x 0x00304,0x0ff00,0x02140,0x04718,0x01320,0x // 屏蔽中断子程序 void inline disable() { asm(" setc INTM"); } // 系统初始化子程序 void initial() { asm(" setc SXM"); // 符号位扩展有效 asm(" clrc OVM"); // 累加器中结果正常溢出 asm(" clrc CNF"); // B0被配置为数据存储空间 *SCSR1=0x81FE; // CLKIN= *WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE即 // WD保护位复的缺省值为1,故可以用软件禁止看门狗 *IMR=0X00; // 中断禁止 *IFR=0x0FFFF; // 清除全部中断标志,"写1清0" *MCRC=*MCRC&0X0FBFF; // IOPF2口为通用的IO口 *PFDATDIR=(*PFDATDIR|0X0400)&0XFFFB; // 不使能74HC273芯片 *MCRA=*MCRA&0X *PADATDIR=(*PADATDIR|0X // 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|0X // E1=1,E2=0,R/W=1,A0=0,以便读晶的状态 else *PADATDIR=(*PADATDIR|0X0060)&0X0FF // 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)&0X0FF // E1=1,E2=0,R/W=0,A0=0,以便写入令字 else *PADATDIR=(*PADATDIR|0X0040)&0X0FF // E1=0,E2=1,R/W=0,A0=0,以便入命令字 *PBDATDIR=(*PBDATDIR&0X0FF00)|TRANS; // 需要写入的命令字送入数据线 if(E==1) *PADATDIR=*PADATDIR&0X0FF 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)&0X0FF // E1=1,E2=0,R/W=0,A0=1,以便写入要显示的数据 else *PADATDIR=(*PADATDIR|0X0050)&0X0FF // E1=0,E2=1,R/W=0,A0=1,以便要显示的数据 *PBDATDIR=(*PBDATDIR&0X0FF00)|WRITE; // 需要写入的数据送入数据线 if(E==1) *PADATDIR=*PADATDIR&0X0FF 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|0X // E1=1,E2=0,R/W=1,A0=0,以便读晶的状态 else *PADATDIR=(*PADATDIR|0X0060)&0X0FF // 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|0X // E1=1,E2=0,R/W=1,A0=0,以便读晶的状态 else *PADATDIR=(*PADATDIR|0X0060)&0X0FF // 液晶的状态 E1FLAG=*PBDATDIR&0X0020; if(E1FLAG==1) break; // 如果液晶没有被关闭,则继续关 } } // LCD的E1边初始化子程序,形参E代表处理的液晶的边(E1或E2边) void LCD1INIT(int E) { DISOFF1(E); // 关显示E1 TRANS1(0X TRANS1(0X TRANS1(0X0E2,E); // 复位 TRANS1(0X CLEAR1(E); // 清屏 LCDSTA1(E); // 判断液晶是否为空闲 DISP1(E); // 开显示 } // 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址 // 和选中的E1或E2的边数 DISPLAY1(ARRAY,E,PAGADD,CLMADD) int *ARRAY,PAGADD,CLMADD,E; // 定义所需要的局部变量 { int K,TEMP; TRANS1(0X 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(0X 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; } |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|