📄 1602六线接法练习.lst
字号:
__text_start:
__start:
004A E5CF LDI R28,0x5F
004B E0D4 LDI R29,4
004C BFCD OUT 0x3D,R28
004D BFDE OUT 0x3E,R29
004E 51C0 SUBI R28,0x10
004F 40D0 SBCI R29,0
0050 EA0A LDI R16,0xAA
0051 8308 STD Y+0,R16
0052 2400 CLR R0
0053 E9EF LDI R30,0x9F
0054 E0F0 LDI R31,0
0055 E010 LDI R17,0
0056 39EF CPI R30,0x9F
0057 07F1 CPC R31,R17
0058 F011 BEQ 0x005B
0059 9201 ST R0,Z+
005A CFFB RJMP 0x0056
005B 8300 STD Z+0,R16
005C E5E4 LDI R30,0x54
005D E0F0 LDI R31,0
005E E6A0 LDI R26,0x60
005F E0B0 LDI R27,0
0060 E010 LDI R17,0
0061 39E3 CPI R30,0x93
0062 07F1 CPC R31,R17
0063 F021 BEQ 0x0068
0064 95C8 LPM
0065 9631 ADIW R30,1
0066 920D ST R0,X+
0067 CFF9 RJMP 0x0061
0068 940E0131 CALL _main
_exit:
006A CFFF RJMP _exit
FILE: D:\M16开发板实验教程\icc-avr\lcd1602test\1602.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define LCD_EN_PORT PORTA
(0004) #define LCD_EN_DDR DDRA
(0005) #define LCD_RS_PORT PORTA
(0006) #define LCD_RS_DDR DDRA
(0007) #define LCD_DATA_PORT PORTA
(0008) #define LCD_DATA_DDR DDRA
(0009) #define LCD_DATA_PIN PINA
(0010) #define LCD_EN 0x08 //porta3 out
(0011) #define LCD_RS 0x04 //porta2 out
(0012) #define LCD_DATA 0xf0 //porta4/5/6/7 out
(0013)
(0014) /*--------------------------------------------------------------------------------------------------
(0015) Public function prototypes
(0016) --------------------------------------------------------------------------------------------------*/
(0017) void LCD_init (void);
(0018) void LCD_en_write (void);
(0019) void clear(void);
(0020) void LCD_write_char (unsigned command,unsigned data);
(0021) void LCD_set_xy (unsigned char x, unsigned char y);
(0022) void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0023) extern delay_nus (unsigned int n);
(0024) extern delay_nms (unsigned int n);
(0025)
(0026) /*------------------------------------------------------------
(0027) function: initial the related port of 1602, set the work mode of 1602
(0028) -------------------------------------------------------------*/
(0029) void LCD_init(void) //液晶初始化
(0030) {
(0031) LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
006B B38A IN R24,0x1A
006C 6F80 ORI R24,0xF0
006D BB8A OUT 0x1A,R24
(0032) LCD_EN_DDR|=LCD_EN;
006E 9AD3 SBI 0x1A,3
(0033) LCD_RS_DDR|=LCD_RS;
006F 9AD2 SBI 0x1A,2
(0034) delay_nms(15);
0070 E00F LDI R16,0xF
0071 E010 LDI R17,0
0072 940E0180 CALL _delay_nms
(0035) LCD_write_char(0x28,0); //4位显示
0074 2722 CLR R18
0075 2733 CLR R19
0076 E208 LDI R16,0x28
0077 E010 LDI R17,0
0078 D046 RCALL _LCD_write_char
(0036) delay_nms(15);
0079 E00F LDI R16,0xF
007A E010 LDI R17,0
007B 940E0180 CALL _delay_nms
(0037) LCD_write_char(0x0c,0); //显示开
007D 2722 CLR R18
007E 2733 CLR R19
007F E00C LDI R16,0xC
0080 E010 LDI R17,0
0081 D03D RCALL _LCD_write_char
(0038) delay_nms(15);
0082 E00F LDI R16,0xF
0083 E010 LDI R17,0
0084 940E0180 CALL _delay_nms
(0039) LCD_write_char(0x01,0); //清屏
0086 2722 CLR R18
0087 2733 CLR R19
0088 E001 LDI R16,1
0089 E010 LDI R17,0
008A D034 RCALL _LCD_write_char
008B 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
008C 940E019C CALL push_gset3
008E 2EA2 MOV R10,R18
008F 2F60 MOV R22,R16
0090 814E LDD R20,Y+6
0091 815F LDD R21,Y+7
(0040) }
(0041)
(0042) /*--------------------------------------------------------------------
(0043) fuction: write string to lcd1602
(0044) para: x--the address of a line
(0045) y--the display line
(0046) s--a pointer to a string
(0047) *--------------------------------------------------------------------*/
(0048) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0049) {
(0050) LCD_set_xy( X, Y ); //写地址
0092 2D2A MOV R18,R10
0093 2F06 MOV R16,R22
0094 D010 RCALL _LCD_set_xy
0095 C008 RJMP 0x009E
(0051)
(0052) while (*s) // 写显示字符
(0053) {
(0054) LCD_write_char( 0, *s );
0096 01FA MOVW R30,R20
0097 8120 LDD R18,Z+0
0098 2733 CLR R19
0099 2700 CLR R16
009A 2711 CLR R17
009B D023 RCALL _LCD_write_char
(0055) s ++;
009C 5F4F SUBI R20,0xFF
009D 4F5F SBCI R21,0xFF
009E 01FA MOVW R30,R20
009F 8020 LDD R2,Z+0
00A0 2022 TST R2
00A1 F7A1 BNE 0x0096
00A2 940E0192 CALL pop_gset3
00A4 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00A5 940E019E CALL push_gset2
00A7 2F42 MOV R20,R18
00A8 2F60 MOV R22,R16
(0056) }
(0057) }
(0058) /*------------------------------------------------------------
(0059) function: set the display address
(0060) para: x---the display address of a line limit: 0---15
(0061) y---the display line limit 0 or 1
(0062) --------------------------------------------------------------*/
(0063)
(0064) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0065) {
(0066) unsigned char address;
(0067) if (y == 0) address = 0x80 + x; //the first line
00A9 2344 TST R20
00AA F419 BNE 0x00AE
00AB 2F46 MOV R20,R22
00AC 5840 SUBI R20,0x80
00AD C002 RJMP 0x00B0
(0068) else
(0069) address = 0xc0 + x; //the second line
00AE 2F46 MOV R20,R22
00AF 5440 SUBI R20,0x40
(0070) LCD_write_char( address, 0 );
00B0 2722 CLR R18
00B1 2733 CLR R19
00B2 2F04 MOV R16,R20
00B3 2711 CLR R17
00B4 D00A RCALL _LCD_write_char
00B5 940E018F CALL pop_gset2
00B7 9508 RET
(0071) }
(0072) /*-------------------------------------------------------------
(0073) function : enable or disable the rs line of the lcd1602
(0074) *--------------------------------------------------------------*/
(0075) void LCD_en_write(void) //液晶使能
(0076) {
(0077) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00B8 9ADB SBI 0x1B,3
(0078) delay_nus(5);
00B9 E005 LDI R16,5
00BA E010 LDI R17,0
00BB 940E0167 CALL _delay_nus
(0079) LCD_EN_PORT&=~LCD_EN;
00BD 98DB CBI 0x1B,3
00BE 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
00BF 940E019A CALL push_gset4
00C1 0169 MOVW R12,R18
00C2 0158 MOVW R10,R16
(0080) }
(0081) /*------------------------------------------------------------
(0082) function: write command or data to lcd1602
(0083) prar:
(0084) command: 0---write data, 1-----write command
(0085) data: commad or data which you want to write
(0086) *-------------------------------------------------------------*/
(0087) void LCD_write_char(unsigned command,unsigned data)
(0088) {
(0089) unsigned command_temp,data_temp;
(0090) command_temp=command;
00C3 01A5 MOVW R20,R10
(0091) data_temp=data;
00C4 01B6 MOVW R22,R12
(0092) delay_nus(25);
00C5 E109 LDI R16,0x19
00C6 E010 LDI R17,0
00C7 940E0167 CALL _delay_nus
(0093) if(command==0)
00C9 3040 CPI R20,0
00CA 0745 CPC R20,R21
00CB F511 BNE 0x00EE
(0094) {
(0095) LCD_RS_PORT|=LCD_RS; //RS=1
00CC 9ADA SBI 0x1B,2
(0096) LCD_DATA_PORT&=0X0f;
00CD B38B IN R24,0x1B
00CE 708F ANDI R24,0xF
00CF BB8B OUT 0x1B,R24
(0097) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
00D0 01CB MOVW R24,R22
00D1 7F80 ANDI R24,0xF0
00D2 7090 ANDI R25,0
00D3 B22B IN R2,0x1B
00D4 2433 CLR R3
00D5 2A28 OR R2,R24
00D6 2A39 OR R3,R25
00D7 BA2B OUT 0x1B,R2
(0098) LCD_en_write();
00D8 DFDF RCALL _LCD_en_write
(0099) data_temp=data_temp<<4;
00D9 0F66 LSL R22
00DA 1F77 ROL R23
00DB 0F66 LSL R22
00DC 1F77 ROL R23
00DD 0F66 LSL R22
00DE 1F77 ROL R23
00DF 0F66 LSL R22
00E0 1F77 ROL R23
(0100) LCD_DATA_PORT&=0X0f;
00E1 B38B IN R24,0x1B
00E2 708F ANDI R24,0xF
00E3 BB8B OUT 0x1B,R24
(0101) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
00E4 01CB MOVW R24,R22
00E5 7F80 ANDI R24,0xF0
00E6 7090 ANDI R25,0
00E7 B22B IN R2,0x1B
00E8 2433 CLR R3
00E9 2A28 OR R2,R24
00EA 2A39 OR R3,R25
00EB BA2B OUT 0x1B,R2
(0102) LCD_en_write();
00EC DFCB RCALL _LCD_en_write
(0103) }
00ED C021 RJMP 0x010F
(0104) else
(0105) {
(0106) LCD_RS_PORT&=~LCD_RS; //RS=0
00EE 98DA CBI 0x1B,2
(0107) LCD_DATA_PORT&=0X0f;
00EF B38B IN R24,0x1B
00F0 708F ANDI R24,0xF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -