📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile F:\Relations\sf6_system\measure\LCDtest\lcd.c
.dbfunc e Clear_Display _Clear_Display fV
; color -> R20
.even
_Clear_Display::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 6
; #include <iom128v.h>
; #include "lcd.h"
; #include <macros.h>
;
; void Clear_Display(unsigned char color)
; {
.dbline 7
; CMD = LCD_MODE_2;
ldi R24,4
sts 32770,R24
.dbline 8
; DAT = color;
sts 32771,R20
.dbline 9
; CMD = LCD_CLEAR_EN;
ldi R24,8
sts 32770,R24
.dbline 10
; Delayx10ms(1);
ldi R16,1
ldi R17,0
xcall _Delayx10ms
.dbline 11
; CMD = LCD_CLEAR_DIS;
clr R2
sts 32770,R2
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r color 20 c
.dbend
.dbfunc e Dis_Rect _Dis_Rect fV
; i -> R20
; j -> R14,R15
; color -> R22
; width -> R10
; lenth -> R12,R13
; y -> R18
; x -> R16,R17
.even
_Dis_Rect::
xcall push_gset5
ldd R12,y+10
ldd R13,y+11
ldd R10,y+12
ldd R22,y+14
.dbline -1
.dbline 24
; }
;
;
; /* 编写:2005.11.29
; 编写者:赫树开
; 功能:画一个矩形
; 参数。 X为矩形左上角的X坐标,
; Y为左上角Y坐标值,
; lenth为矩形长度,
; width 为矩形宽度
; color为矩形的颜色,*/
; void Dis_Rect(unsigned int x,unsigned char y,unsigned int lenth,unsigned char width,unsigned char color)
; {
.dbline 27
; unsigned char i;
; unsigned int j;
; CMD = LCD_MODE_0+LCD_DOT1;
clr R2
sts 32770,R2
.dbline 28
; for(i=y;i<y+width;i++)
mov R20,R18
xjmp L6
L3:
.dbline 29
; {
.dbline 30
; X_ADDR = x;
sts 32768,R16
.dbline 31
; X_ADDR = x/256;
movw R2,R16
mov R2,R3
clr R3
sts 32768,R2
.dbline 32
; Y_ADDR = i;
sts 32769,R20
.dbline 33
; for(j=0;j<lenth;j++)
clr R14
clr R15
xjmp L10
L7:
.dbline 34
.dbline 35
sts 32771,R22
.dbline 36
L8:
.dbline 33
movw R24,R14
adiw R24,1
movw R14,R24
L10:
.dbline 33
cp R14,R12
cpc R15,R13
brlo L7
.dbline 37
L4:
.dbline 28
inc R20
L6:
.dbline 28
mov R2,R18
add R2,R10
cp R20,R2
brlo L3
.dbline -2
L2:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 14 i
.dbsym r color 22 c
.dbsym r width 10 c
.dbsym r lenth 12 i
.dbsym r y 18 c
.dbsym r x 16 i
.dbend
.dbfunc e bytekzh _bytekzh fV
; i -> R20
; j -> R22
; back -> R10
; front -> R18
; datain -> R16
.even
_bytekzh::
xcall push_gset4
ldd R10,y+8
.dbline -1
.dbline 41
; {
; DAT = color;
; }
; }
; }
; //单色字节扩展函数
; void bytekzh( unsigned char datain,unsigned char front, unsigned char back )
; {
.dbline 43
; unsigned char i,j;
; for( i=0,j=0x80; i<8; i++,j=(j>>1))
clr R20
ldi R22,128
xjmp L15
L12:
.dbline 44
; {
.dbline 45
; DAT=datain&j ? front: back;
mov R2,R16
and R2,R22
breq L16
mov R12,R18
clr R13
xjmp L17
L16:
mov R12,R10
clr R13
L17:
sts 32771,R12
.dbline 46
L13:
.dbline 43
inc R20
lsr R22
L15:
.dbline 43
cpi R20,8
brlo L12
.dbline -2
L11:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbsym r back 10 c
.dbsym r front 18 c
.dbsym r datain 16 c
.dbend
.dbfunc e Dis_Ascii _Dis_Ascii fV
; k -> R20
; j -> R22
; back -> y+10
; front -> y+8
; dat -> R10
; y -> R18
; x -> R16,R17
.even
_Dis_Ascii::
xcall push_gset3
ldd R10,y+6
.dbline -1
.dbline 50
; }
; }
;
; void Dis_Ascii(unsigned int x,unsigned char y,unsigned char dat,unsigned char front,unsigned back)
; {
.dbline 52
; unsigned char j,k;
; k = 0;
clr R20
.dbline 53
; dat -= 0x20;
mov R24,R10
subi R24,32
mov R10,R24
.dbline 54
; CMD = LCD_MODE_1;
ldi R24,2
sts 32770,R24
.dbline 55
; DAT = front;
ldd R0,y+8
sts 32771,R0
.dbline 56
; CMD = LCD_MODE_2;
ldi R24,4
sts 32770,R24
.dbline 57
; DAT = back;
ldd R2,y+10
ldd R3,y+11
sts 32771,R2
.dbline 58
; CMD = LCD_MODE_0+LCD_DOT8;
ldi R24,1
sts 32770,R24
.dbline 59
; for(j=y;j<y+16;j++)
mov R22,R18
xjmp L22
L19:
.dbline 60
.dbline 61
sts 32769,R22
.dbline 62
sts 32768,R16
.dbline 63
movw R2,R16
mov R2,R3
clr R3
sts 32768,R2
.dbline 64
mov R2,R20
clr R3
subi R20,255 ; addi 1
ldi R24,16
mul R24,R10
movw R4,R0
ldi R24,<_ASC_MSK
ldi R25,>_ASC_MSK
add R4,R24
adc R5,R25
mov R30,R2
clr R31
add R30,R4
adc R31,R5
elpm R30,Z
sts 32771,R30
.dbline 65
L20:
.dbline 59
inc R22
L22:
.dbline 59
mov R24,R18
subi R24,240 ; addi 16
cp R22,R24
brlo L19
.dbline -2
L18:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r j 22 c
.dbsym l back 10 i
.dbsym l front 8 c
.dbsym r dat 10 c
.dbsym r y 18 c
.dbsym r x 16 i
.dbend
.dbfunc e Dis_Ascii_Big _Dis_Ascii_Big fV
; k -> R20
; j -> R22
; back -> y+10
; front -> y+8
; dat -> R10
; y -> R18
; x -> R16,R17
.even
_Dis_Ascii_Big::
xcall push_gset3
ldd R10,y+6
.dbline -1
.dbline 71
; {
; Y_ADDR = j;
; X_ADDR = x;
; X_ADDR = x/256;
; DAT = ASC_MSK[dat][k++];
; }
; }
; /*
; 16*24 字符单个字符显示
; */
; void Dis_Ascii_Big(unsigned int x,unsigned char y,unsigned char dat,unsigned char front,unsigned back)
; {
.dbline 73
; unsigned char j,k;
; k=0;
clr R20
.dbline 74
; dat-=0x20;
mov R24,R10
subi R24,32
mov R10,R24
.dbline 75
; CMD = LCD_MODE_1;
ldi R24,2
sts 32770,R24
.dbline 76
; DAT = front;
ldd R0,y+8
sts 32771,R0
.dbline 77
; CMD = LCD_MODE_2;
ldi R24,4
sts 32770,R24
.dbline 78
; DAT = back;
ldd R2,y+10
ldd R3,y+11
sts 32771,R2
.dbline 79
; CMD = LCD_MODE_0+LCD_DOT8;
ldi R24,1
sts 32770,R24
.dbline 80
; for(j=y;j<y+24;j++)
mov R22,R18
xjmp L27
L24:
.dbline 81
.dbline 82
sts 32769,R22
.dbline 83
sts 32768,R16
.dbline 84
movw R2,R16
mov R2,R3
clr R3
sts 32768,R2
.dbline 85
mov R2,R20
clr R3
subi R20,255 ; addi 1
ldi R24,48
mul R24,R10
movw R4,R0
ldi R24,<_Cdot1624
ldi R25,>_Cdot1624
add R4,R24
adc R5,R25
mov R30,R2
clr R31
add R30,R4
adc R31,R5
elpm R30,Z
sts 32771,R30
.dbline 86
mov R2,R20
clr R3
subi R20,255 ; addi 1
ldi R24,48
mul R24,R10
movw R4,R0
ldi R24,<_Cdot1624
ldi R25,>_Cdot1624
add R4,R24
adc R5,R25
mov R30,R2
clr R31
add R30,R4
adc R31,R5
elpm R30,Z
sts 32771,R30
.dbline 87
L25:
.dbline 80
inc R22
L27:
.dbline 80
mov R24,R18
subi R24,232 ; addi 24
cp R22,R24
brlo L24
.dbline -2
L23:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r j 22 c
.dbsym l back 10 i
.dbsym l front 8 c
.dbsym r dat 10 c
.dbsym r y 18 c
.dbsym r x 16 i
.dbend
.dbfunc e Dis_Chinese _Dis_Chinese fV
; k -> R20
; j -> R22
; back -> y+14
; front -> y+12
; dat -> R12,R13
; y -> R14
; x -> R10,R11
.even
_Dis_Chinese::
xcall push_gset5
mov R14,R18
movw R10,R16
ldd R12,y+10
ldd R13,y+11
.dbline -1
.dbline 90
; {
; Y_ADDR = j;
; X_ADDR = x;
; X_ADDR = x/256;
; DAT = Cdot1624[dat][k++];
; DAT = Cdot1624[dat][k++];
; }
; }
; void Dis_Chinese(unsigned int x,unsigned char y,unsigned int dat,unsigned char front,unsigned back)
; {
.dbline 92
; unsigned char j,k;
; k = 0;
clr R20
.dbline 93
; CMD = LCD_MODE_1;
ldi R24,2
sts 32770,R24
.dbline 94
; DAT = front;
ldd R0,y+12
sts 32771,R0
.dbline 95
; CMD = LCD_MODE_2;
ldi R24,4
sts 32770,R24
.dbline 96
; DAT = back;
ldd R2,y+14
ldd R3,y+15
sts 32771,R2
.dbline 97
; CMD = LCD_MODE_0+LCD_DOT8;
ldi R24,1
sts 32770,R24
.dbline 98
; for(j=y;j<y+16;j++)
mov R22,R14
xjmp L32
L29:
.dbline 99
.dbline 100
sts 32769,R22
.dbline 101
sts 32768,R10
.dbline 102
movw R2,R10
mov R2,R3
clr R3
sts 32768,R2
.dbline 103
mov R2,R20
clr R3
subi R20,255 ; addi 1
ldi R16,34
ldi R17,0
movw R18,R12
xcall empy16s
movw R4,R16
ldi R24,<_Cdotlib+2
ldi R25,>_Cdotlib+2
add R4,R24
adc R5,R25
mov R30,R2
clr R31
add R30,R4
adc R31,R5
elpm R30,Z
sts 32771,R30
.dbline 104
mov R2,R20
clr R3
subi R20,255 ; addi 1
ldi R16,34
ldi R17,0
movw R18,R12
xcall empy16s
movw R4,R16
ldi R24,<_Cdotlib+2
ldi R25,>_Cdotlib+2
add R4,R24
adc R5,R25
mov R30,R2
clr R31
add R30,R4
adc R31,R5
elpm R30,Z
sts 32771,R30
.dbline 105
L30:
.dbline 98
inc R22
L32:
.dbline 98
mov R24,R14
subi R24,240 ; addi 16
cp R22,R24
brsh X0
xjmp L29
X0:
.dbline -2
L28:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r j 22 c
.dbsym l back 14 i
.dbsym l front 12 c
.dbsym r dat 12 i
.dbsym r y 14 c
.dbsym r x 10 i
.dbend
.dbfunc e Display _Display fV
; uLen -> R20
; i -> R22
; dat -> R10,R11
; back -> R12
; front -> R14
; font -> y+18
; ptr -> y+16
; y -> R4
; x -> R6,R7
.even
_Display::
xcall push_gset5
mov R4,R18
movw R6,R16
sbiw R28,6
ldd R14,y+20
ldd R12,y+22
.dbline -1
.dbline 126
; {
; Y_ADDR = j;
; X_ADDR = x;
; X_ADDR = x/256;
; DAT = Cdotlib[dat].Msk[k++];
; DAT = Cdotlib[dat].Msk[k++];
; }
; }
; /*
; 显示dat[32]数组中的汉字
; 输入:显示汉字位置,汉字点阵指针、着色
; 输入:无
; 编者:赫树开
; 日期:二○○六年三月十一日
; */
;
;
; /*=============================================================================
; ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
; 输入参数约定:
; x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
; *ptr...字符串指针,本函数所指的是flash字串
; cursor 为光标标志,1 为光标 0 为不是光标
; 返回参数:输出字串长度,留意汉字一个算两个
; 其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
; ==============================================================================*/
; void Display(unsigned int x,unsigned char y,unsigned char *ptr,unsigned char font,unsigned char front,unsigned char back)
; {
.dbline 127
; unsigned char uLen,i=0;
clr R22
.dbline 129
; unsigned int dat;
; uLen=0;
clr R20
xjmp L37
L36:
.dbline 130
.dbline 130
inc R20
.dbline 130
L37:
.dbline 130
; while ( (unsigned char)ptr[uLen] >= 0x10 ){uLen++;}; //探测字串长度
mov R30,R20
clr R31
ldd R0,y+16
ldd R1,y+17
add R30,R0
adc R31,R1
ldd R24,z+0
cpi R24,16
brsh L36
.dbline 130
xjmp L40
L39:
.dbline 133
; //uLen = strlen(ptr);
; while(i<uLen)
; {
.dbline 135
;
; if((unsigned char)ptr[i]<128) //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
mov R30,R22
clr R31
ldd R0,y+16
ldd R1,y+17
add R30,R0
adc R31,R1
ldd R24,z+0
cpi R24,128
brlo X1
xjmp L42
X1:
.dbline 136
; { //此字符为ascii
.dbline 137
; if(font == BIG)
ldd R24,y+18
cpi R24,1
brne L44
.dbline 138
; {
.dbline 139
; Dis_Ascii_Big(x,y,ptr[i],front,back);
mov R2,R12
clr R3
std y+5,R3
std y+4,R2
std y+2,R14
mov R30,R22
clr R31
add R30,R0
adc R31,R1
ldd R2,z+0
std y+0,R2
mov R18,R4
movw R16,R6
push R16
push R17
push R18
xcall _Dis_Ascii_Big
pop R4
pop R7
pop R6
.dbline 140
; x+=16;
movw R24,R6
adiw R24,16
movw R6,R24
.dbline 141
; i++;
inc R22
.dbline 142
; if(x>319)
ldi R24,319
ldi R25,1
cp R24,R6
cpc R25,R7
brlo X2
xjmp L43
X2:
.dbline 143
; {
.dbline 144
; y+=24;
mov R24,R4
subi R24,232 ; addi 24
mov R4,R24
.dbline 145
; x=0;
clr R6
clr R7
.dbline 146
; }
.dbline 147
; }
xjmp L43
L44:
.dbline 149
; else
; {
.dbline 150
; Dis_Ascii(x,y,ptr[i],front,back);
mov R2,R12
clr R3
std y+5,R3
std y+4,R2
std y+2,R14
mov R30,R22
clr R31
ldd R0,y+16
ldd R1,y+17
add R30,R0
adc R31,R1
ldd R2,z+0
std y+0,R2
mov R18,R4
movw R16,R6
push R16
push R17
push R18
xcall _Dis_Ascii
pop R4
pop R7
pop R6
.dbline 151
; x += 8;
movw R24,R6
adiw R24,8
movw R6,R24
.dbline 152
; i++;
inc R22
.dbline 153
; if(x>319)
ldi R24,319
ldi R25,1
cp R24,R6
cpc R25,R7
brlo X3
xjmp L43
X3:
.dbline 154
; {
.dbline 155
; y += 16;
mov R24,R4
subi R24,240 ; addi 16
mov R4,R24
.dbline 156
; x = 0;
clr R6
clr R7
.dbline 157
; }
.dbline 158
; }
.dbline 159
; }
xjmp L43
L42:
.dbline 161
; else //此字符为汉字
; {
.dbline 162
; for(dat=0;dat<MAX_HZ;dat++)
clr R10
clr R11
xjmp L53
L50:
.dbline 163
; {
.dbline 164
; if(Cdotlib[dat].Index[0] == (unsigned char)ptr[i])
ldi R16,34
ldi R17,0
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_Cdotlib
ldi R25,>_Cdotlib
add R30,R24
adc R31,R25
elpm R30,Z
mov R26,R22
clr R27
ldd R0,y+16
ldd R1,y+17
add R26,R0
adc R27,R1
ld R2,x
cp R30,R2
brne L54
.dbline 165
; {
.dbline 166
; if(Cdotlib[dat].Index[1] == (unsigned char)ptr[i+1])
ldi R16,34
ldi R17,0
movw R18,R10
xcall empy16s
movw R30,R16
ldi R24,<_Cdotlib+1
ldi R25,>_Cdotlib+1
add R30,R24
adc R31,R25
elpm R30,Z
mov R26,R22
clr R27
ldd R0,y+16
ldd R1,y+17
add R26,R0
adc R27,R1
adiw R26,1
ld R2,x
cp R30,R2
brne L56
.dbline 167
; {
.dbline 168
; i+=2;
subi R22,254 ; addi 2
.dbline 169
; break;
xjmp L52
L56:
.dbline 171
; }
; }
L54:
.dbline 172
L51:
.dbline 162
movw R24,R10
adiw R24,1
movw R10,R24
L53:
.dbline 162
movw R24,R10
cpi R24,170
ldi R30,0
cpc R25,R30
brsh X4
xjmp L50
X4:
L52:
.dbline 173
; }
; if(dat >= MAX_HZ)//若字库不存在该字则显示空白
movw R24,R10
cpi R24,170
ldi R30,0
cpc R25,R30
brlo L59
.dbline 174
; {
.dbline 175
; i += 2;
subi R22,254 ; addi 2
.dbline 176
; dat = 0;
clr R10
clr R11
.dbline 177
; }
L59:
.dbline 178
; Dis_Chinese(x,y,dat,front,back);
mov R2,R12
clr R3
std y+5,R3
std y+4,R2
std y+2,R14
std y+1,R11
std y+0,R10
mov R18,R4
movw R16,R6
push R16
push R17
push R18
xcall _Dis_Chinese
pop R4
pop R7
pop R6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -