网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  TMS320LF2407与图形液晶显示模块接口及应用         ★★★ 【字体:
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]={0x0fc040x004fc0x0f80c0x000f00x0f080x0080f0x0070c0x00003}// "D"

const    int  char2[8]={0x03c180x044640x09cc40x000180x00e060x008080x00f080x0007}// "S"

const    int  char3[8]={0x0fc040x044fc0x07c440x000380x00f080x0080f0x000000x00000}// "P"

const    int  char4[16]={0x00c100x044040x0948c0x006350x004f40x004040x014040x0000c

     0x082020x042820x023420x00e120x00a030x022120x0c3420x00002}// ""

const    int  char5[16]={0x0fa020x002020x042ff0x050200x0434c0x0504c0x060200x00020

     0x031100x049110x07f890x05c420x04f400x058600x060470x00040}// ""

const    int  char6[16]={0x010100x0ffd00x010900x0fc000x0a4240x022240x062a30x00000

     0x003040x0ff000x021400x047180x013200x0160c0x060210x00020}// ""

//  屏蔽中断子程序        

void inline disable()

{

asm(" setc INTM")

}

// 系统初始化子程序

void  initial()

{

asm(" setc     SXM")            // 符号位扩展有效

asm(" clrc     OVM")            // 累加器中结果正常溢出

asm(" clrc     CNF")            // B0被配置为数据存储空间

*SCSR1=0x81FE              // CLKIN=6MCLKOUT=4*CLKIN=24M

*WDCR=0x0E8                // 不使能看门狗,因为SCSR2中的WDOVERRIDE

// WD保护位复的缺省值为1,故可以用软件禁止看门狗

*IMR=0X00                  // 中断禁止

*IFR=0x0FFFF               // 清除全部中断标志,"10"

*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代表处理的液晶的边(E1E2)

void LCDSTA1(E)

int  E

{

int  E1FLAG

*PBDATDIR=*PBDATDIR&0X00FF// IOPB口为输入口

while(1)

{

if(E==1)

*PADATDIR=(*PADATDIR|0X00A0)&0X0FFAF

// E1=1E2=0R/W=1A0=0,以便读晶的状态

else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F

// E1=0E2=1R/W=1A0=0,以便液晶的状态

E1FLAG=*PBDATDIR&0X0080

if(E1FLAG==0x0000)  break      // 若液晶空闲,则停止等待

}

}

// 对液晶显示器发指令子程序,形参E代表处理的液晶的边(E1E2)

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

int  TRANSE

{

LCDSTA1(E)                     // 判断液晶是否为忙

*PBDATDIR=*PBDATDIR|0XFF00 // IOPB口为输出口

if(E==1)  *PADATDIR=(*PADATDIR|0X0080)&0X0FF8F

// E1=1E2=0R/W=0A0=0,以便写入令字

else  *PADATDIR=(*PADATDIR|0X0040)&0X0FF4F

// E1=0E2=1R/W=0A0=0,以便入命令字     

*PBDATDIR=(*PBDATDIR&0X0FF00)|TRANS

// 需要写入的命令字送入数据线

if(E==1)  *PADATDIR=*PADATDIR&0X0FF7F    // E1=0,写入指令

else  *PADATDIR=*PADATDIR&0X0FFBF        // E2=0,写入指令

}

// 对液晶显示器写数据子程序,注意在此子程序里面列地址没有加1,需要用户在外

// 对其进行操作,形参E代表处理的液晶的边(E1E2)   

void WRITE1(WRITECLMADDE)         // WRITE代表需要写入的数据,CLMADD代表要的列地址

int  WRITECLMADDE

{

TRANS1(CLMADDE)          // 设置列地址

LCDSTA1(E)                     // 查询液晶是否为空闲

*PBDATDIR=*PBDATDIR|0XFF00 // IOPB口为输出口

if(E==1) *PADATDIR=(*PADATDIR|0X0090)&0X0FF9F

// E1=1E2=0R/W=0A0=1,以便写入要显示的数据

else  *PADATDIR=(*PADATDIR|0X0050)&0X0FF5F

// E1=0E2=1R/W=0A0=1,以便要显示的数据

*PBDATDIR=(*PBDATDIR&0X0FF00)|WRITE

// 需要写入的数据送入数据线

if(E==1)  *PADATDIR=*PADATDIR&0X0FF7F// E1=0,写入数据

else *PADATDIR=*PADATDIR&0X0FFBF        // E2=0,写入数据

}

// E1显示子程序,形参E代表处理的液晶的边(E1E2)

void DISP1(E)

int E

{

int  E1FLAG

while(1)

{

TRANS1(0X0AFE)          // 送出控制命令

LCDSTA1(E)                     // 判断液晶是否为空闲

*PBDATDIR=*PBDATDIR&0X00FF     // IOPB口为输入口

if(E==1) *PADATDIR=(*PADATDIR|0X00A0)&0X0FFAF

// E1=1E2=0R/W=1A0=0,以便读晶的状态

else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F

// E1=0E2=1R/W=1A0=0,以便液晶的状态

E1FLAG=*PBDATDIR&0X0020

if(E1FLAG==0)  break      // 如果液晶没被打开,则继续打开

}

}

// E1边清屏子程序,形参E代表处理的液晶的边(E1E2)

void CLEAR1( int  E)

{   

int  PAGEADDPAGENUMCLMADDCLMSUM// 定义所需要的局部变量

for(PAGENUM=0X04PAGEADD=0x0B8PAGENUM>0PAGENUM--PAGEADD++)

{

TRANS1(PAGEADDE)                      // 设置相应的页地址

     for(CLMSUM=0X00CLMSUM<0X3ECLMSUM++)

     {

LCDSTA1(E)                         // 判断液晶是否为空闲

WRITE1(0X00CLMSUME)            // 向相应的列送0以清屏

}

}

}

// E1显示子程序,形参E代表处理的液晶的边(E1E2)

void DISOFF1(int  E)

{

int  E1FLAG

while(1)  {

     TRANS1(0X0AEE)               // 发出控制命令

     LCDSTA1(E)                         // 判断液晶是否为空闲

*PBDATDIR=*PBDATDIR&0X00FF         // IOPB口为输入口

     if(E==1) *PADATDIR=(*PADATDIR|0X00A0)&0X0FFAF

// E1=1E2=0R/W=1A0=0,以便读晶的状态

else *PADATDIR=(*PADATDIR|0X0060)&0X0FF6F // E1=0E2=1R/W=1A0=0,以便

// 液晶的状态

E1FLAG=*PBDATDIR&0X0020

if(E1FLAG==1)      break       // 如果液晶没有被关闭,则继续关

}

}

// LCDE1边初始化子程序,形参E代表处理的液晶的边(E1E2)

void  LCD1INIT(int  E)

{

DISOFF1(E)                     // 关显示E1

TRANS1(0X0A4E)               // 静态显示驱动

TRANS1(0X0A9E)               // 占空比为1/32

TRANS1(0X0E2E)               // 复位

TRANS1(0X0A0E)               // ADC选择正常输出

CLEAR1(E)                      // 清屏

LCDSTA1(E)                     // 判断液晶是否为空闲

DISP1(E)                            // 开显示

}

// 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址

// 和选中的E1E2的边数

DISPLAY1(ARRAYEPAGADDCLMADD)

int  *ARRAYPAGADDCLMADDE // 定义所需要的局部变量

{

int KTEMP

TRANS1(0X0C0E)               // 从第0行开始显示

TRANS1(PAGADDE)              // 送需要显示的页地址

for(K=0K<8K++CLMADD++ARRAY++)

{

TEMP=*ARRAY&0X00FF

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

CLMADD++

TEMP=(*ARRAY&0X0FF00)>>8

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

}

CLMADD=CLMADD-16               // 恢复列地址

PAGADD=PAGADD+1                // 页地址加1

TRANS1(PAGADDE)

for(K<16K++CLMADD++ARRAY++)

{

TEMP=*ARRAY&0X00FF

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

CLMADD++

TEMP=(*ARRAY&0X0FF00)>>8

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

}

}

// 数字和字母显示子程序,入口为存储字母或数字库的数组的首地址,页地址和

// 始列地址和选中的E1E2的边数

DISPLAY2(ARRAYEPAGADDCLMADD)

int  *ARRAYPAGADDCLMADDE // 定义所需要的局部变量

{

int KTEMP

TRANS1(0X0C0E)           // 从第0行开始显示

TRANS1(PAGADDE)     // 送需要显示的页地址

for(K=0K<4K++CLMADD++ARRAY++)

{

TEMP=*ARRAY&0X00FF

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

CLMADD++

TEMP=(*ARRAY&0X0FF00)>>8

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

}

CLMADD=CLMADD-8            // 恢复列地址

PAGADD=PAGADD+1            // 页地址加1

TRANS1(PAGADDE)

for(K<8K++CLMADD++ARRAY++)

{

TEMP=*ARRAY&0X00FF

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

CLMADD++

TEMP=(*ARRAY&0X0FF00)>>8

WRITE1(TEMPCLMADDE)   // 送需要显示的数据字节

}

}

// 主程序

main()

{

initial()                           // 系统初始化

// 显示第一行"DSP  实验板"

LCD1INIT(1)                    // LCDE1边初始化

LCD1INIT(2)                    // LCDE2边初始化

DISPLAY2(char110x0BA00)  // 调用字母和数字显示子程序  

DISPLAY2(char210x0BA8)   // 调用字母和数字显示子程序

DISPLAY2(char310x0BA17)  // 调用字母和数字显示子程序

DISPLAY1(char420x0BA0)   // 调用汉字显示子程序

DISPLAY1(char520x0BA15)  // 调用汉字显示子程序

DISPLAY1(char620x0BA30)  // 调用汉字显示子程序

// 显示第行行"DSP  实验板"

DISPLAY2(char110x0B800)  // 调用字母和数字显示子程序  

DISPLAY2(char210x0B88)   // 调用字母和数字显示子程序

DISPLAY2(char310x0B817)  // 调用字母和数字显示子程序

DISPLAY1(char420x0B80)   // 调用汉字显示子程序

DISPLAY1(char520x0B815)  // 调用汉字显示子程序

DISPLAY1(char620x0B830)  // 调用汉字显示子程序

}

// 如若因干扰引起中断的误执行,则执行此中断服务程序

void interrupt nothing()

{

return

}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于DSP2407产生带死区的6个…
    DSP2407平台下用C语言实现的…
    利用DSP2407控制马达代码
    DSP2407控制320*240大液晶显…
    基于DSP240x的串行EEPROM的接…
    基于DSP240x的串行EEPROM的接…
    一个基于DSP2407串行通信接口…
    基于DSP240x PWM波形产生举例
    基于DSP2407 CAN控制器的程序…
    DSP2407头文件和命令文件示例…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号