⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.lis

📁 AVR单片机ATmega16(L)应用实例1——风机测试仪
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -