📄 1820.lis
字号:
.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 + -