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 + -
显示快捷键?