1602.lis

来自「AVR M16单片机AD转换测试程序」· LIS 代码 · 共 505 行 · 第 1/2 页

LIS
505
字号
                        .module _1602.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\AVRsource\adc\1602.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 24
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; #define LCD_EN_PORT    PORTC
 0000           ; #define LCD_RW_PORT    PORTC
 0000           ; #define LCD_RS_PORT    PORTC
 0000           ; #define LCD_DATA_PORT  PORTB
 0000           ; #define LCD_DATA_DDR   DDRB
 0000           ; #define LCD_DATA_PIN   PINB
 0000           ; #define LCD_EN         0x80   //portd7        out
 0000           ; #define LCD_RS         0x40   //portc6        out
 0000           ; #define LCD_DATA       0xf0   //portb4/5/6/7   out
 0000           ; 
 0000           ; /*--------------------------------------------------------------------------------------------------
 0000           ; Public function prototypes
 0000           ; --------------------------------------------------------------------------------------------------*/
 0000           ; void LCD_init         (void);
 0000           ; void LCD_en_write     (void);
 0000           ; void LCD_write_char   (unsigned command,unsigned data);
 0000           ; void LCD_set_xy       (unsigned char x, unsigned char y);
 0000           ; void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
 0000           ; void delay_nus        (unsigned int n);
 0000           ; void delay_nms        (unsigned int n);
 0000           ; void LCD_init(void)       //液晶初始化
 0000           ; {
 0000                   .dbline 25
 0000           ;  DDRB|=LCD_DATA;   // 数据为输出
 0000 87B3              in R24,0x17
 0002 806F              ori R24,240
 0004 87BB              out 0x17,R24
 0006                   .dbline 26
 0006           ;  DDRC|=LCD_RS|LCD_EN;  //置位RS.EN
 0006 84B3              in R24,0x14
 0008 806C              ori R24,192
 000A 84BB              out 0x14,R24
 000C                   .dbline 27
 000C           ;  delay_nms(15);
 000C 0FE0              ldi R16,15
 000E 10E0              ldi R17,0
 0010 AFD0              xcall _delay_nms
 0012                   .dbline 28
 0012           ;  LCD_write_char(0x28,0);  //4位显示
 0012 2227              clr R18
 0014 3327              clr R19
 0016 08E2              ldi R16,40
 0018 10E0              ldi R17,0
 001A 3DD0              xcall _LCD_write_char
 001C                   .dbline 29
 001C           ;  LCD_write_char(0x0c,0);  //显示开
 001C 2227              clr R18
 001E 3327              clr R19
 0020 0CE0              ldi R16,12
 0022 10E0              ldi R17,0
 0024 38D0              xcall _LCD_write_char
 0026                   .dbline 30
 0026           ;  LCD_write_char(0x01,0);  //清屏
 0026 2227              clr R18
 0028 3327              clr R19
 002A 01E0              ldi R16,1
 002C 10E0              ldi R17,0
 002E 33D0              xcall _LCD_write_char
 0030                   .dbline -2
 0030           L1:
 0030                   .dbline 0 ; func end
 0030 0895              ret
 0032                   .dbend
 0032                   .dbfunc e LCD_write_string _LCD_write_string fV
 0032           ;              s -> R20,R21
 0032           ;              Y -> R10
 0032           ;              X -> R22
                        .even
 0032           _LCD_write_string::
 0032 0E940000          xcall push_gset3
 0036 A22E              mov R10,R18
 0038 602F              mov R22,R16
 003A 4E81              ldd R20,y+6
 003C 5F81              ldd R21,y+7
 003E                   .dbline -1
 003E                   .dbline 33
 003E           ; }
 003E           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
 003E           ;   {
 003E                   .dbline 34
 003E           ;     LCD_set_xy( X, Y ); //写地址
 003E 2A2D              mov R18,R10
 0040 062F              mov R16,R22
 0042 10D0              xcall _LCD_set_xy
 0044 08C0              xjmp L4
 0046           L3:
 0046                   .dbline 37
 0046                   .dbline 38
 0046 FA01              movw R30,R20
 0048 2081              ldd R18,z+0
 004A 3327              clr R19
 004C 0027              clr R16
 004E 1127              clr R17
 0050 22D0              xcall _LCD_write_char
 0052                   .dbline 39
 0052 4F5F              subi R20,255  ; offset = 1
 0054 5F4F              sbci R21,255
 0056                   .dbline 40
 0056           L4:
 0056                   .dbline 36
 0056           ;     
 0056           ;     while (*s)  // 写显示字符
 0056 FA01              movw R30,R20
 0058 2080              ldd R2,z+0
 005A 2220              tst R2
 005C A1F7              brne L3
 005E                   .dbline -2
 005E           L2:
 005E 0E940000          xcall pop_gset3
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064                   .dbsym r s 20 pc
 0064                   .dbsym r Y 10 c
 0064                   .dbsym r X 22 c
 0064                   .dbend
 0064                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 0064           ;        address -> R20
 0064           ;              y -> R20
 0064           ;              x -> R22
                        .even
 0064           _LCD_set_xy::
 0064 0E940000          xcall push_gset2
 0068 422F              mov R20,R18
 006A 602F              mov R22,R16
 006C                   .dbline -1
 006C                   .dbline 43
 006C           ;       {
 006C           ;         LCD_write_char( 0, *s );
 006C           ;       s ++;
 006C           ;       }
 006C           ;   }
 006C           ;   void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
 006C           ;   {
 006C                   .dbline 45
 006C           ;     unsigned char address;
 006C           ;     if (y == 0) address = 0x80 + x;
 006C 4423              tst R20
 006E 19F4              brne L7
 0070                   .dbline 45
 0070 462F              mov R20,R22
 0072 4058              subi R20,128    ; addi 128
 0074 02C0              xjmp L8
 0076           L7:
 0076                   .dbline 47
 0076           ;     else 
 0076           ;        address = 0xc0 + x;
 0076 462F              mov R20,R22
 0078 4054              subi R20,64    ; addi 192
 007A           L8:
 007A                   .dbline 48
 007A           ;     LCD_write_char( address, 0 );
 007A 2227              clr R18
 007C 3327              clr R19
 007E 042F              mov R16,R20
 0080 1127              clr R17
 0082 09D0              xcall _LCD_write_char
 0084                   .dbline -2
 0084           L6:
 0084 0E940000          xcall pop_gset2
 0088                   .dbline 0 ; func end
 0088 0895              ret
 008A                   .dbsym r address 20 c
 008A                   .dbsym r y 20 c
 008A                   .dbsym r x 22 c
 008A                   .dbend
 008A                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 008A           _LCD_en_write::
 008A                   .dbline -1
 008A                   .dbline 51
 008A           ;   }
 008A           ; void LCD_en_write(void)  //液晶使能
 008A           ; {
 008A                   .dbline 52
 008A           ;   LCD_EN_PORT|=LCD_EN;
 008A AF9A              sbi 0x15,7
 008C                   .dbline 53
 008C           ;   delay_nus(1);
 008C 01E0              ldi R16,1
 008E 10E0              ldi R17,0
 0090 56D0              xcall _delay_nus
 0092                   .dbline 54
 0092           ;   LCD_EN_PORT&=~LCD_EN;
 0092 AF98              cbi 0x15,7
 0094                   .dbline -2
 0094           L9:
 0094                   .dbline 0 ; func end
 0094 0895              ret
 0096                   .dbend
 0096                   .dbfunc e LCD_write_char _LCD_write_char fV
 0096           ;      data_temp -> R22,R23
 0096           ;   command_temp -> R20,R21
 0096           ;           data -> R12,R13
 0096           ;        command -> R10,R11
                        .even
 0096           _LCD_write_char::
 0096 0E940000          xcall push_gset4
 009A 6901              movw R12,R18
 009C 5801              movw R10,R16
 009E                   .dbline -1
 009E                   .dbline 57
 009E           ; }
 009E           ; void LCD_write_char(unsigned command,unsigned data) // 写数据
 009E           ; {
 009E                   .dbline 59
 009E           ;  unsigned command_temp,data_temp;
 009E           ;  command_temp=command;
 009E A501              movw R20,R10
 00A0                   .dbline 60
 00A0           ;  data_temp=data;
 00A0 B601              movw R22,R12
 00A2                   .dbline 61
 00A2           ;  delay_nus(16);
 00A2 00E1              ldi R16,16
 00A4 10E0              ldi R17,0
 00A6 4BD0              xcall _delay_nus
 00A8                   .dbline 62
 00A8           ;  if(command==0)
 00A8 4030              cpi R20,0
 00AA 4507              cpc R20,R21
 00AC 11F5              brne L11
 00AE           X0:
 00AE                   .dbline 63
 00AE           ;  {
 00AE                   .dbline 64
 00AE           ;   LCD_RS_PORT|=LCD_RS;  //RS=1
 00AE AE9A              sbi 0x15,6
 00B0                   .dbline 65
 00B0           ;   LCD_DATA_PORT&=0X0f;
 00B0 88B3              in R24,0x18
 00B2 8F70              andi R24,15
 00B4 88BB              out 0x18,R24
 00B6                   .dbline 66
 00B6           ;   LCD_DATA_PORT|=data_temp&0xf0;  //写高四位
 00B6 CB01              movw R24,R22
 00B8 807F              andi R24,240
 00BA 9070              andi R25,0
 00BC 28B2              in R2,0x18
 00BE 3324              clr R3
 00C0 282A              or R2,R24
 00C2 392A              or R3,R25
 00C4 28BA              out 0x18,R2
 00C6                   .dbline 67

⌨️ 快捷键说明

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