📄 lcddriver.s
字号:
ldi R16,162
xcall _send_cmd
.dbline 97
; send_cmd(LCD_POWER_CONTROL+4);
ldi R16,44
xcall _send_cmd
.dbline 98
; send_cmd(LCD_POWER_CONTROL+6);
ldi R16,46
xcall _send_cmd
.dbline 99
; send_cmd(LCD_POWER_CONTROL+7);
ldi R16,47
xcall _send_cmd
.dbline 100
; send_cmd(LCD_RESISTOR_RATIO+5);
ldi R16,37
xcall _send_cmd
.dbline 101
; send_cmd(LCD_ELEC_VOLUME_SET);
ldi R16,129
xcall _send_cmd
.dbline 102
; send_cmd(0x14); //0X14
ldi R16,20
xcall _send_cmd
.dbline 103
; send_cmd(LCD_ON);
ldi R16,175
xcall _send_cmd
.dbline 104
; send_cmd(LCD_RMW);
ldi R16,224
xcall _send_cmd
.dbline 105
; send_cmd(LCD_START_LINE_SET);
ldi R16,64
xcall _send_cmd
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Set_Page_Address _Set_Page_Address fV
; dat -> R20
.even
_Set_Page_Address::
st -y,R20
mov R20,R16
.dbline -1
.dbline 109
; }
; //=======写页地址==============
; void Set_Page_Address(unsigned char dat)
; {
.dbline 110
; send_cmd(LCD_PAGE_SET|dat);
mov R16,R20
ori R16,176
xcall _send_cmd
.dbline -2
L25:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r dat 20 c
.dbend
.dbfunc e Set_Colume_Address _Set_Colume_Address fV
; tmp -> R20
; dat -> R22
.even
_Set_Colume_Address::
st -y,R20
st -y,R22
mov R22,R16
.dbline -1
.dbline 114
; }
; //=======写列地址==============
; void Set_Colume_Address(unsigned char dat)
; {
.dbline 116
; unsigned char tmp;
; tmp=dat>>4;
mov R20,R22
swap R20
andi R20,#0x0F
.dbline 117
; send_cmd(LCD_COLUME_SET_H|tmp); //送列地址高三位
mov R16,R20
ori R16,16
xcall _send_cmd
.dbline 118
; tmp=0x0f&dat;
mov R20,R22
andi R20,15
.dbline 119
; send_cmd(tmp); //送列地址低四位
mov R16,R20
xcall _send_cmd
.dbline -2
L26:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r tmp 20 c
.dbsym r dat 22 c
.dbend
.dbfunc e PrintOneASCII _PrintOneASCII fV
; Tmp -> R22
; j -> R20
; Asc -> R20
; l -> R10
; h -> R12
.even
_PrintOneASCII::
xcall push_xgsetF03C
mov R10,R18
mov R12,R16
ldd R20,y+8
.dbline -1
.dbline 126
; }
;
; //在指定的位置显示1个ASCII码字符
; //h,l:行位置与列位置
; //Asc:字符的ASC值,注意ASC字符为可显示字符(ASCII>=0x20)
; void PrintOneASCII(uchar h,uchar l,uchar Asc)
; {
.dbline 128
; uchar Tmp,j;
; Set_Page_Address(h);
mov R16,R12
xcall _Set_Page_Address
.dbline 129
; Set_Colume_Address(l);
mov R16,R10
xcall _Set_Colume_Address
.dbline 130
; if (Asc>=0x20) Tmp=Asc-0x20;else Tmp=0;
cpi R20,32
brlo L28
X5:
.dbline 130
mov R22,R20
subi R22,32
xjmp L29
L28:
.dbline 130
clr R22
L29:
.dbline 131
; for(j=0;j<8;j++)
clr R20
xjmp L33
L30:
.dbline 132
; {
.dbline 133
; send_dat(Ascii[Tmp][j]);
ldi R24,<_Ascii
ldi R25,>_Ascii
mov R2,R22
clr R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
add R2,R24
adc R3,R25
mov R30,R20
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
xcall _send_dat
.dbline 134
; }
L31:
.dbline 131
inc R20
L33:
.dbline 131
cpi R20,8
brlo L30
X6:
.dbline -2
L27:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r Tmp 22 c
.dbsym r j 20 c
.dbsym r Asc 20 c
.dbsym r l 10 c
.dbsym r h 12 c
.dbend
.dbfunc e ClearLCD _ClearLCD fV
; i -> R20
; j -> R22
.even
_ClearLCD::
st -y,R20
st -y,R22
.dbline -1
.dbline 138
; }
;
; void ClearLCD(void) //LCD清屏
; {
.dbline 140
; uchar i,j;
; for(i=0; i<9; i++) //clear page 0~8
clr R20
xjmp L38
L35:
.dbline 141
; {
.dbline 142
; Set_Page_Address(i);
mov R16,R20
xcall _Set_Page_Address
.dbline 143
; Set_Colume_Address(0);
clr R16
xcall _Set_Colume_Address
.dbline 144
; for(j=0; j<132; j++) //clear colum
clr R22
xjmp L42
L39:
.dbline 145
; {
.dbline 146
; send_dat(0);
clr R16
xcall _send_dat
.dbline 147
; }
L40:
.dbline 144
inc R22
L42:
.dbline 144
cpi R22,132
brlo L39
X7:
.dbline 148
; }
L36:
.dbline 140
inc R20
L38:
.dbline 140
cpi R20,9
brlo L35
X8:
.dbline -2
L34:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r i 20 c
.dbsym r j 22 c
.dbend
.dbfunc e Display_BattVol _Display_BattVol fV
; j -> R20
; Vol -> R10
; pic -> R12,R13
.even
_Display_BattVol::
xcall push_xgset303C
mov R10,R18
movw R12,R16
.dbline -1
.dbline 153
; }
;
; //=======显示电池电量============
; void Display_BattVol(uchar const *pic,uchar Vol)
; {
.dbline 155
; unsigned char j;
; Set_Page_Address(7); //LCD的左下角显示电池电量
ldi R16,7
xcall _Set_Page_Address
.dbline 156
; Set_Colume_Address(0x00);
clr R16
xcall _Set_Colume_Address
.dbline 157
; for(j=0;j<0x10;j++) //16列
clr R20
xjmp L47
L44:
.dbline 158
; {
.dbline 159
; send_dat(*(pic+0x10*Vol+j));
ldi R24,16
mul R24,R10
movw R2,R0
add R2,R12
adc R3,R13
mov R30,R20
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
xcall _send_dat
.dbline 160
; }
L45:
.dbline 157
inc R20
L47:
.dbline 157
cpi R20,16
brlo L44
X9:
.dbline -2
L43:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r j 20 c
.dbsym r Vol 10 c
.dbsym r pic 12 pkc
.dbend
.dbfunc e Display_Picture _Display_Picture fV
; i -> R20
; j -> R22
; pic -> R10,R11
.even
_Display_Picture::
xcall push_xgsetF00C
movw R10,R16
.dbline -1
.dbline 165
; }
;
; //=======显示图形===============
; void Display_Picture(uchar const *pic)
; {
.dbline 167
; unsigned char i,j;
; for(i=0;i<8;i++)
clr R20
xjmp L52
L49:
.dbline 168
; {
.dbline 169
; Set_Page_Address(i);
mov R16,R20
xcall _Set_Page_Address
.dbline 170
; Set_Colume_Address(0x00);
clr R16
xcall _Set_Colume_Address
.dbline 171
; for(j=0;j<0x80;j++)
clr R22
xjmp L56
L53:
.dbline 172
; {
.dbline 173
; send_dat(*(pic+0x80*i+j));
ldi R24,128
mul R24,R20
movw R2,R0
add R2,R10
adc R3,R11
mov R30,R22
clr R31
add R30,R2
adc R31,R3
lpm R16,Z
xcall _send_dat
.dbline 174
; }
L54:
.dbline 171
inc R22
L56:
.dbline 171
cpi R22,128
brlo L53
X10:
.dbline 175
; }
L50:
.dbline 167
inc R20
L52:
.dbline 167
cpi R20,8
brlo L49
X11:
.dbline -2
L48:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r i 20 c
.dbsym r j 22 c
.dbsym r pic 10 pkc
.dbend
.dbfunc e PrintConstAscStr _PrintConstAscStr fV
; Ty -> R22
; i -> R10
; Tx -> R20
; Len -> y+11
; str -> y+9
; l -> R10
; h -> R12
.even
_PrintConstAscStr::
xcall push_xgsetF03C
mov R10,R18
mov R12,R16
sbiw R28,1
.dbline -1
.dbline 183
; }
;
; //在指定位置显示指定长度的ASCII字符串
; //h,l:行位置与列位置
; //str:字符串
; //Len:字符串长度,以字节为单位
; void PrintConstAscStr(uchar h,uchar l,uchar const *str,uchar Len)
; {
.dbline 185
; uchar i,Tx,Ty;
; Ty=h;Tx=l;
mov R22,R12
.dbline 185
mov R20,R10
.dbline 186
; for(i=0;i<Len;i++)
clr R10
xjmp L61
L58:
.dbline 187
; {
.dbline 188
; PrintOneASCII(Ty,Tx,str[i]);
mov R30,R10
clr R31
ldd R0,y+9
ldd R1,y+10
add R30,R0
adc R31,R1
lpm R2,Z
std y+0,R2
mov R18,R20
mov R16,R22
xcall _PrintOneASCII
.dbline 189
; Tx+=8;
subi R20,248 ; addi 8
.dbline 190
; if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
cpi R20,128
brlo L62
X12:
.dbline 190
.dbline 190
mov R24,R22
subi R24,255 ; addi 1
andi R24,7
mov R22,R24
.dbline 190
clr R20
.dbline 190
L62:
.dbline 191
; }
L59:
.dbline 186
inc R10
L61:
.dbline 186
ldd R0,y+11
cp R10,R0
brlo L58
X13:
.dbline -2
L57:
.dbline 0 ; func end
adiw R28,1
xjmp pop_xgsetF03C
.dbsym r Ty 22 c
.dbsym r i 10 c
.dbsym r Tx 20 c
.dbsym l Len 11 c
.dbsym l str 9 pkc
.dbsym r l 10 c
.dbsym r h 12 c
.dbend
.dbfunc e PrintAscStr _PrintAscStr fV
; Ty -> R22
; i -> R10
; Tx -> R20
; Len -> y+11
; str -> y+9
; l -> R10
; h -> R12
.even
_PrintAscStr::
xcall push_xgsetF03C
mov R10,R18
mov R12,R16
sbiw R28,1
.dbline -1
.dbline 199
; }
;
; //在指定位置显示指定长度的ASCII字符串
; //h,l:行位置与列位置
; //str:字符串
; //Len:字符串长度,以字节为单位
; void PrintAscStr(uchar h,uchar l,uchar *str,uchar Len)
; {
.dbline 201
; uchar i,Tx,Ty;
; Ty=h;Tx=l;
mov R22,R12
.dbline 201
mov R20,R10
.dbline 202
; for(i=0;i<Len;i++)
clr R10
xjmp L68
L65:
.dbline 203
; {
.dbline 204
; PrintOneASCII(Ty,Tx,str[i]);
mov R30,R10
clr R31
ldd R0,y+9
ldd R1,y+10
add R30,R0
adc R31,R1
ldd R2,z+0
std y+0,R2
mov R18,R20
mov R16,R22
xcall _PrintOneASCII
.dbline 205
; Tx+=8;
subi R20,248 ; addi 8
.dbline 206
; if (Tx>=128) { Ty=(Ty+1)&0x07;Tx=0; }
cpi R20,128
brlo L69
X14:
.dbline 206
.dbline 206
mov R24,R22
subi R24,255 ; addi 1
andi R24,7
mov R22,R24
.dbline 206
clr R20
.dbline 206
L69:
.dbline 207
; }
L66:
.dbline 202
inc R10
L68:
.dbline 202
ldd R0,y+11
cp R10,R0
brlo L65
X15:
.dbline -2
L64:
.dbline 0 ; func end
adiw R28,1
xjmp pop_xgsetF03C
.dbsym r Ty 22 c
.dbsym r i 10 c
.dbsym r Tx 20 c
.dbsym l Len 11 c
.dbsym l str 9 pc
.dbsym r l 10 c
.dbsym r h 12 c
.dbend
.dbfunc e PrintOneHZ _PrintOneHZ fV
; LCD_DAT -> <dead>
; Tmp_y -> <dead>
; Tmp_x -> <dead>
; i -> R20
; hzm -> R22,R23
; l -> R10
; h -> R12
.even
_PrintOneHZ::
xcall push_xgsetF03C
mov R10,R18
mov R12,R16
ldd R22,y+8
ldd R23,y+9
.dbline -1
.dbline 214
; }
;
; //在指定的位置显示1个16*16中文字符
; //h,l:行位置与列位置
; //hzm:指向汉字字型数据的指针
; void PrintOneHZ(uchar h,uchar l,unsigned char *hzm)
; {
.dbline 216
; uchar i,Tmp_x,Tmp_y,LCD_DAT;
; if(h<=6 && h>=0 && l>=0 && l<=112) //检查汉字能否正常显示出来
ldi R24,6
cp R24,R12
brsh X24
xjmp L72
X24:
X16:
mov R24,R12
cpi R24,0
brsh X25
xjmp L72
X25:
X17:
mov R24,R10
cpi R24,0
brsh X26
xjmp L72
X26:
X18:
ldi R24,112
cp R24,R10
brsh X27
xjmp L72
X27:
X19:
.dbline 217
; {
.dbline 230
; /* for(i=0;i<16;i++) //竖字
; {
; Tmp_x=h;Tmp_y=l+i;
; Set_Page_Address(Tmp_x);
; Set_Colume_Address(Tmp_y);
; LCD_DAT=*(hzm+(i<<1));
; send_dat(LCD_DAT);
; Set_Page_Address(Tmp_x-1);
; Set_Colume_Address(Tmp_y);
; LCD_DAT=*(hzm+(i<<1)+1);
; send_dat(LCD_DAT);
; } */
; Set_Page_Address(h);
mov R16,R12
xcall _Set_Page_Address
.dbline 231
; Set_Colume_Address(l);
mov R16,R10
xcall _Set_Colume_Address
.dbline 233
; /*先显示汉字上半部分*/
; for(i=0;i<8;i++) send_dat(*(hzm+0+i));
clr R20
xjmp L77
L74:
.dbline 233
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _send_dat
L75:
.dbline 233
inc R20
L77:
.dbline 233
cpi R20,8
brlo L74
X20:
.dbline 234
; for(i=0;i<8;i++) send_dat(*(hzm+8+i));
clr R20
xjmp L81
L78:
.dbline 234
movw R24,R22
adiw R24,8
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _send_dat
L79:
.dbline 234
inc R20
L81:
.dbline 234
cpi R20,8
brlo L78
X21:
.dbline 236
; /*再显示汉字下半部分*/
; Set_Page_Address(h+1);
mov R16,R12
subi R16,255 ; addi 1
xcall _Set_Page_Address
.dbline 237
; Set_Colume_Address(l);
mov R16,R10
xcall _Set_Colume_Address
.dbline 238
; for(i=0;i<8;i++) send_dat(*(hzm+16+i));
clr R20
xjmp L85
L82:
.dbline 238
movw R24,R22
adiw R24,16
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _send_dat
L83:
.dbline 238
inc R20
L85:
.dbline 238
cpi R20,8
brlo L82
X22:
.dbline 239
; for(i=0;i<8;i++) send_dat(*(hzm+24+i));
clr R20
xjmp L89
L86:
.dbline 239
movw R24,R22
adiw R24,24
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _send_dat
L87:
.dbline 239
inc R20
L89:
.dbline 239
cpi R20,8
brlo L86
X23:
.dbline 240
; }
L72:
.dbline -2
L71:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym l LCD_DAT 1 c
.dbsym l Tmp_y 1 c
.dbsym l Tmp_x 1 c
.dbsym r i 20 c
.dbsym r hzm 22 pc
.dbsym r l 10 c
.dbsym r h 12 c
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -