📄 timer.lst
字号:
__start:
__text_start:
0031 E5CF LDI R28,0x5F
0032 E0D4 LDI R29,4
0033 BFCD OUT 0x3D,R28
0034 BFDE OUT 0x3E,R29
0035 52C0 SUBI R28,0x20
0036 40D0 SBCI R29,0
0037 EA0A LDI R16,0xAA
0038 8308 STD Y+0,R16
0039 2400 CLR R0
003A E6EE LDI R30,0x6E
003B E0F0 LDI R31,0
003C E010 LDI R17,0
003D 37E4 CPI R30,0x74
003E 07F1 CPC R31,R17
003F F011 BEQ 0x0042
0040 9201 ST R0,Z+
0041 CFFB RJMP 0x003D
0042 8300 STD Z+0,R16
0043 E5E4 LDI R30,0x54
0044 E0F0 LDI R31,0
0045 E6A0 LDI R26,0x60
0046 E0B0 LDI R27,0
0047 E010 LDI R17,0
0048 36E2 CPI R30,0x62
0049 07F1 CPC R31,R17
004A F021 BEQ 0x004F
004B 95C8 LPM
004C 9631 ADIW R30,1
004D 920D ST R0,X+
004E CFF9 RJMP 0x0048
004F 940E0346 CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: G:\Demo\LCD_1602.h
(0001) //定义MCU与LCD的接口
(0002) //根据实际情况更改
(0003) #define LCD_RS_DDR DDRA
(0004) #define LCD_RS_PORT PORTA //数据/命令
(0005) #define LCD_RS 0x08 //portc3 out
(0006)
(0007) #define LCD_RW_DDR DDRA
(0008) #define LCD_RW_PORT PORTA //读/写
(0009) #define LCD_RW 0x04 //portc2 out
(0010)
(0011) #define LCD_EN_DDR DDRA
(0012) #define LCD_EN_PORT PORTA //使能信号
(0013) #define LCD_EN 0x02 //portc1 out
(0014)
(0015) #define LCD_DATA_PORT PORTA
(0016) #define LCD_DATA_DDR DDRA
(0017) #define LCD_DATA_PIN PINA
(0018) #define LCD_DATA 0xf0 //portc4/5/6/7 out
(0019) #define LCD_BUSY 7 //portc7
(0020) /*--------------------------------------------------------------------------------------------------
(0021) Public function prototypes
(0022) --------------------------------------------------------------------------------------------------*/
(0023) void LCD_init (void);
(0024) void LCD_en_write (void);
(0025) unsigned char LCD_write_char (unsigned command,unsigned data);
(0026) unsigned char LCD_wait_Ready (void);
(0027) void LCD_set_xy (unsigned char x, unsigned char y);
(0028) unsigned char LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0029) unsigned char LCD_write_uint8(unsigned char X, unsigned char Y, unsigned int data, unsigned char num);
(0030) void delay_nus (unsigned int n);
(0031) void delay_nms (unsigned int n);
(0032) /**********************************************************
(0033) 光标命令
(0034) LCD_write_char(0x0e,0); //光标开
(0035) LCD_write_char(0x0d,0); //光标所在字符闪烁
(0036) LCD_write_char(0x0c,0); //光标关
(0037) **********************************************************/
(0038) /**********************************************************
(0039) TC1602B LCD DISPLAY
(0040) 建立时间:2003年11月9号
(0041) 修改日期:2003年11月14号
(0042) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0043) 入命令
(0044) LCD第一行显示寄存器地址:0X80-0X8F
(0045) LCD第二行显示寄存器地址:0XC0-0XCF
(0046) **********************************************************/
(0047) void LCD_init(void)
(0048) { //add io intial
(0049) LCD_EN_DDR |= LCD_EN; LCD_EN_PORT &= ~LCD_EN;
_LCD_init:
0052 9AD1 SBI 0x1A,1
0053 98D9 CBI 0x1B,1
(0050) LCD_RW_DDR |= LCD_RW; LCD_RW_PORT &= ~LCD_RW;
0054 9AD2 SBI 0x1A,2
0055 98DA CBI 0x1B,2
(0051) LCD_RS_DDR |= LCD_RS; LCD_RS_PORT &= ~LCD_RS;
0056 9AD3 SBI 0x1A,3
0057 98DB CBI 0x1B,3
(0052)
(0053) LCD_DATA_DDR |= LCD_DATA;
0058 B38A IN R24,0x1A
0059 6F80 ORI R24,0xF0
005A BB8A OUT 0x1A,R24
(0054)
(0055) delay_nms(25);
005B E109 LDI R16,0x19
005C E010 LDI R17,0
005D D134 RCALL _delay_nms
(0056)
(0057) LCD_write_char(0x28,0); //4bit test
005E 2722 CLR R18
005F 2733 CLR R19
0060 E208 LDI R16,0x28
0061 E010 LDI R17,0
0062 D016 RCALL _LCD_write_char
(0058) LCD_write_char(0x0c,0); //显示开
0063 2722 CLR R18
0064 2733 CLR R19
0065 E00C LDI R16,0xC
0066 E010 LDI R17,0
0067 D011 RCALL _LCD_write_char
(0059) LCD_write_char(0x01,0); //显示清屏
0068 2722 CLR R18
0069 2733 CLR R19
006A E001 LDI R16,1
006B E010 LDI R17,0
006C D00C RCALL _LCD_write_char
(0060) LCD_write_char(0x06,0); //显示光标移动设置
006D 2722 CLR R18
006E 2733 CLR R19
006F E006 LDI R16,6
0070 E010 LDI R17,0
0071 D007 RCALL _LCD_write_char
0072 9508 RET
(0061) }
(0062)
(0063) void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0064) { LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
0073 9AD9 SBI 0x1B,1
(0065) delay_nus(2);
0074 E002 LDI R16,2
0075 E010 LDI R17,0
0076 D102 RCALL _delay_nus
(0066) LCD_EN_PORT &= ~LCD_EN;
0077 98D9 CBI 0x1B,1
0078 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
0079 940E03B1 CALL push_gset4
007B 0169 MOVW R12,R18
007C 0158 MOVW R10,R16
(0067) }
(0068) /*-----------------------------------------------------------------------
(0069) LCD_write_char : 英文字符串显示函数
(0070)
(0071) 输入参数:*s :英文字符串指针;
(0072) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0073) LCD第一行显示寄存器地址:0X80-0X8F
(0074) LCD第一行显示寄存器地址:0XC0-0XCF
(0075)
(0076) 编写日期 :2003-11-19
(0077) 最后修改日期 :2004-8-19
(0078) -----------------------------------------------------------------------*/
(0079) unsigned char LCD_write_char(unsigned command,unsigned data)
(0080) { unsigned command_temp,data_temp;
(0081)
(0082) command_temp = command;
007D 01A5 MOVW R20,R10
(0083) data_temp = data;
007E 01B6 MOVW R22,R12
(0084)
(0085) if( LCD_wait_Ready() == 1 )
007F D05C RCALL _LCD_wait_Ready
0080 3001 CPI R16,1
0081 F411 BNE 0x0084
(0086) { return(1); }
0082 E001 LDI R16,1
0083 C055 RJMP 0x00D9
(0087)
(0088) LCD_RW_PORT &= ~LCD_RW; //RW=0
0084 98DA CBI 0x1B,2
(0089) if (command == 0)
0085 20AA TST R10
0086 F491 BNE 0x0099
0087 20BB TST R11
0088 F481 BNE 0x0099
(0090) { LCD_RS_PORT |= LCD_RS; //RS=1
0089 9ADB SBI 0x1B,3
(0091) asm("nop");
008A 0000 NOP
(0092) LCD_DATA_PORT &= ~LCD_DATA;
008B B38B IN R24,0x1B
008C 708F ANDI R24,0xF
008D BB8B OUT 0x1B,R24
(0093) asm("nop");
008E 0000 NOP
(0094) //LCD_DATA_PORT |= data_temp&LCD_DATA; //send high 4bit
(0095) LCD_DATA_PORT |= (data_temp>>(7-LCD_BUSY)) & LCD_DATA; //send high 4bit
008F 01CB MOVW R24,R22
0090 7F80 ANDI R24,0xF0
0091 7090 ANDI R25,0
0092 B22B IN R2,0x1B
0093 2433 CLR R3
0094 2A28 OR R2,R24
0095 2A39 OR R3,R25
0096 BA2B OUT 0x1B,R2
(0096) asm("nop");
0097 0000 NOP
(0097) }
0098 C00F RJMP 0x00A8
(0098) else
(0099) { LCD_RS_PORT &= ~LCD_RS; //RS=0
0099 98DB CBI 0x1B,3
(0100) asm("nop");
009A 0000 NOP
(0101) LCD_DATA_PORT &= ~LCD_DATA;
009B B38B IN R24,0x1B
009C 708F ANDI R24,0xF
009D BB8B OUT 0x1B,R24
(0102) asm("nop");
009E 0000 NOP
(0103) //LCD_DATA_PORT |= command_temp&LCD_DATA;//send high 4bit
(0104) LCD_DATA_PORT |= (command_temp>>(7-LCD_BUSY)) & LCD_DATA;//send high 4bit
009F 01CA MOVW R24,R20
00A0 7F80 ANDI R24,0xF0
00A1 7090 ANDI R25,0
00A2 B22B IN R2,0x1B
00A3 2433 CLR R3
00A4 2A28 OR R2,R24
00A5 2A39 OR R3,R25
00A6 BA2B OUT 0x1B,R2
(0105) asm("nop");
00A7 0000 NOP
(0106) }
(0107) LCD_en_write();
00A8 DFCA RCALL _LCD_en_write
(0108)
(0109) command_temp=command_temp << 4; //send low 4bit
00A9 0F44 LSL R20
00AA 1F55 ROL R21
00AB 0F44 LSL R20
00AC 1F55 ROL R21
00AD 0F44 LSL R20
00AE 1F55 ROL R21
00AF 0F44 LSL R20
00B0 1F55 ROL R21
(0110) data_temp=data_temp << 4;
00B1 0F66 LSL R22
00B2 1F77 ROL R23
00B3 0F66 LSL R22
00B4 1F77 ROL R23
00B5 0F66 LSL R22
00B6 1F77 ROL R23
00B7 0F66 LSL R22
00B8 1F77 ROL R23
(0111)
(0112) LCD_DATA_PORT &= ~LCD_DATA;
00B9 B38B IN R24,0x1B
00BA 708F ANDI R24,0xF
00BB BB8B OUT 0x1B,R24
(0113) if (command==0)
00BC 20AA TST R10
00BD F459 BNE 0x00C9
00BE 20BB TST R11
00BF F449 BNE 0x00C9
(0114) { //LCD_DATA_PORT |= data_temp&LCD_DATA;
(0115) LCD_DATA_PORT |= (data_temp>>(7-LCD_BUSY)) & LCD_DATA;
00C0 01CB MOVW R24,R22
00C1 7F80 ANDI R24,0xF0
00C2 7090 ANDI R25,0
00C3 B22B IN R2,0x1B
00C4 2433 CLR R3
00C5 2A28 OR R2,R24
00C6 2A39 OR R3,R25
00C7 BA2B OUT 0x1B,R2
(0116) }
00C8 C008 RJMP 0x00D1
(0117) else
(0118) { //LCD_DATA_PORT |= command_temp&LCD_DATA;
(0119) LCD_DATA_PORT |= (command_temp>>(7-LCD_BUSY)) & LCD_DATA;
00C9 01CA MOVW R24,R20
00CA 7F80 ANDI R24,0xF0
00CB 7090 ANDI R25,0
00CC B22B IN R2,0x1B
00CD 2433 CLR R3
00CE 2A28 OR R2,R24
00CF 2A39 OR R3,R25
00D0 BA2B OUT 0x1B,R2
(0120) }
(0121) LCD_en_write();
00D1 DFA1 RCALL _LCD_en_write
(0122)
(0123) LCD_RW_PORT |= LCD_RW;
00D2 9ADA SBI 0x1B,2
(0124) asm("nop");
00D3 0000 NOP
(0125) LCD_RS_PORT ^= LCD_RS;
00D4 E088 LDI R24,0x8
00D5 B22B IN R2,0x1B
00D6 2628 EOR R2,R24
00D7 BA2B OUT 0x1B,R2
(0126)
(0127) return(0);
00D8 2700 CLR R16
00D9 940E03AC CALL pop_gset4
00DB 9508 RET
(0128) }
(0129) #define LCD_ERROR_TIME 1000
(0130) unsigned char LCD_wait_Ready(void) //等待LCD空闲
(0131) { unsigned int temp;
(0132) LCD_DATA_DDR &= ~(1<<LCD_BUSY); //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
temp --> R16
00DC 98D7 CBI 0x1A,7
(0133) asm("nop");
00DD 0000 NOP
(0134) LCD_RW_PORT |= LCD_RW; //RW=1
00DE 9ADA SBI 0x1B,2
(0135) asm("nop");
00DF 0000 NOP
(0136) LCD_RS_PORT &= ~LCD_RS; //RS=0
00E0 98DB CBI 0x1B,3
(0137) asm("nop");
00E1 0000 NOP
(0138) LCD_EN_PORT |= LCD_EN; //EN=1
00E2 9AD9 SBI 0x1B,1
(0139) asm("nop");
00E3 0000 NOP
00E4 C009 RJMP 0x00EE
(0140) while (!( LCD_DATA_PIN&(1<<LCD_BUSY) ) == 0) //RW=1,读PD7,为0表示空闲;
(0141) { temp ++;
00E5 5F0F SUBI R16,0xFF
00E6 4F1F SBCI R17,0xFF
(0142) if( temp > LCD_ERROR_TIME )
00E7 EE88 LDI R24,0xE8
00E8 E093 LDI R25,3
00E9 1780 CP R24,R16
00EA 0791 CPC R25,R17
00EB F410 BCC 0x00EE
(0143) { return(1); }
00EC E001 LDI R16,1
00ED C00F RJMP 0x00FD
00EE 99CF SBIC 0x19,7
00EF C003 RJMP 0x00F3
00F0 E021 LDI R18,1
00F1 E030 LDI R19,0
00F2 C002 RJMP 0x00F5
00F3 2722 CLR R18
00F4 2733 CLR R19
00F5 3020 CPI R18,0
00F6 0723 CPC R18,R19
00F7 F369 BEQ 0x00E5
(0144) }
(0145) asm("nop");
00F8 0000 NOP
(0146) LCD_EN_PORT &= ~LCD_EN; //EN=0
00F9 98D9 CBI 0x1B,1
(0147) asm("nop");
00FA 0000 NOP
(0148) LCD_DATA_DDR |= (1<<LCD_BUSY);
00FB 9AD7 SBI 0x1A,7
(0149) return(0);
00FC 2700 CLR R16
00FD 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00FE 940E03B5 CALL push_gset2
0100 2F42 MOV R20,R18
0101 2F60 MOV R22,R16
(0150) }
(0151)
(0152) /*-----------------------------------------------------------------------
(0153) LCD_set_xy : 设置LCD显示的起始位置
(0154)
(0155) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0156) LCD第一行显示寄存器地址:0X80-0X8F
(0157) LCD第一行显示寄存器地址:0XC0-0XCF
(0158)
(0159) 编写日期 :2004-8-19
(0160) 最后修改日期 :2004-8-19
(0161) -----------------------------------------------------------------------*/
(0162) void LCD_set_xy( unsigned char x, unsigned char y )
(0163) { unsigned char address;
(0164) if (y == 0) address = 0x80 + x;
0102 2344 TST R20
0103 F419 BNE 0x0107
0104 2F46 MOV R20,R22
0105 5840 SUBI R20,0x80
0106 C002 RJMP 0x0109
(0165) else
(0166) address = 0xc0 + x;
0107 2F46 MOV R20,R22
0108 5440 SUBI R20,0x40
(0167) LCD_write_char( address, 0 );
0109 2722 CLR R18
010A 2733 CLR R19
010B 2F04 MOV R16,R20
010C 2711 CLR R17
010D DF6B RCALL _LCD_write_char
010E 940E03A6 CALL pop_gset2
0110 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
0111 940E03B3 CALL push_gset3
0113 2EA2 MOV R10,R18
0114 2F60 MOV R22,R16
0115 814E LDD R20,Y+6
0116 815F LDD R21,Y+7
(0168) }
(0169) /*-----------------------------------------------------------------------
(0170) LCD_write_string : 英文字符串显示函数
(0171)
(0172) 输入参数:*s :英文字符串指针;
(0173) X、Y : 显示字符串的位置
(0174)
(0175) 编写日期 :2004-8-19
(0176) 最后修改日期 :2004-8-19
(0177) -----------------------------------------------------------------------*/
(0178) unsigned char LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0179) { LCD_set_xy( X, Y );
0117 2D2A MOV R18,R10
0118 2F06 MOV R16,R22
0119 DFE4 RCALL _LCD_set_xy
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -