📄 lcd.lst
字号:
__text_start:
__start:
0039 E5CF LDI R28,0x5F
003A E0D4 LDI R29,4
003B BFCD OUT 0x3D,R28
003C BFDE OUT 0x3E,R29
003D 51C0 SUBI R28,0x10
003E 40D0 SBCI R29,0
003F EA0A LDI R16,0xAA
0040 8308 STD Y+0,R16
0041 2400 CLR R0
0042 E6E0 LDI R30,0x60
0043 E0F0 LDI R31,0
0044 E010 LDI R17,0
0045 36E0 CPI R30,0x60
0046 07F1 CPC R31,R17
0047 F011 BEQ 0x004A
0048 9201 ST R0,Z+
0049 CFFB RJMP 0x0045
004A 8300 STD Z+0,R16
004B E7E2 LDI R30,0x72
004C E0F0 LDI R31,0
004D E6A0 LDI R26,0x60
004E E0B0 LDI R27,0
004F E010 LDI R17,0
0050 37E2 CPI R30,0x72
0051 07F1 CPC R31,R17
0052 F021 BEQ 0x0057
0053 95C8 LPM
0054 9631 ADIW R30,1
0055 920D ST R0,X+
0056 CFF9 RJMP 0x0050
0057 940E00AF CALL _main
_exit:
0059 CFFF RJMP _exit
_delay:
i --> R20
ms --> R16
005A 940E00EB CALL push_gset1
FILE: C:\DOCUME~1\shen\桌面\lcd1602new.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004)
(0005) #define Enableon PORTB |=BIT(3); //EN
(0006) #define Enableoff PORTB &=~BIT(3);
(0007)
(0008) #define Dion PORTB |=BIT(5); //DI
(0009) #define Dioff PORTB &=~BIT(5);
(0010)
(0011) #define RWon PORTB |=BIT(4); //RW
(0012) #define RWoff PORTB &=~BIT(4);
(0013)
(0014)
(0015)
(0016)
(0017) extern const unsigned char dis1[] = {"AVR Demo Board"};
(0018) extern const unsigned char dis2[] = {"98dian@163.com"};
(0019)
(0020) /****************************************************************************
(0021) 函数功能:延时子程序
(0022) 作 者:沈建良
(0023) 时 间:2006年4月25日
(0024) 入口参数:ms
(0025) 出口参数:
(0026) ****************************************************************************/
(0027) void delay(unsigned char ms)
(0028) { // 延时子程序
005C C00C RJMP 0x0069
(0029) int i;
(0030) while(ms--)
(0031) {
(0032) for(i = 0; i< 250; i++)
005D 2744 CLR R20
005E 2755 CLR R21
(0033) {
(0034) NOP();
005F 0000 NOP
(0035) NOP();
0060 0000 NOP
(0036) NOP();
0061 0000 NOP
(0037) NOP();
0062 0000 NOP
0063 5F4F SUBI R20,0xFF
0064 4F5F SBCI R21,0xFF
0065 3F4A CPI R20,0xFA
0066 E0E0 LDI R30,0
0067 075E CPC R21,R30
0068 F3B4 BLT 0x005F
0069 2E20 MOV R2,R16
006A 2433 CLR R3
006B 5001 SUBI R16,1
006C 2022 TST R2
006D F779 BNE 0x005D
006E 940E00EE CALL pop_gset1
0070 9508 RET
(0038) }
(0039) }
(0040) }
(0041)
(0042)
(0043) /****************************************************************************
(0044) 函数功能:测试LCD忙碌状态
(0045) 作 者:沈建良
(0046) 时 间:2006年4月25日
(0047) 入口参数:
(0048) 出口参数:result
(0049) ****************************************************************************/
(0050) void LCD_wait(void) //等待LCD空闲
(0051) {
(0052) DDRC=0x00;
_LCD_wait:
0071 2422 CLR R2
0072 BA24 OUT 0x14,R2
(0053) Dioff;//RS
0073 98C5 CBI 0x18,5
(0054) RWon;
0074 9AC4 SBI 0x18,4
(0055) NOP();
0075 0000 NOP
(0056) Enableon;
0076 9AC3 SBI 0x18,3
(0057) //DDRC=0x00; //input
(0058) //delay(10);
(0059) //while(PINC&0x80);
(0060) while(PINC&0x80);
0077 999F SBIC 0x13,7
0078 CFFE RJMP 0x0077
(0061) Enableoff;
0079 98C3 CBI 0x18,3
(0062) DDRC=0xff; //output
007A EF8F LDI R24,0xFF
007B BB84 OUT 0x14,R24
007C 9508 RET
_write_command:
cmd --> R20
007D 940E00EB CALL push_gset1
007F 2F40 MOV R20,R16
(0063) }
(0064)
(0065)
(0066) /****************************************************************************
(0067) 函数功能:写指令数据到LCD
(0068) 作 者:沈建良
(0069) 时 间:2006年4月25日
(0070) 入口参数:cmd
(0071) 出口参数:
(0072) ****************************************************************************/
(0073) void write_command(unsigned char cmd) //写指令使能
(0074) {
(0075) LCD_wait();
0080 DFF0 RCALL _LCD_wait
(0076) //delay(100);
(0077) Dioff;
0081 98C5 CBI 0x18,5
(0078) RWoff;
0082 98C4 CBI 0x18,4
(0079) Enableoff;
0083 98C3 CBI 0x18,3
(0080) NOP();
0084 0000 NOP
(0081) //delay(10);
(0082) Enableon;//???
0085 9AC3 SBI 0x18,3
(0083) //DDRC=0xff; //output
(0084) //delay(10);
(0085) PORTC=cmd;
0086 BB45 OUT 0x15,R20
(0086) //delay(10);
(0087) //Enableon;
(0088) //delay(10);
(0089) Enableoff;
0087 98C3 CBI 0x18,3
0088 940E00EE CALL pop_gset1
008A 9508 RET
_lcd_pos:
pos --> R20
008B 940E00EB CALL push_gset1
008D 2F40 MOV R20,R16
(0090) }
(0091)
(0092) /****************************************************************************
(0093) 函数功能:设定显示位置
(0094) 作 者:沈建良
(0095) 时 间:2006年4月25日
(0096) 入口参数:pos
(0097) 出口参数:
(0098) ****************************************************************************/
(0099) void lcd_pos(unsigned char pos)
(0100) { //设定显示位置
(0101) write_command(pos | 0x80);
008E 2F04 MOV R16,R20
008F 6800 ORI R16,0x80
0090 DFEC RCALL _write_command
0091 940E00EE CALL pop_gset1
0093 9508 RET
_write_data:
dat --> R20
0094 940E00EB CALL push_gset1
0096 2F40 MOV R20,R16
(0102) }
(0103)
(0104) /****************************************************************************
(0105) 函数功能:写入显示数据到LCD
(0106) 作 者:沈建良
(0107) 时 间:2006年4月25日
(0108) 入口参数:dat
(0109) 出口参数:
(0110) ****************************************************************************/
(0111) void write_data(unsigned char dat)
(0112) {
(0113) LCD_wait();
0097 DFD9 RCALL _LCD_wait
(0114) //delay(100);
(0115) //DDRC=0xff;
(0116) Dion;
0098 9AC5 SBI 0x18,5
(0117) RWoff;
0099 98C4 CBI 0x18,4
(0118) Enableoff;
009A 98C3 CBI 0x18,3
(0119) //delay(10);
(0120) NOP();
009B 0000 NOP
(0121) Enableon;
009C 9AC3 SBI 0x18,3
(0122) //delay(10);
(0123)
(0124) PORTC=dat;
009D BB45 OUT 0x15,R20
(0125) //delay(10);
(0126) //Enableon;
(0127) //delay(10);
(0128) Enableoff;
009E 98C3 CBI 0x18,3
009F 940E00EE CALL pop_gset1
00A1 9508 RET
(0129) }
(0130)
(0131) /****************************************************************************
(0132) 函数功能:LCD初始化
(0133) 作 者:沈建良
(0134) 时 间:2006年4月25日
(0135) 入口参数:
(0136) 出口参数:
(0137) ****************************************************************************/
(0138) void lcd_init(void)
(0139) {
(0140) delay(15); //LCD初始化设定
_lcd_init:
00A2 E00F LDI R16,0xF
00A3 DFB6 RCALL _delay
(0141) write_command(0x38); //
00A4 E308 LDI R16,0x38
00A5 DFD7 RCALL _write_command
(0142) delay(100);
00A6 E604 LDI R16,0x64
00A7 DFB2 RCALL _delay
(0143) write_command(0x01); //清除LCD的显示内容
00A8 E001 LDI R16,1
00A9 DFD3 RCALL _write_command
(0144) write_command(0x06); //
00AA E006 LDI R16,6
00AB DFD1 RCALL _write_command
(0145) write_command(0x0c); //
00AC E00C LDI R16,0xC
00AD DFCF RCALL _write_command
00AE 9508 RET
(0146) }
(0147)
(0148) /****************************************************************************
(0149) 函数功能:主程序
(0150) 作 者:沈建良
(0151) 时 间:2006年4月25日
(0152) 入口参数:
(0153) 出口参数:
(0154) ****************************************************************************/
(0155) void main(void)
(0156) {
(0157) char i;
(0158) DDRC=0xff;
_main:
i --> R20
00AF EF8F LDI R24,0xFF
00B0 BB84 OUT 0x14,R24
(0159) DDRB=0xff;
00B1 BB87 OUT 0x17,R24
(0160) lcd_init(); // 初始化LCD
00B2 DFEF RCALL _lcd_init
(0161) delay(100);
00B3 E604 LDI R16,0x64
00B4 DFA5 RCALL _delay
(0162) lcd_pos(1); // 设置显示位置为第一行的第5个字符
00B5 E001 LDI R16,1
00B6 DFD4 RCALL _lcd_pos
(0163) i = 0;
00B7 2744 CLR R20
00B8 C028 RJMP 0x00E1
(0164) while(1){
(0165)
(0166) while(dis1[i] != '\0')
(0167) { // 显示字符hificat.com
(0168) write_data(dis1[i]);
00B9 E584 LDI R24,0x54
00BA E090 LDI R25,0
00BB 2FE4 MOV R30,R20
00BC 27FF CLR R31
00BD 0FE8 ADD R30,R24
00BE 1FF9 ADC R31,R25
00BF 9104 LPM R16,0(Z)
00C0 DFD3 RCALL _write_data
(0169) i++;
00C1 9543 INC R20
00C2 E584 LDI R24,0x54
00C3 E090 LDI R25,0
00C4 2FE4 MOV R30,R20
00C5 27FF CLR R31
00C6 0FE8 ADD R30,R24
00C7 1FF9 ADC R31,R25
00C8 91E4 LPM R30,0(Z)
00C9 23EE TST R30
00CA F771 BNE 0x00B9
(0170) }
(0171) lcd_pos(0x41); // 设置显示位置为第二行第二个字符
00CB E401 LDI R16,0x41
00CC DFBE RCALL _lcd_pos
(0172) i = 0;
00CD 2744 CLR R20
00CE C009 RJMP 0x00D8
(0173) while(dis2[i] != '\0')
(0174) {
(0175) write_data(dis2[i]); // 显示字符" 0571-85956028
00CF E683 LDI R24,0x63
00D0 E090 LDI R25,0
00D1 2FE4 MOV R30,R20
00D2 27FF CLR R31
00D3 0FE8 ADD R30,R24
00D4 1FF9 ADC R31,R25
00D5 9104 LPM R16,0(Z)
00D6 DFBD RCALL _write_data
(0176) i++;
FILE: <library>
00D7 9543 INC R20
00D8 E683 LDI R24,0x63
00D9 E090 LDI R25,0
00DA 2FE4 MOV R30,R20
00DB 27FF CLR R31
00DC 0FE8 ADD R30,R24
00DD 1FF9 ADC R31,R25
00DE 91E4 LPM R30,0(Z)
00DF 23EE TST R30
00E0 F771 BNE 0x00CF
00E1 CFE0 RJMP 0x00C2
00E2 9508 RET
push_gset5:
00E3 92FA ST R15,-Y
00E4 92EA ST R14,-Y
push_gset4:
00E5 92DA ST R13,-Y
00E6 92CA ST R12,-Y
push_gset3:
00E7 92BA ST R11,-Y
00E8 92AA ST R10,-Y
push_gset2:
00E9 937A ST R23,-Y
00EA 936A ST R22,-Y
push_gset1:
00EB 935A ST R21,-Y
00EC 934A ST R20,-Y
00ED 9508 RET
pop_gset1:
00EE E0E1 LDI R30,1
pop:
00EF 9149 LD R20,Y+
00F0 9159 LD R21,Y+
00F1 FDE0 SBRC R30,0
00F2 9508 RET
00F3 9169 LD R22,Y+
00F4 9179 LD R23,Y+
00F5 FDE1 SBRC R30,1
00F6 9508 RET
00F7 90A9 LD R10,Y+
00F8 90B9 LD R11,Y+
00F9 FDE2 SBRC R30,2
00FA 9508 RET
00FB 90C9 LD R12,Y+
00FC 90D9 LD R13,Y+
00FD FDE3 SBRC R30,3
00FE 9508 RET
00FF 90E9 LD R14,Y+
0100 90F9 LD R15,Y+
0101 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -