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

📄 lcd.lis

📁 AVR单片机ATmega16(L)应用实例—红外线转速仪
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module lcd.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\ac19-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(PB1)
 000E           ; #define LCM_RW_0 PORTB&=~BIT(PB1)
 000E           ; #define LCM_EN_1 PORTB|=BIT(PB2)
 000E           ; #define LCM_EN_0 PORTB&=~BIT(PB2)
 000E           ; #define DataPort PORTA
 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 25D0              xcall _DisplayOneChar
 004C                   .dbline 21
 004C           ;       if(x==8){//若x等于16,进入if语句。
 004C 8E2D              mov R24,R14
 004E 8830              cpi R24,8
 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~7。
 006E 4F77              andi R20,127
 0070                   .dbline 31
 0070           ;       temp=posx&0x07;//屏蔽高5位。
 0070 4A2D              mov R20,R10
 0072 4770              andi R20,7
 0074                   .dbline 32
 0074           ;       posy&=0x01;// posy的变化范围0~1。
 0074 6170              andi R22,1
 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 09F0              breq L15
 0080 01C0              xjmp L13
 0082           X0:
 0082                   .dbline 34
 0082           ;       {
 0082           L15:
 0082                   .dbline 35
 0082           ;       case 1:temp|=0x40;break;//若posy 为1(显示第2行),地址码+0x40。
 0082 4064              ori R20,64
 0084                   .dbline 35
 0084                   .dbline 36
 0084           ;       default:break;
 0084           L13:
 0084                   .dbline 38
 0084           ;       }
 0084           ;       temp|=0x80;//指令码为地址码+0x80。
 0084 4068              ori R20,128
 0086                   .dbline 39
 0086           ;       LcdWriteCommand(temp,0);// 将指令temp 写入LCM,忽略忙信号检测。
 0086 2227              clr R18
 0088 3327              clr R19
 008A 042F              mov R16,R20
 008C 1127              clr R17
 008E 45D0              xcall _LcdWriteCommand
 0090                   .dbline -2
 0090           L11:
 0090 0E940000          xcall pop_gset3
 0094                   .dbline 0 ; func end
 0094 0895              ret
 0096                   .dbsym r temp 20 c
 0096                   .dbsym r posy 22 c
 0096                   .dbsym r posx 10 c
 0096                   .dbend
 0096                   .dbfunc e DisplayOneChar _DisplayOneChar fV
 0096           ;          Wdata -> y+4
 0096           ;              y -> R22
 0096           ;              x -> R20
                        .even
 0096           _DisplayOneChar::
 0096 0E940000          xcall push_gset2
 009A 622F              mov R22,R18
 009C 402F              mov R20,R16
 009E                   .dbline -1
 009E                   .dbline 43
 009E           ; }
 009E           ; //**************************************
 009E           ; void DisplayOneChar(uchar x,uchar y,uchar Wdata)
 009E           ; {
 009E                   .dbline 44
 009E           ; LocateXY(x,y);//调用LocateXY 函数定位显示地址。
 009E 262F              mov R18,R22
 00A0 042F              mov R16,R20
 00A2 E1DF              xcall _LocateXY
 00A4                   .dbline 45
 00A4           ; LcdWriteData(Wdata);//将数据Wdata写入LCM。
 00A4 0C81              ldd R16,y+4
 00A6 1127              clr R17
 00A8 4FD0              xcall _LcdWriteData
 00AA                   .dbline -2
 00AA           L16:
 00AA 0E940000          xcall pop_gset2
 00AE                   .dbline 0 ; func end
 00AE 0895              ret
 00B0                   .dbsym l Wdata 4 c
 00B0                   .dbsym r y 22 c
 00B0                   .dbsym r x 20 c
 00B0                   .dbend
 00B0                   .dbfunc e InitLcd _InitLcd fV
                        .even
 00B0           _InitLcd::
 00B0                   .dbline -1
 00B0                   .dbline 49
 00B0           ; }
 00B0           ; //****************************************
 00B0           ; void InitLcd(void)
 00B0           ; {
 00B0                   .dbline 50
 00B0           ; LcdWriteCommand(0x38,0); //8位数据传送,2行显示,5*7字形,不检测忙信号
 00B0 2227              clr R18
 00B2 3327              clr R19
 00B4 08E3              ldi R16,56
 00B6 10E0              ldi R17,0
 00B8 30D0              xcall _LcdWriteCommand
 00BA                   .dbline 51
 00BA           ; Delay_nms(5);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -