📄 lcd1286418.s
字号:
.module lcd1286418.c
.area text(rom, con, rel)
.dbfile F:\CODE\LCD1286418\lcd1286418.c
.dbfunc e LcdInit _LcdInit fV
.even
_LcdInit::
.dbline -1
.dbline 62
; /***********************************************************************************************
; * FILE NAME: lcd1286418.c
; * PURPOSE: lcd1286418 drive Firmware
; * DESCRIPTION: KS0108
; * DEVELOPMENT HISTORY:
; * Date Author Release Description Of Change
; * -------- ------------ --------- ------------------------------------------------
; * 08-04-11 XuGuohong 1.0 Testing Edition
; /**********************************************************************************************/
;
; /* Include Global Parameters */
; #include <iom128v.h>
; #include "avr.h"
;
; /* LCD PORTING ON ATMEGA128 */
; /* D0---D7 */
; #define LCDPORTDATA PORTF
; #define LCDDDRDATA DDRF
; #define LCDPINDATA PINF
; /* CS1 */
; #define LCDPORTCS1 PORTE
; #define LCDDDRCS1 DDRE
; #define LCDCS1 PE2
; /* CS2 */
; #define LCDPORTCS2 PORTE
; #define LCDDDRCS2 DDRE
; #define LCDCS2 PE3
; /* RW */
; #define LCDPORTRW PORTE
; #define LCDDDRRW DDRE
; #define LCDRW PE4
; /* RS */
; #define LCDPORTRS PORTB
; #define LCDDDRRS DDRB
; #define LCDRS PB2
; /* E */
; #define LCDPORTEN PORTB
; #define LCDDDREN DDRB
; #define LCDEN PB3
;
; /* Include Global Parameters */
; unsigned char displaybuffer[8][128];
;
; /* Declare Prototypes */
; void LcdInit(void);
; void LcdWrCmd(unsigned char,unsigned char);
; void LcdWrDat(unsigned char,unsigned char);
; unsigned char LcdRdSta(unsigned char);
; unsigned char LcdRdDat(unsigned char);
; unsigned char LcdBusy(void);
; void LcdClr(void);
; void LcdDisplaySeg(unsigned char,unsigned char,unsigned char);
; void LcdDisplayDot(unsigned char,unsigned char,unsigned char);
; void LcdDsiplayRefresh(void);
; void Delay1ms(void);
;
; /*****************************************
; * FUNCTION NAME: LcdInit
; * DESCRIPTION: LCD Initialization
; /*****************************************/
; void LcdInit(void)
; {
.dbline 64
; /* Ports Initialization */
; SetBit(LCDPORTCS1,LCDCS1);
sbi 0x3,2
.dbline 65
; SetBit(LCDPORTCS2,LCDCS2);
sbi 0x3,3
.dbline 66
; ClrBit(LCDPORTEN,LCDEN);
cbi 0x18,3
.dbline 67
; SetOutput(LCDDDRRS,LCDRS);
sbi 0x17,2
.dbline 68
; SetOutput(LCDDDRRW,LCDRW);
sbi 0x2,4
.dbline 69
; SetOutput(LCDDDRCS1,LCDCS1);
sbi 0x2,2
.dbline 70
; SetOutput(LCDDDRCS2,LCDCS2);
sbi 0x2,3
.dbline 71
; SetOutput(LCDDDREN,LCDEN);
sbi 0x17,3
.dbline 72
; Delay1ms();
xcall _Delay1ms
.dbline 74
; /* Lcd Clear */
; LcdClr();
xcall _LcdClr
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LcdWrCmd _LcdWrCmd fV
; data -> R10
; chiplr -> R20
.even
_LcdWrCmd::
st -y,R10
st -y,R20
mov R10,R18
mov R20,R16
.dbline -1
.dbline 84
; }
;
; /*****************************************
; * FUNCTION NAME: LcdWrCmd
; * DESCRIPTION: Write Command To LCD
; * chiplr = "L" or "R"
; * chiplr = " B "同时选中
; /*****************************************/
; void LcdWrCmd(unsigned char chiplr,unsigned char data)
; {
L3:
.dbline 86
; while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
; ;
L4:
.dbline 85
xcall _LcdBusy
tst R16
breq L3
X0:
.dbline 87
; ClrBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
cbi 0x18,2
.dbline 88
; ClrBit(LCDPORTRW,LCDRW); /* RW = 0 ,WRITE */
cbi 0x3,4
.dbline 89
; if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
cpi R20,76
brne L6
X1:
.dbline 90
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
xjmp L7
L6:
.dbline 91
; else if(chiplr == 'R')
cpi R20,82
brne L8
X2:
.dbline 92
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
xjmp L9
L8:
.dbline 94
; else
; {
.dbline 95
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
.dbline 96
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
.dbline 97
; }
L9:
L7:
.dbline 98
; NOP; /* DELAY AT LEAS;T 140ns */
nop
.dbline 99
; NOP;
nop
.dbline 100
; SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
sbi 0x18,3
.dbline 101
; NOP; /* DELAY AT LEAST 450ns */
nop
.dbline 102
; NOP;
nop
.dbline 103
; NOP;
nop
.dbline 104
; NOP;
nop
.dbline 105
; NOP;
nop
.dbline 106
; LCDDDRDATA = 0XFF; /* WRITE DATA TO LCD */
ldi R24,255
sts 97,R24
.dbline 107
; LCDPORTDATA = data;
sts 98,R10
.dbline 108
; ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
cbi 0x18,3
.dbline 109
; NOP; /* DELAY AT LEAST 10ns */
nop
.dbline 110
; SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
sbi 0x3,2
.dbline 111
; SetBit(LCDPORTCS2,LCDCS2);
sbi 0x3,3
.dbline 112
; NOP;
nop
.dbline -2
L2:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r data 10 c
.dbsym r chiplr 20 c
.dbend
.dbfunc e LcdWrDat _LcdWrDat fV
; data -> R10
; chiplr -> R20
.even
_LcdWrDat::
st -y,R10
st -y,R20
mov R10,R18
mov R20,R16
.dbline -1
.dbline 121
; }
;
; /*****************************************
; * FUNCTION NAME: LcdWrDat
; * DESCRIPTION: Write Data To LCD
; * chiplr = "L" or "R"
; /*****************************************/
; void LcdWrDat(unsigned char chiplr,unsigned char data)
; {
L11:
.dbline 123
; while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
; ;
L12:
.dbline 122
xcall _LcdBusy
tst R16
breq L11
X3:
.dbline 124
; SetBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
sbi 0x18,2
.dbline 125
; ClrBit(LCDPORTRW,LCDRW); /* RW = 0 ,WRITE */
cbi 0x3,4
.dbline 126
; if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
cpi R20,76
brne L14
X4:
.dbline 127
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
xjmp L15
L14:
.dbline 128
; else if(chiplr == 'R')
cpi R20,82
brne L16
X5:
.dbline 129
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
xjmp L17
L16:
.dbline 131
; else
; {
.dbline 132
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
.dbline 133
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
.dbline 134
; }
L17:
L15:
.dbline 135
; NOP; /* DELAY AT LEAST 140ns */
nop
.dbline 136
; NOP;
nop
.dbline 137
; SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
sbi 0x18,3
.dbline 138
; NOP; /* DELAY AT LEAST 450ns */
nop
.dbline 139
; NOP;
nop
.dbline 140
; NOP;
nop
.dbline 141
; NOP;
nop
.dbline 142
; NOP;
nop
.dbline 143
; LCDDDRDATA = 0XFF; /* WRITE DATA TO LCD */
ldi R24,255
sts 97,R24
.dbline 144
; LCDPORTDATA = data;
sts 98,R10
.dbline 145
; ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
cbi 0x18,3
.dbline 146
; NOP; /* DELAY AT LEAST 10ns */
nop
.dbline 147
; SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
sbi 0x3,2
.dbline 148
; SetBit(LCDPORTCS2,LCDCS2);
sbi 0x3,3
.dbline 149
; NOP;
nop
.dbline -2
L10:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r data 10 c
.dbsym r chiplr 20 c
.dbend
.dbfunc e LcdRdSta _LcdRdSta fc
; temp -> R10
; chiplr -> R16
.even
_LcdRdSta::
st -y,R10
.dbline -1
.dbline 157
; }
;
; /*****************************************
; * FUNCTION NAME: LcdRdSta
; * DESCRIPTION: Read Status From LCD
; /*****************************************/
; unsigned char LcdRdSta(unsigned char chiplr)
; {
.dbline 159
; unsigned char temp;
; ClrBit(LCDPORTRS,LCDRS); /* RS = 0 ,COMMAND */
cbi 0x18,2
.dbline 160
; SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
sbi 0x3,4
.dbline 161
; if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
cpi R16,76
brne L19
X6:
.dbline 162
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
xjmp L20
L19:
.dbline 163
; else if(chiplr == 'R')
cpi R16,82
brne L21
X7:
.dbline 164
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
xjmp L22
L21:
.dbline 166
; else
; {
.dbline 167
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
.dbline 168
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
.dbline 169
; }
L22:
L20:
.dbline 170
; NOP; /* DELAY AT LEAS;T 140ns */
nop
.dbline 171
; NOP;
nop
.dbline 172
; SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
sbi 0x18,3
.dbline 173
; NOP; /* DELAY AT LEAST 450ns */
nop
.dbline 174
; NOP;
nop
.dbline 175
; NOP;
nop
.dbline 176
; NOP;
nop
.dbline 177
; NOP;
nop
.dbline 178
; LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
clr R2
sts 97,R2
.dbline 179
; temp = LCDPINDATA;
in R10,0x0
.dbline 180
; ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
cbi 0x18,3
.dbline 181
; NOP; /* DELAY AT LEAST 10ns */
nop
.dbline 182
; SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
sbi 0x3,2
.dbline 183
; SetBit(LCDPORTCS2,LCDCS2);
sbi 0x3,3
.dbline 184
; NOP;
nop
.dbline 185
; return temp;
mov R16,R10
.dbline -2
L18:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r temp 10 c
.dbsym r chiplr 16 c
.dbend
.dbfunc e LcdRdDat _LcdRdDat fc
; temp -> R10
; chiplr -> R20
.even
_LcdRdDat::
st -y,R10
st -y,R20
mov R20,R16
.dbline -1
.dbline 193
; }
;
; /*****************************************
; * FUNCTION NAME: LcdRdDat
; * DESCRIPTION: Read Data From LCD
; /*****************************************/
; unsigned char LcdRdDat(unsigned char chiplr)
; {
L24:
.dbline 196
; unsigned char temp;
; while(LcdBusy() == 0) /* IF LCD BUSY,WAIT... */
; ;
L25:
.dbline 195
xcall _LcdBusy
tst R16
breq L24
X8:
.dbline 197
; SetBit(LCDPORTRS,LCDRS); /* RS = 1 ,DATA */
sbi 0x18,2
.dbline 198
; SetBit(LCDPORTRW,LCDRW); /* RW = 1 ,READ */
sbi 0x3,4
.dbline 199
; if(chiplr == 'L') /* CS = 0 ,CHIP SELECT */
cpi R20,76
brne L27
X9:
.dbline 200
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
xjmp L28
L27:
.dbline 201
; else if(chiplr == 'R')
cpi R20,82
brne L29
X10:
.dbline 202
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
xjmp L30
L29:
.dbline 204
; else
; {
.dbline 205
; ClrBit(LCDPORTCS1,LCDCS1);
cbi 0x3,2
.dbline 206
; ClrBit(LCDPORTCS2,LCDCS2);
cbi 0x3,3
.dbline 207
; }
L30:
L28:
.dbline 208
; NOP; /* DELAY AT LEAS;T 140ns */
nop
.dbline 209
; NOP;
nop
.dbline 210
; SetBit(LCDPORTEN,LCDEN); /* EN = 1 */
sbi 0x18,3
.dbline 211
; NOP; /* DELAY AT LEAST 450ns */
nop
.dbline 212
; NOP;
nop
.dbline 213
; NOP;
nop
.dbline 214
; NOP;
nop
.dbline 215
; NOP;
nop
.dbline 216
; LCDDDRDATA = 0X00; /* READ DATA FROM LCD */
clr R2
sts 97,R2
.dbline 217
; temp = LCDPINDATA;
in R10,0x0
.dbline 218
; ClrBit(LCDPORTEN,LCDEN); /* EN = 0 */
cbi 0x18,3
.dbline 219
; NOP; /* DELAY AT LEAST 10ns */
nop
.dbline 220
; SetBit(LCDPORTCS1,LCDCS1); /* CHIP DISABLE */
sbi 0x3,2
.dbline 221
; SetBit(LCDPORTCS2,LCDCS2);
sbi 0x3,3
.dbline 222
; NOP;
nop
.dbline 223
; return temp;
mov R16,R10
.dbline -2
L23:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r temp 10 c
.dbsym r chiplr 20 c
.dbend
.dbfunc e LcdBusy _LcdBusy fc
; temp2 -> R20
; temp1 -> R22
.even
_LcdBusy::
st -y,R20
st -y,R22
.dbline -1
.dbline 233
; }
;
; /*****************************************
; * FUNCTION NAME: LcdBusy
; * DESCRIPTION: LCD BUSY OR NOT
; * BUSY-RETURN 0
; * NOT BUSY-RETURN 1
; /*****************************************/
; unsigned char LcdBusy(void)
; {
.dbline 235
; unsigned char temp1,temp2;
; temp1 = LcdRdSta('L'); /* READ LCD STA. */
ldi R16,76
xcall _LcdRdSta
mov R22,R16
.dbline 236
; temp1 = temp1&0X80;
andi R22,128
.dbline 237
; temp2 = LcdRdSta('R');
ldi R16,82
xcall _LcdRdSta
mov R20,R16
.dbline 238
; temp2 = temp2&0X80;
andi R20,128
.dbline 239
; if(temp1|temp2)
mov R2,R22
or R2,R20
breq L32
X11:
.dbline 240
; return 0;
clr R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -