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

📄 1820.lis

📁 利用AVRM16和DX18B20温度传感器通信
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module _1820.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\单片机\AVR程序\温度传感器\1820.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 42
 0000           ; 
 0000           ;  #include <iom16v.h>
 0000           ;     #include <macros.h>
 0000           ; 
 0000           ; #define LCD_RS_PORT    PORTA  //以下2个要设为同一个口,4脚
 0000           ; #define LCD_RS_DDR     DDRA
 0000           ; #define LCD_RW_PORT    PORTA //以下2个要设为同一个口,5脚
 0000           ; #define LCD_RW_DDR     DDRA
 0000           ; #define LCD_EN_PORT    PORTA //以下2个要设为同一个口,6脚
 0000           ; #define LCD_EN_DDR     DDRA
 0000           ; 
 0000           ; 
 0000           ; #define LCD_DATA_PORT  PORTA  //以下3个要设为同一个口
 0000           ; #define LCD_DATA_DDR   DDRA    //一定要用高4位
 0000           ; #define LCD_DATA_PIN   PINA
 0000           ; 
 0000           ; 
 0000           ; #define LCD_RS         (1<<PA1) //
 0000           ; #define LCD_RW         (1<<PA2)
 0000           ; #define LCD_EN         (1<<PA3) //
 0000           ; #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //
 0000           ; 
 0000           ; 
 0000           ; /*--------------------------------------------------------------------------------------------------
 0000           ;                                   液晶函数说明
 0000           ; --------------------------------------------------------------------------------------------------*/
 0000           ; void LCD_init(void);
 0000           ; void LCD_en_write(void);
 0000           ; void LCD_write_command(unsigned  char command) ;
 0000           ; void LCD_write_data(unsigned char 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 LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
 0000           ; void delay_nus(unsigned int n);
 0000           ; void delay_nms(unsigned int n);
 0000           ; 
 0000           ; /*--------------------------------------------------------------------------------------------------
 0000           ;                                   液晶驱动程序
 0000           ; --------------------------------------------------------------------------------------------------*/
 0000           ;   
 0000           ; void LCD_init(void)         //液晶初始化
 0000           ; {
 0000                   .dbline 43
 0000           ;   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
 0000 8AB3              in R24,0x1a
 0002 806F              ori R24,240
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 44
 0006           ;   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
 0006 D39A              sbi 0x1a,3
 0008                   .dbline 45
 0008           ;   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
 0008 D19A              sbi 0x1a,1
 000A                   .dbline 47
 000A           ;   
 000A           ;   LCD_RW_DDR|=LCD_RW;////////////////////////////////////
 000A D29A              sbi 0x1a,2
 000C                   .dbline 48
 000C           ;   LCD_RW_PORT&=~LCD_RW;/////////////////////////////////
 000C DA98              cbi 0x1b,2
 000E                   .dbline 50
 000E           ;   
 000E           ;   LCD_write_command(0x28); 
 000E 08E2              ldi R16,40
 0010 17D0              xcall _LCD_write_command
 0012                   .dbline 51
 0012           ;   LCD_en_write();
 0012 0DD0              xcall _LCD_en_write
 0014                   .dbline 52
 0014           ;   delay_nus(40);
 0014 08E2              ldi R16,40
 0016 10E0              ldi R17,0
 0018 DCD1              xcall _delay_nus
 001A                   .dbline 53
 001A           ;   LCD_write_command(0x28);  //4位显示
 001A 08E2              ldi R16,40
 001C 11D0              xcall _LCD_write_command
 001E                   .dbline 54
 001E           ;   LCD_write_command(0x0c);  //显示开
 001E 0CE0              ldi R16,12
 0020 0FD0              xcall _LCD_write_command
 0022                   .dbline 55
 0022           ;   LCD_write_command(0x01);  //清屏
 0022 01E0              ldi R16,1
 0024 0DD0              xcall _LCD_write_command
 0026                   .dbline 56
 0026           ;   delay_nms(10);
 0026 0AE0              ldi R16,10
 0028 10E0              ldi R17,0
 002A ECD1              xcall _delay_nms
 002C                   .dbline -2
 002C           L1:
 002C                   .dbline 0 ; func end
 002C 0895              ret
 002E                   .dbend
 002E                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 002E           _LCD_en_write::
 002E                   .dbline -1
 002E                   .dbline 61
 002E           ;  
 002E           ; }
 002E           ; 
 002E           ; void LCD_en_write(void)  //液晶使能
 002E           ; {
 002E                   .dbline 62
 002E           ;   LCD_EN_PORT|=LCD_EN;
 002E DB9A              sbi 0x1b,3
 0030                   .dbline 63
 0030           ;   delay_nus(1);
 0030 01E0              ldi R16,1
 0032 10E0              ldi R17,0
 0034 CED1              xcall _delay_nus
 0036                   .dbline 64
 0036           ;   LCD_EN_PORT&=~LCD_EN;
 0036 DB98              cbi 0x1b,3
 0038                   .dbline 65
 0038           ;   delay_nus(1);
 0038 01E0              ldi R16,1
 003A 10E0              ldi R17,0
 003C CAD1              xcall _delay_nus
 003E                   .dbline -2
 003E           L2:
 003E                   .dbline 0 ; func end
 003E 0895              ret
 0040                   .dbend
 0040                   .dbfunc e LCD_write_command _LCD_write_command fV
 0040           ;        command -> R20
                        .even
 0040           _LCD_write_command::
 0040 0E940000          xcall push_gset1
 0044 402F              mov R20,R16
 0046                   .dbline -1
 0046                   .dbline 74
 0046           ;   
 0046           ; }
 0046           ; 
 0046           ; void LCD_write_command(unsigned char command) 
 0046           ; //_write_command(0x0b)不显示
 0046           ; //LCD_write_command(0x0c)开显示
 0046           ; //LCD_write_command(0x0d)开显示闪且闪
 0046           ; //LCD_write_command(0x0e)开显示闪且不闪
 0046           ; {
 0046                   .dbline 75
 0046           ;   delay_nus(16);
 0046 00E1              ldi R16,16
 0048 10E0              ldi R17,0
 004A C3D1              xcall _delay_nus
 004C                   .dbline 76
 004C           ;   LCD_RS_PORT&=~LCD_RS;        //RS=0
 004C D998              cbi 0x1b,1
 004E                   .dbline 77
 004E           ;   LCD_DATA_PORT&=0X0f;         //清高四位
 004E 8BB3              in R24,0x1b
 0050 8F70              andi R24,15
 0052 8BBB              out 0x1b,R24
 0054                   .dbline 78
 0054           ;   LCD_DATA_PORT|=command&0xf0; //写高四位
 0054 842F              mov R24,R20
 0056 807F              andi R24,240
 0058 2BB2              in R2,0x1b
 005A 282A              or R2,R24
 005C 2BBA              out 0x1b,R2
 005E                   .dbline 79
 005E           ;   LCD_en_write();
 005E E7DF              xcall _LCD_en_write
 0060                   .dbline 80
 0060           ;   command=command<<4;          //低四位移到高四位
 0060 842F              mov R24,R20
 0062 8F70              andi R24,#0x0F
 0064 8295              swap R24
 0066 482F              mov R20,R24
 0068                   .dbline 81
 0068           ;   LCD_DATA_PORT&=0x0f;         //清高四位
 0068 8BB3              in R24,0x1b
 006A 8F70              andi R24,15
 006C 8BBB              out 0x1b,R24
 006E                   .dbline 82
 006E           ;   LCD_DATA_PORT|=command&0xf0; //写低四位
 006E 842F              mov R24,R20
 0070 807F              andi R24,240
 0072 2BB2              in R2,0x1b
 0074 282A              or R2,R24
 0076 2BBA              out 0x1b,R2
 0078                   .dbline 83
 0078           ;   LCD_en_write();
 0078 DADF              xcall _LCD_en_write
 007A                   .dbline -2
 007A           L3:
 007A 0E940000          xcall pop_gset1
 007E                   .dbline 0 ; func end
 007E 0895              ret
 0080                   .dbsym r command 20 c
 0080                   .dbend
 0080                   .dbfunc e LCD_write_data _LCD_write_data fV
 0080           ;           data -> R20
                        .even
 0080           _LCD_write_data::
 0080 0E940000          xcall push_gset1
 0084 402F              mov R20,R16
 0086                   .dbline -1
 0086                   .dbline 88
 0086           ;   
 0086           ; }
 0086           ; 
 0086           ; void LCD_write_data(unsigned char data) //写数据
 0086           ; {
 0086                   .dbline 89
 0086           ;   delay_nus(16);
 0086 00E1              ldi R16,16
 0088 10E0              ldi R17,0
 008A A3D1              xcall _delay_nus
 008C                   .dbline 90
 008C           ;   LCD_RS_PORT|=LCD_RS;       //RS=1
 008C D99A              sbi 0x1b,1
 008E                   .dbline 91
 008E           ;   LCD_DATA_PORT&=0X0f;       //清高四位
 008E 8BB3              in R24,0x1b
 0090 8F70              andi R24,15
 0092 8BBB              out 0x1b,R24
 0094                   .dbline 92
 0094           ;   LCD_DATA_PORT|=data&0xf0;  //写高四位
 0094 842F              mov R24,R20
 0096 807F              andi R24,240
 0098 2BB2              in R2,0x1b
 009A 282A              or R2,R24
 009C 2BBA              out 0x1b,R2
 009E                   .dbline 93
 009E           ;   LCD_en_write();
 009E C7DF              xcall _LCD_en_write
 00A0                   .dbline 94
 00A0           ;   data=data<<4;               //低四位移到高四位
 00A0 842F              mov R24,R20
 00A2 8F70              andi R24,#0x0F
 00A4 8295              swap R24
 00A6 482F              mov R20,R24
 00A8                   .dbline 95
 00A8           ;   LCD_DATA_PORT&=0X0f;        //清高四位
 00A8 8BB3              in R24,0x1b
 00AA 8F70              andi R24,15
 00AC 8BBB              out 0x1b,R24
 00AE                   .dbline 96
 00AE           ;   LCD_DATA_PORT|=data&0xf0;   //写低四位
 00AE 842F              mov R24,R20
 00B0 807F              andi R24,240
 00B2 2BB2              in R2,0x1b
 00B4 282A              or R2,R24
 00B6 2BBA              out 0x1b,R2
 00B8                   .dbline 97
 00B8           ;   LCD_en_write();
 00B8 BADF              xcall _LCD_en_write
 00BA                   .dbline -2
 00BA           L4:
 00BA 0E940000          xcall pop_gset1
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbsym r data 20 c
 00C0                   .dbend
 00C0                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 00C0           ;        address -> R20
 00C0           ;              y -> R20
 00C0           ;              x -> R22
                        .even
 00C0           _LCD_set_xy::
 00C0 0E940000          xcall push_gset2
 00C4 422F              mov R20,R18
 00C6 602F              mov R22,R16
 00C8                   .dbline -1
 00C8                   .dbline 103
 00C8           ;   
 00C8           ; }
 00C8           ; 
 00C8           ; 
 00C8           ; void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
 00C8           ; {
 00C8                   .dbline 105
 00C8           ;     unsigned char address;
 00C8           ;     if (y == 0) address = 0x80 + x;
 00C8 4423              tst R20
 00CA 19F4              brne L6
 00CC                   .dbline 105
 00CC 462F              mov R20,R22
 00CE 4058              subi R20,128    ; addi 128
 00D0 02C0              xjmp L7
 00D2           L6:
 00D2                   .dbline 106
 00D2           ;     else   address = 0xc0 + x;
 00D2 462F              mov R20,R22
 00D4 4054              subi R20,64    ; addi 192
 00D6           L7:
 00D6                   .dbline 107
 00D6           ;     LCD_write_command( address);
 00D6 042F              mov R16,R20
 00D8 B3DF              xcall _LCD_write_command
 00DA                   .dbline -2
 00DA           L5:
 00DA 0E940000          xcall pop_gset2
 00DE                   .dbline 0 ; func end
 00DE 0895              ret
 00E0                   .dbsym r address 20 c
 00E0                   .dbsym r y 20 c
 00E0                   .dbsym r x 22 c
 00E0                   .dbend
 00E0                   .dbfunc e LCD_write_string _LCD_write_string fV
 00E0           ;              s -> R20,R21
 00E0           ;              Y -> R10
 00E0           ;              X -> R22
                        .even
 00E0           _LCD_write_string::
 00E0 0E940000          xcall push_gset3
 00E4 A22E              mov R10,R18
 00E6 602F              mov R22,R16
 00E8 4E81              ldd R20,y+6
 00EA 5F81              ldd R21,y+7
 00EC                   .dbline -1
 00EC                   .dbline 112
 00EC           ;       
 00EC           ; }
 00EC           ;   
 00EC           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
 00EC           ; {
 00EC                   .dbline 113
 00EC           ;     LCD_set_xy( X, Y ); //写地址    
 00EC 2A2D              mov R18,R10
 00EE 062F              mov R16,R22
 00F0 E7DF              xcall _LCD_set_xy
 00F2 05C0              xjmp L10
 00F4           L9:
 00F4                   .dbline 115
 00F4                   .dbline 116
 00F4 FA01              movw R30,R20
 00F6 0081              ldd R16,z+0
 00F8 C3DF              xcall _LCD_write_data
 00FA                   .dbline 117
 00FA 4F5F              subi R20,255  ; offset = 1
 00FC 5F4F              sbci R21,255
 00FE                   .dbline 118
 00FE           L10:
 00FE                   .dbline 114
 00FE           ;     while (*s)  // 写显示字符
 00FE FA01              movw R30,R20
 0100 2080              ldd R2,z+0
 0102 2220              tst R2
 0104 B9F7              brne L9
 0106                   .dbline -2
 0106           L8:
 0106 0E940000          xcall pop_gset3
 010A                   .dbline 0 ; func end
 010A 0895              ret
 010C                   .dbsym r s 20 pc
 010C                   .dbsym r Y 10 c
 010C                   .dbsym r X 22 c
 010C                   .dbend
 010C                   .dbfunc e LCD_write_char _LCD_write_char fV

⌨️ 快捷键说明

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