📄 lcd.asm
字号:
*******************************************************
* TMS320C24xx ANSI C Codegen Version 7.04
*******************************************************
; dspac -i../src -v2xx -iD:/CCStudio_v3.1/c2400/cgtools/include lcd.c C:\DOCUME~1\liuping\LOCALS~1\Temp\lcd.if
; dspopt NOT RUN
; dspcg -o -v2xx -o C:\DOCUME~1\liuping\LOCALS~1\Temp\lcd.if C:\DOCUME~1\liuping\LOCALS~1\Temp\lcd.asm C:\DOCUME~1\liuping\LOCALS~1\Temp\lcd.tmp
.port
.bss _table2,80,1
.bss _table1,300
.file "lcd.c"
.file "../src\regs240x.h"
.globl _portffff
.globl _portff0f
.globl _port0
.globl _port1
.globl _port2
.globl _port3
.globl _port4
.file "lcd.c"
.sect ".cinit"
.word IS1,_table1
.word 0
.word 129
.word 129
.word 255
.word 129
.word 129
.word 0
.word 0
.word 1
.word 15
.word 48
.word 192
.word 48
.word 15
.word 1
.word 0
.word 0
.word 130
.word 130
.word 252
.word 130
.word 130
.word 4
.word 0
.word 0
.word 60
.word 74
.word 74
.word 74
.word 74
.word 44
.word 0
.word 0
.word 8
.word 136
.word 254
.word 137
.word 137
.word 3
.word 0
.word 0
.word 1
.word 255
.word 136
.word 136
.word 136
.word 112
.word 0
.word 129
.word 255
.word 129
.word 129
.word 129
.word 66
.word 60
.word 0
.word 0
.word 129
.word 255
.word 145
.word 17
.word 17
.word 14
.word 0
.word 0
.word 62
.word 194
.word 48
.word 14
.word 48
.word 194
.word 62
.word 0
.word 254
.word 2
.word 2
.word 254
.word 2
.word 2
.word 252
.word 129
.word 255
.word 137
.word 8
.word 8
.word 137
.word 255
.word 129
.word 0
.word 76
.word 146
.word 146
.word 146
.word 146
.word 100
.word 0
.word 0
.word 8
.word 8
.word 126
.word 136
.word 136
.word 0
.word 0
.word 50
.word 73
.word 69
.word 69
.word 69
.word 126
.word 64
.word 0
.word 0
.word 129
.word 255
.word 145
.word 17
.word 17
.word 14
.word 0
IS1 .set 120
.sym _table1,_table1,50,2,4800,,300
.globl _table1
.word IS2,_table2
.word 0
.word 0
.word 124
.word 130
.word 130
.word 130
.word 124
.word 0
.word 0
.word 0
.word 0
.word 130
.word 255
.word 128
.word 0
.word 0
.word 0
.word 198
.word 161
.word 161
.word 145
.word 137
.word 198
.word 0
.word 0
.word 66
.word 129
.word 137
.word 137
.word 118
.word 0
.word 0
.word 0
.word 48
.word 40
.word 36
.word 34
.word 255
.word 32
.word 0
.word 0
.word 79
.word 137
.word 137
.word 137
.word 137
.word 113
.word 0
.word 0
.word 126
.word 137
.word 137
.word 137
.word 137
.word 114
.word 0
.word 0
.word 1
.word 1
.word 1
.word 1
.word 1
.word 255
.word 0
.word 0
.word 118
.word 137
.word 137
.word 137
.word 137
.word 118
.word 0
.word 0
.word 78
.word 145
.word 145
.word 145
.word 145
.word 126
.word 0
IS2 .set 80
.sym _table2,_table2,50,2,1280,,80
.globl _table2
.text
.sym _LCDIOinit,_LCDIOinit,32,2,0
.globl _LCDIOinit
.func 58
;>>>> void LCDIOinit()
******************************************************
* FUNCTION DEF : _LCDIOinit
******************************************************
_LCDIOinit:
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,1
LAR AR0,*0+,AR3
.line 3
;>>>> MCRC=MCRC&0x0c3FF; // IOPF2,F3,F4,F5端口配置为一般的I/O功能
LARK AR3,28820
LACK 50175
AND *
SACL *
.line 4
;>>>> PFDATDIR=(PFDATDIR|0x03c00)&0x0ff23; // IOPF2,F3,F4,F5端口配置为输出
LACK 15360
ADRK 2
OR *
ANDK 65315
SACL *
.line 5
;>>>> MCRA=MCRA&0x00c7; // 配置IOPA[3-5],IOPB[0-7]为一般I/O口功能
LACK 199
SBRK 6
AND *
SACL *
.line 6
;>>>> PADATDIR=0x0FF00; // IOPA[3-4]为输出,且全部为0
ADRK 8
SPLK #-256,* ,AR1
EPI0_1:
.line 7
SBRK 2
LAR AR0,*-
PSHD *
RET
.endfunc 64,000000000H,1
.sym _LCDSTA1,_LCDSTA1,32,2,0
.globl _LCDSTA1
.func 67
;>>>> void LCDSTA1(E)
;>>>> int E;
******************************************************
* FUNCTION DEF : _LCDSTA1
******************************************************
_LCDSTA1:
LF2 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _E,-3+LF2,4,9,16
.sym _E1FLAG,1,4,1,16
.sym _i,2,4,1,16
.line 3
.line 4
;>>>> int E1FLAG,i=0;
LACK 0
LARK AR2,2
MAR *0+
SACL * ,AR4
.line 5
;>>>> PBDATDIR=PBDATDIR&0x0000; //IOPB口为输入
LARK AR3,28826
LARK AR4,28826
LAC * ,AR3
LACK 0
SACL * ,AR2
.line 6
;>>>> if(E==1)
SSXM
SBRK 5-LF2
LAC *
SUBK 1
BNZ L1
.line 7
;>>>> PADATDIR=0x0FF18; //E1=1
MAR * ,AR3
SBRK 2
SPLK #-232,*
B L2
L1:
.line 8
;>>>> else PADATDIR=0x0FF20; //E2=1
MAR * ,AR3
SBRK 2
SPLK #-224,*
L2:
.line 10
;>>>> PFDATDIR=(PFDATDIR|0x0008)&0xfffb; // LCD_RW = 1;
;>>>> // LCD_DI = 0;
;>>>> while(1)
LACK 8
SBRK 2
OR *
ANDK 65531
SACL * ,AR2
ADRK 5-LF2
MAR * ,AR3
L3:
.line 14
;>>>> PFDATDIR=PFDATDIR|0x0010; //LCD_E = 1;
LARK AR3,28822
LACK 16
OR *
SACL * ,AR2
.line 15
;>>>> for(i=0; i<2; i++){}
LACK 0
SACL *
LAC *
SUBK 2
BGEZ L6
L5:
LAC *
ADDK 1
SACL *
LAC *
SUBK 2
BLZ L5
L6:
.line 16
;>>>> PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
LARK AR3,28822
LACK 65519
MAR * ,AR3
AND *
SACL *
.line 17
;>>>> E1FLAG=PBDATDIR&0x0080; // 读液晶状态
LACK 128
ADRK 4
AND * ,AR2
MAR *-
SACL *
.line 18
;>>>> if(E1FLAG==0x0000)break; //若液晶空闲,则停止等待
LAC *
BZ L4
.line 19
MAR *+,AR3
B L3
L4:
EPI0_2:
.line 20
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 86,000000000H,3
.sym _TRANS1,_TRANS1,32,2,0
.globl _TRANS1
.func 89
;>>>> void TRANS1(TRANS,E) //该函数采用形参和实参的方式传递数值,TRANS为一个形参
;>>>> int TRANS,E;
******************************************************
* FUNCTION DEF : _TRANS1
******************************************************
_TRANS1:
LF3 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+,AR2
.sym _TRANS,-3+LF3,4,9,16
.sym _E,-4+LF3,4,9,16
.sym _i,1,4,1,16
.line 4
;>>>> { int i=0;
LACK 0
LARK AR2,1
MAR *0+
SACL *
.line 5
;>>>> LCDSTA1(E); //判断液晶是否为忙
SBRK 5-LF3
LAC * ,AR1
SACL *+
CALL _LCDSTA1
MAR *-,AR3
.line 6
;>>>> PBDATDIR=PBDATDIR|0x0FF00; //IOPB口为输出
LARK AR3,28826
LACK 65280
OR *
SACL * ,AR2
.line 7
;>>>> if(E==1) PADATDIR=0x0FF18; //E1=1,
LARK AR2,-4+LF3
MAR *0+
LAC *
SUBK 1
BNZ L8
MAR * ,AR3
SBRK 2
SPLK #-232,*
B L9
L8:
.line 8
;>>>> else PADATDIR=0x0FF20; //E2=1,
MAR * ,AR3
SBRK 2
SPLK #-224,*
L9:
.line 9
;>>>> PFDATDIR=(PFDATDIR&0x0FFf3)|0x0010; //LCD_RW = 0;
;>>>> //LCD_DI = 0;
;>>>> //LCD_E = 1;
LACK 65523
SBRK 2
AND *
ORK 16
SACL *
.line 12
;>>>> PBDATDIR=(PBDATDIR&0x0FF00)|TRANS; //需要写入的命令字送入数据线
LACK 65280
ADRK 4
AND * ,AR2
MAR *+
OR * ,AR3
SACL * ,AR2
.line 13
;>>>> for(i=0; i<2; i++){}
LACK 0
ADRK 4-LF3
SACL *
LAC *
SUBK 2
BGEZ L11
L10:
LAC *
ADDK 1
SACL *
LAC *
SUBK 2
BLZ L10
L11:
.line 14
;>>>> PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
LARK AR3,28822
LACK 65519
MAR * ,AR3
AND *
SACL * ,AR1
EPI0_3:
.line 15
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 103,000000000H,2
.sym _WRITE1,_WRITE1,32,2,0
.globl _WRITE1
.func 106
;>>>> void WRITE1(WRITE,Yaddress,E) //WRITE代表需要写入的数据,Yaddress代表需要的列地址
;>>>> int WRITE,Yaddress,E;
******************************************************
* FUNCTION DEF : _WRITE1
******************************************************
_WRITE1:
LF4 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,2
LAR AR0,*0+,AR2
.sym _WRITE,-3+LF4,4,9,16
.sym _Yaddress,-4+LF4,4,9,16
.sym _E,-5+LF4,4,9,16
.sym _i,1,4,1,16
.line 3
.line 4
;>>>> int i=0;
LACK 0
LARK AR2,1
MAR *0+
SACL *
.line 5
;>>>> TRANS1(Yaddress,E); //设置列地址
SBRK 6-LF4
LAC *+,AR1
SACL *+,AR2
LAC * ,AR1
SACL *+
CALL _TRANS1
SBRK 2
.line 6
;>>>> LCDSTA1(E); //查询液晶是否空闲
MAR * ,AR2
LARK AR2,-5+LF4
MAR *0+
LAC * ,AR1
SACL *+
CALL _LCDSTA1
MAR *-,AR3
.line 7
;>>>> PBDATDIR=PBDATDIR|0x0FF00; //IOPB口为输出
LARK AR3,28826
LACK 65280
OR *
SACL * ,AR2
.line 8
;>>>> if(E==1) PADATDIR=0x0FF18; //E1=1
LARK AR2,-5+LF4
MAR *0+
LAC *
SUBK 1
BNZ L12
MAR * ,AR3
SBRK 2
SPLK #-232,*
B L13
L12:
.line 9
;>>>> else PADATDIR=0x0FF20; //E1=0,E2=1
MAR * ,AR3
SBRK 2
SPLK #-224,*
L13:
.line 10
;>>>> PFDATDIR=(PFDATDIR|0x0014)&0x0fff7;// LCD_RW = 0;
;>>>> //LCD_DI = 1;
;>>>> //LCD_E = 1;
LACK 20
SBRK 2
OR *
ANDK 65527
SACL *
.line 13
;>>>> PBDATDIR=(PBDATDIR&0x0FF00)|WRITE; //写入数据
LACK 65280
ADRK 4
AND * ,AR2
ADRK 2
OR * ,AR3
SACL * ,AR2
.line 14
;>>>> for(i=0; i<2; i++){}
LACK 0
ADRK 4-LF4
SACL *
LAC *
SUBK 2
BGEZ L15
L14:
LAC *
ADDK 1
SACL *
LAC *
SUBK 2
BLZ L14
L15:
.line 15
;>>>> PFDATDIR=PFDATDIR&0x0FFef; //LCD_E = 0;
LARK AR3,28822
LACK 65519
MAR * ,AR3
AND *
SACL * ,AR1
EPI0_4:
.line 17
SBRK 3
LAR AR0,*-
PSHD *
RET
.endfunc 122,000000000H,2
.sym _DISP1,_DISP1,32,2,0
.globl _DISP1
.func 124
;>>>> void DISP1(E)
;>>>> int E;
******************************************************
* FUNCTION DEF : _DISP1
******************************************************
_DISP1:
LF5 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _E,-3+LF5,4,9,16
.sym _E1FLAG,1,4,1,16
.sym _i,2,4,1,16
.line 3
.line 4
;>>>> int E1FLAG,i=0;
;>>>> while(1)
LACK 0
LARK AR2,2
MAR *0+
SACL *
SBRK 5-LF5
L16:
.line 7
;>>>> TRANS1(0x03F,E); //送出控制字
LAC * ,AR1
SACL *+
LACK 63
SACL *+
CALL _TRANS1
SBRK 2
.line 8
;>>>> LCDSTA1(E); //判断液晶是否为忙
MAR * ,AR2
LARK AR2,-3+LF5
MAR *0+
LAC * ,AR1
SACL *+
CALL _LCDSTA1
MAR *-,AR3
.line 9
;>>>> PBDATDIR=PBDATDIR&0x00ff; //IOPB口为输入
LARK AR3,28826
LACK 255
AND *
SACL * ,AR2
.line 10
;>>>> if(E==1) PADATDIR=0x0FF18; //E1=1
LARK AR2,-3+LF5
MAR *0+
LAC *
SUBK 1
BNZ L18
MAR * ,AR3
SBRK 2
SPLK #-232,*
B L19
L18:
.line 11
;>>>> else PADATDIR=0x0FF20; //E1=0,E2=1
MAR * ,AR3
SBRK 2
SPLK #-224,*
L19:
.line 12
;>>>> PFDATDIR=(PFDATDIR|0x0018)&0x0fffb;// LCD_RW = 1;
;>>>> //LCD_DI = 0;
;>>>> //LCD_E = 1;
LACK 24
SBRK 2
OR *
ANDK 65531
SACL * ,AR2
.line 15
;>>>> for(i=0; i<2; i++){}
LACK 0
ADRK 5-LF5
SACL *
LAC *
SUBK 2
BGEZ L21
L20:
LAC *
ADDK 1
SACL *
LAC *
SUBK 2
BLZ L20
L21:
.line 16
;>>>> PFDATDIR=PFDATDIR&0x0ffef; //LCD_E = 0;
LARK AR3,28822
LACK 65519
MAR * ,AR3
AND *
SACL *
.line 17
;>>>> E1FLAG=PBDATDIR&0x0020; // 读液晶状态
LACK 32
ADRK 4
AND * ,AR2
MAR *-
SACL *
.line 18
;>>>> if(E1FLAG==0x0000) break; //如果液晶被打开,则退出循环
LAC *
BZ L17
.line 19
SBRK 4-LF5
B L16
L17:
EPI0_5:
.line 20
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 143,000000000H,3
.sym _CLEAR1,_CLEAR1,32,2,0
.globl _CLEAR1
.func 146
;>>>> void CLEAR1(int E)
******************************************************
* FUNCTION DEF : _CLEAR1
******************************************************
_CLEAR1:
LF6 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _E,-3+LF6,4,9,16
.sym _PAGENUM,1,4,1,16
.sym _Yaddress,2,4,1,16
.line 2
;>>>> int PAGENUM,Yaddress; //定义所需要的局部变量
.line 4
;>>>> for (PAGENUM=0x0B8; PAGENUM<=0x0BF; PAGENUM++)
LACK 184
LARK AR2,1
MAR *0+
SACL *
SSXM
LAC *
SUBK 191
BGZ L24
SBRK 4-LF6
L23:
.line 6
;>>>> TRANS1(PAGENUM,E); //设置相应的页地址
LAC * ,AR1
SACL *+,AR2
ADRK 4-LF6
LAC * ,AR1
SACL *+
CALL _TRANS1
SBRK 2
.line 7
;>>>> for(Yaddress=0x40; Yaddress<=0x7F; Yaddress++)
LACK 64
MAR * ,AR2
LARK AR2,2
MAR *0+
SACL *
LAC *
SUBK 127
BGZ L26
SBRK 5-LF6
L25:
.line 9
;>>>> WRITE1(0x00,Yaddress,E); //向相应的列送0以清屏
LAC * ,AR1
SACL *+,AR2
ADRK 5-LF6
LAC * ,AR1
SACL *+
LACK 0
SACL *+
CALL _WRITE1
SBRK 3
.line 7
MAR * ,AR2
LARK AR2,2
MAR *0+
LAC *
ADDK 1
SACL *
LAC *
SUBK 127
SBRK 5-LF6
BLEZ L25
L26:
.line 4
LARK AR2,1
MAR *0+
LAC *
ADDK 1
SACL *
LAC *
SUBK 191
SBRK 4-LF6
BLEZ L23
L24:
EPI0_6:
.line 12
MAR * ,AR1
SBRK 4
LAR AR0,*-
PSHD *
RET
.endfunc 157,000000000H,3
.sym _DISOFF1,_DISOFF1,32,2,0
.globl _DISOFF1
.func 160
;>>>> void DISOFF1(int E)
******************************************************
* FUNCTION DEF : _DISOFF1
******************************************************
_DISOFF1:
LF7 .set 0
POPD *+
SAR AR0,*+
SAR AR1,*
LARK AR0,3
LAR AR0,*0+,AR2
.sym _E,-3+LF7,4,9,16
.sym _E1FLAG,1,4,1,16
.sym _i,2,4,1,16
.line 2
.line 4
;>>>> int E1FLAG,i=0;
;>>>> while(1)
LACK 0
LARK AR2,2
MAR *0+
SACL *
SBRK 5-LF7
L27:
.line 7
;>>>> TRANS1(0x3E,E); //送出控制字
LAC * ,AR1
SACL *+
LACK 62
SACL *+
CALL _TRANS1
SBRK 2
.line 8
;>>>> LCDSTA1(E); //判断液晶是否为空闲
MAR * ,AR2
LARK AR2,-3+LF7
MAR *0+
LAC * ,AR1
SACL *+
CALL _LCDSTA1
MAR *-,AR3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -