📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile D:\ac18-1\lcd.c
0000 .dbfunc e ePutstr _ePutstr fV
0000 ; l -> R20
0000 ; i -> R22
0000 ; ptr -> R10,R11
0000 ; y -> R12
0000 ; x -> R14
.even
0000 _ePutstr::
0000 0E940000 xcall push_gset5
0004 C22E mov R12,R18
0006 E02E mov R14,R16
0008 2297 sbiw R28,2
000A AC84 ldd R10,y+12
000C BD84 ldd R11,y+13
000E .dbline -1
000E .dbline 15
000E ; #include <iom16v.h>
000E ; #include <macros.h>
000E ; #define uchar unsigned char
000E ; #define uint unsigned int
000E ; #define LCM_RS_1 PORTB|=BIT(PB0)
000E ; #define LCM_RS_0 PORTB&=~BIT(PB0)
000E ; #define LCM_RW_1 PORTB|=BIT(PB2)
000E ; #define LCM_RW_0 PORTB&=~BIT(PB2)
000E ; #define LCM_EN_1 PORTB|=BIT(PB3)
000E ; #define LCM_EN_0 PORTB&=~BIT(PB3)
000E ; #define DataPort PORTC
000E ; #define Busy 0x80
000E ; //***************************************
000E ; void ePutstr(uchar x,uchar y,uchar const *ptr)
000E ; {
000E .dbline 16
000E ; uchar i,l=0;
000E 4427 clr R20
0010 01C0 xjmp L3
0012 L2:
0012 .dbline 17
0012 .dbline 17
0012 4395 inc R20
0014 .dbline 17
0014 L3:
0014 .dbline 17
0014 ; while(ptr[l]>31){l++;}// ptr[l]大于31时,为ASCII码,进入while语句循环,
0014 E42F mov R30,R20
0016 FF27 clr R31
0018 EA0D add R30,R10
001A FB1D adc R31,R11
001C E491 lpm R30,Z
001E 8FE1 ldi R24,31
0020 8E17 cp R24,R30
0022 B8F3 brlo L2
0024 .dbline 19
0024 6627 clr R22
0026 19C0 xjmp L8
0028 L5:
0028 .dbline 19
0028 ; //l累加,计算出字符串长度。
0028 ; for(i=0;i<l;i++){
0028 .dbline 20
0028 ; DisplayOneChar(x++,y,ptr[i]);// 显示单个字符,同时x轴座标递增。
0028 E62F mov R30,R22
002A FF27 clr R31
002C EA0D add R30,R10
002E FB1D adc R31,R11
0030 2490 lpm R2,Z
0032 3324 clr R3
0034 3982 std y+1,R3
0036 2882 std y+0,R2
0038 2C2D mov R18,R12
003A 3327 clr R19
003C 2E2C mov R2,R14
003E 3324 clr R3
0040 822D mov R24,R2
0042 8F5F subi R24,255 ; addi 1
0044 E82E mov R14,R24
0046 022D mov R16,R2
0048 1127 clr R17
004A 31D0 xcall _DisplayOneChar
004C .dbline 21
004C ; if(x==16){//若x等于16,进入if语句。
004C 8E2D mov R24,R14
004E 8031 cpi R24,16
0050 19F4 brne L9
0052 .dbline 21
0052 .dbline 22
0052 ; x=0;y^=1;// x赋0,y与1按位异或(取反)。
0052 EE24 clr R14
0054 .dbline 22
0054 81E0 ldi R24,1
0056 C826 eor R12,R24
0058 .dbline 23
0058 ; }
0058 L9:
0058 .dbline 24
0058 L6:
0058 .dbline 19
0058 6395 inc R22
005A L8:
005A .dbline 19
005A 6417 cp R22,R20
005C 28F3 brlo L5
005E .dbline -2
005E L1:
005E 2296 adiw R28,2
0060 0E940000 xcall pop_gset5
0064 .dbline 0 ; func end
0064 0895 ret
0066 .dbsym r l 20 c
0066 .dbsym r i 22 c
0066 .dbsym r ptr 10 pkc
0066 .dbsym r y 12 c
0066 .dbsym r x 14 c
0066 .dbend
0066 .dbfunc e LocateXY _LocateXY fV
0066 ; temp -> R20
0066 ; posy -> R22
0066 ; posx -> R10
.even
0066 _LocateXY::
0066 0E940000 xcall push_gset3
006A 622F mov R22,R18
006C A02E mov R10,R16
006E .dbline -1
006E .dbline 28
006E ; }
006E ; }
006E ; //*************************************
006E ; void LocateXY(char posx,char posy)
006E ; {
006E .dbline 30
006E ; uchar temp;
006E ; temp&=0x7f;// temp 的变化范围0~15。
006E 4F77 andi R20,127
0070 .dbline 31
0070 ; temp=posx&0x0f;//屏蔽高4位。
0070 4A2D mov R20,R10
0072 4F70 andi R20,15
0074 .dbline 32
0074 ; posy&=0x03;// posy的变化范围0~1。
0074 6370 andi R22,3
0076 .dbline 33
0076 ; switch(posy)
0076 7727 clr R23
0078 6130 cpi R22,1
007A E0E0 ldi R30,0
007C 7E07 cpc R23,R30
007E 49F0 breq L15
0080 6230 cpi R22,2
0082 E0E0 ldi R30,0
0084 7E07 cpc R23,R30
0086 39F0 breq L16
0088 6330 cpi R22,3
008A E0E0 ldi R30,0
008C 7E07 cpc R23,R30
008E 29F0 breq L17
0090 05C0 xjmp L13
0092 X0:
0092 .dbline 34
0092 ; {
0092 L15:
0092 .dbline 35
0092 ; case 1:temp|=0x40;break;//若posy 为1(显示第2行),地址码+0x40。
0092 4064 ori R20,64
0094 .dbline 35
0094 03C0 xjmp L13
0096 L16:
0096 .dbline 36
0096 ; case 2:temp|=0x10;break;//若posy 为2(显示第3行),地址码+0x10。
0096 4061 ori R20,16
0098 .dbline 36
0098 01C0 xjmp L13
009A L17:
009A .dbline 37
009A ; case 3:temp|=0x50;break;//若posy 为3(显示第3行),地址码+0x50。
009A 4065 ori R20,80
009C .dbline 37
009C .dbline 38
009C ; default:break;
009C L13:
009C .dbline 40
009C ; }
009C ; temp|=0x80;//指令码为地址码+0x80。
009C 4068 ori R20,128
009E .dbline 41
009E ; LcdWriteCommand(temp,0);// 将指令temp 写入LCM,忽略忙信号检测。
009E 2227 clr R18
00A0 3327 clr R19
00A2 042F mov R16,R20
00A4 1127 clr R17
00A6 45D0 xcall _LcdWriteCommand
00A8 .dbline -2
00A8 L11:
00A8 0E940000 xcall pop_gset3
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r temp 20 c
00AE .dbsym r posy 22 c
00AE .dbsym r posx 10 c
00AE .dbend
00AE .dbfunc e DisplayOneChar _DisplayOneChar fV
00AE ; Wdata -> y+4
00AE ; y -> R22
00AE ; x -> R20
.even
00AE _DisplayOneChar::
00AE 0E940000 xcall push_gset2
00B2 622F mov R22,R18
00B4 402F mov R20,R16
00B6 .dbline -1
00B6 .dbline 45
00B6 ; }
00B6 ; //**************************************
00B6 ; void DisplayOneChar(uchar x,uchar y,uchar Wdata)
00B6 ; {
00B6 .dbline 46
00B6 ; LocateXY(x,y);//调用LocateXY 函数定位显示地址。
00B6 262F mov R18,R22
00B8 042F mov R16,R20
00BA D5DF xcall _LocateXY
00BC .dbline 47
00BC ; LcdWriteData(Wdata);//将数据Wdata写入LCM。
00BC 0C81 ldd R16,y+4
00BE 1127 clr R17
00C0 4FD0 xcall _LcdWriteData
00C2 .dbline -2
00C2 L18:
00C2 0E940000 xcall pop_gset2
00C6 .dbline 0 ; func end
00C6 0895 ret
00C8 .dbsym l Wdata 4 c
00C8 .dbsym r y 22 c
00C8 .dbsym r x 20 c
00C8 .dbend
00C8 .dbfunc e InitLcd _InitLcd fV
.even
00C8 _InitLcd::
00C8 .dbline -1
00C8 .dbline 51
00C8 ; }
00C8 ; //****************************************
00C8 ; void InitLcd(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -