📄 lcd_icc.lst
字号:
__text_start:
__start:
0040 E5CF LDI R28,0x5F
0041 E0D4 LDI R29,4
0042 BFCD OUT 0x3D,R28
0043 BFDE OUT 0x3E,R29
0044 51C0 SUBI R28,0x10
0045 40D0 SBCI R29,0
0046 EA0A LDI R16,0xAA
0047 8308 STD Y+0,R16
0048 2400 CLR R0
0049 E8EC LDI R30,0x8C
004A E0F0 LDI R31,0
004B E010 LDI R17,0
004C 39EA CPI R30,0x9A
004D 07F1 CPC R31,R17
004E F011 BEQ 0x0051
004F 9201 ST R0,Z+
0050 CFFB RJMP 0x004C
0051 8300 STD Z+0,R16
0052 E5E4 LDI R30,0x54
0053 E0F0 LDI R31,0
0054 E6A0 LDI R26,0x60
0055 E0B0 LDI R27,0
0056 E010 LDI R17,0
0057 38E0 CPI R30,0x80
0058 07F1 CPC R31,R17
0059 F021 BEQ 0x005E
005A 95C8 LPM
005B 9631 ADIW R30,1
005C 920D ST R0,X+
005D CFF9 RJMP 0x0057
005E 940E01CF CALL _main
_exit:
0060 CFFF RJMP _exit
FILE: D:\练习\LCD显示1602\lcd1602.h
(0001) /**************************************************************************
(0002)
(0003) THE 1602 CHAR LCD LIB
(0004)
(0005) COPYRIGHT (c) 2007 BY zyg.
(0006) -- ALL RIGHTS RESERVED --
(0007)
(0008) File Name: LCD.h
(0009) Author: zhuyiguo
(0010) Created: 2007/4/23
(0011) Modified: NO
(0012) Revision: 1.0
(0013)
(0014) ***************************************************************************/
(0015)
(0016) #ifndef LCD_CHAR_1602_2007_4_23
(0017) #define LCD_CHAR_1602_2007_4_23
(0018) //控制脚定义
(0019) #define RS_D asm("sbi 0x15,2")
(0020) #define RS_I asm("cbi 0x15,2")
(0021) #define RW_R asm("sbi 0x15,3")
(0022) #define RW_W asm("cbi 0x15,3")
(0023) #define E_1 asm("sbi 0x15,4")
(0024) #define E_0 asm("cbi 0x15,4")
(0025)
(0026) //**************************************************************************
(0027) //ATMEGA16初始化
(0028) void port_init(void)
(0029) {
(0030) PORTA = 0x00;
_port_init:
0061 2422 CLR R2
0062 BA2B OUT 0x1B,R2
(0031) DDRA = 0x00;
0063 BA2A OUT 0x1A,R2
(0032) PORTB = 0x00;
0064 BA28 OUT 0x18,R2
(0033) DDRB = 0x00;
0065 BA27 OUT 0x17,R2
(0034) PORTC = 0x10; //m103 output only
0066 E180 LDI R24,0x10
0067 BB85 OUT 0x15,R24
(0035) DDRC = 0x1C;
0068 E18C LDI R24,0x1C
0069 BB84 OUT 0x14,R24
(0036) PORTD = 0x00;
006A BA22 OUT 0x12,R2
(0037) DDRD = 0x00;
006B BA21 OUT 0x11,R2
006C 9508 RET
(0038) }
(0039) //******************************************************************
(0040)
(0041) //Watchdog initialize
(0042) // prescale: 2048K
(0043) void watchdog_init(void)
(0044) {
(0045) WDR(); //this prevents a timout on enabling
_watchdog_init:
006D 95A8 WDR
(0046) WDTCR = 0x0f; //WATCHDOG ENABLED - dont forget to issue WDRs
006E E08F LDI R24,0xF
006F BD81 OUT 0x21,R24
0070 9508 RET
(0047) }
(0048) //******************************************************************
(0049) //TIMER1 initialize - prescale:256
(0050) // WGM: 0) Normal, TOP=0xFFFF
(0051) // desired value: 500mSec
(0052) // actual value: 500.000mSec (0.0%)
(0053) void timer1_init(void)
(0054) {
(0055) TCCR1B = 0x00; //stop
_timer1_init:
0071 2422 CLR R2
0072 BC2E OUT 0x2E,R2
(0056) TCNT1H = 0xC2; //setup
0073 EC82 LDI R24,0xC2
0074 BD8D OUT 0x2D,R24
(0057) TCNT1L = 0xF7;
0075 EF87 LDI R24,0xF7
0076 BD8C OUT 0x2C,R24
(0058) //OCR1AH = 0x3D;
(0059) //OCR1AL = 0x09;
(0060) //OCR1BH = 0x3D;
(0061) //OCR1BL = 0x09;
(0062) //OCR1CH = $OCR1CH$;
(0063) //OCR1CL = $OCR1CL$;
(0064) //ICR1H = 0x3D;
(0065) //ICR1L = 0x09;
(0066) TCCR1A = 0x00;
0077 BC2F OUT 0x2F,R2
(0067) TCCR1B = 0x04; //start Timer
0078 E084 LDI R24,4
0079 BD8E OUT 0x2E,R24
007A 9508 RET
(0068) }
(0069) //******************************************************************
(0070) //call this routine to initialize all peripherals
(0071) void init_devices(void)
(0072) {
(0073) //stop errant interrupts until set up
(0074) CLI(); //disable all interrupts
_init_devices:
007B 94F8 BCLR 7
(0075) port_init();
007C DFE4 RCALL _port_init
(0076) watchdog_init();
007D DFEF RCALL _watchdog_init
(0077) timer1_init();
007E DFF2 RCALL _timer1_init
(0078)
(0079) MCUCR = 0x00;
007F 2422 CLR R2
0080 BE25 OUT 0x35,R2
(0080) GICR = 0xc0;//interrupt int0,int1 enable
0081 EC80 LDI R24,0xC0
0082 BF8B OUT 0x3B,R24
(0081) TIMSK = 0x04; //timer interrupt sources
0083 E084 LDI R24,4
0084 BF89 OUT 0x39,R24
(0082) SEI(); //re-enable interrupts
0085 9478 BSET 7
0086 9508 RET
(0083) //all peripherals are now initialized
(0084) }
(0085) //******************************************************************
(0086) //延时函数
(0087) void delay_us(int time)//微妙级延时函数
(0088) {
(0089) WDR();
_delay_us:
time --> R16
0087 95A8 WDR
0088 C008 RJMP 0x0091
(0090) while(time--)
(0091) {
(0092) NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();
0089 0000 NOP
008A 0000 NOP
008B 0000 NOP
008C 0000 NOP
008D 0000 NOP
008E 0000 NOP
008F 0000 NOP
0090 0000 NOP
0091 0118 MOVW R2,R16
0092 5001 SUBI R16,1
0093 4010 SBCI R17,0
0094 2022 TST R2
0095 F799 BNE 0x0089
0096 2033 TST R3
0097 F789 BNE 0x0089
0098 9508 RET
_delay_ms:
time --> R20
0099 940E05DF CALL push_gset1
009B 01A8 MOVW R20,R16
(0093) }
(0094) }
(0095) void delay_ms(int time)//毫秒级延时函数
(0096) {
009C C003 RJMP 0x00A0
(0097) while(time--)
(0098) {
(0099) delay_us(1000);
009D EE08 LDI R16,0xE8
009E E013 LDI R17,3
009F DFE7 RCALL _delay_us
00A0 011A MOVW R2,R20
00A1 5041 SUBI R20,1
00A2 4050 SBCI R21,0
00A3 2022 TST R2
00A4 F7C1 BNE 0x009D
00A5 2033 TST R3
00A6 F7B1 BNE 0x009D
00A7 940E05E2 CALL pop_gset1
00A9 9508 RET
_lcd_read_code:
code --> R20
00AA 940E05DF CALL push_gset1
(0100) }
(0101) }
(0102)
(0103) //********************************************************************
(0104) //读LCD1602状态字
(0105) unsigned char lcd_read_code(void)
(0106) {
(0107) unsigned char code;
(0108) DDRA=0x00;
00AC 2422 CLR R2
00AD BA2A OUT 0x1A,R2
(0109) RS_I;
00AE 98AA CBI 0x15,2
(0110) RW_R;
00AF 9AAB SBI 0x15,3
(0111) E_1;
00B0 9AAC SBI 0x15,4
(0112) delay_ms(1);
00B1 E001 LDI R16,1
00B2 E010 LDI R17,0
00B3 DFE5 RCALL _delay_ms
(0113) code=PINA;
00B4 B349 IN R20,0x19
(0114) E_0;
00B5 98AC CBI 0x15,4
(0115) RW_W;
00B6 98AB CBI 0x15,3
(0116) DDRA=0xff;
00B7 EF8F LDI R24,0xFF
00B8 BB8A OUT 0x1A,R24
(0117) return code;
00B9 2F04 MOV R16,R20
00BA 940E05E2 CALL pop_gset1
00BC 9508 RET
(0118) }
(0119)
(0120) //*******************************************************************
(0121) //判断LCD是否为忙状态
(0122) void judgebusy(void)
(0123) {
(0124) //unsigned char t;
(0125) //t=lcd_read_code();
(0126) while(((lcd_read_code())&0x80)==0x80)
_judgebusy:
00BD DFEC RCALL _lcd_read_code
00BE 2E20 MOV R2,R16
00BF 2433 CLR R3
00C0 FC27 SBRC R2,7
00C1 CFFB RJMP _judgebusy
00C2 9508 RET
_lcd_write_data:
data --> R20
00C3 940E05DF CALL push_gset1
00C5 2F40 MOV R20,R16
(0127) {
(0128) //t=lcd_read_code();
(0129) //if((t&0x80)!=0x80) break;
(0130)
(0131) }
(0132) }
(0133)
(0134) //写显示数据*******************************************************************
(0135) void lcd_write_data(unsigned char data)
(0136) {
(0137) WDR();
00C6 95A8 WDR
(0138) DDRA=0xff;
00C7 EF8F LDI R24,0xFF
00C8 BB8A OUT 0x1A,R24
(0139) RS_D;
00C9 9AAA SBI 0x15,2
(0140) delay_us(1);
00CA E001 LDI R16,1
00CB E010 LDI R17,0
00CC DFBA RCALL _delay_us
(0141) RW_W;
00CD 98AB CBI 0x15,3
(0142) delay_us(1);
00CE E001 LDI R16,1
00CF E010 LDI R17,0
00D0 DFB6 RCALL _delay_us
(0143) E_1;
00D1 9AAC SBI 0x15,4
(0144) //judgebusy();
(0145) delay_ms(1);
00D2 E001 LDI R16,1
00D3 E010 LDI R17,0
00D4 DFC4 RCALL _delay_ms
(0146) PORTA=data;
00D5 BB4B OUT 0x1B,R20
(0147) E_0;
00D6 98AC CBI 0x15,4
(0148) delay_us(1);
00D7 E001 LDI R16,1
00D8 E010 LDI R17,0
00D9 DFAD RCALL _delay_us
(0149) //E_0;
(0150) RW_R;
00DA 9AAB SBI 0x15,3
(0151) DDRA=0x00;
00DB 2422 CLR R2
00DC BA2A OUT 0x1A,R2
(0152) WDR();
00DD 95A8 WDR
00DE 940E05E2 CALL pop_gset1
00E0 9508 RET
_lcd_write_code:
code --> R20
00E1 940E05DF CALL push_gset1
00E3 2F40 MOV R20,R16
(0153) }
(0154)
(0155) //写状态字********************************************************************
(0156) void lcd_write_code(unsigned char code)
(0157) {
(0158) WDR();
00E4 95A8 WDR
(0159) DDRA=0xff;
00E5 EF8F LDI R24,0xFF
00E6 BB8A OUT 0x1A,R24
(0160) RS_I;
00E7 98AA CBI 0x15,2
(0161) delay_us(1);
00E8 E001 LDI R16,1
00E9 E010 LDI R17,0
00EA DF9C RCALL _delay_us
(0162) RW_W;
00EB 98AB CBI 0x15,3
(0163) delay_us(1);
00EC E001 LDI R16,1
00ED E010 LDI R17,0
00EE DF98 RCALL _delay_us
(0164) E_1;
00EF 9AAC SBI 0x15,4
(0165) //judgebusy();
(0166) delay_ms(1);
00F0 E001 LDI R16,1
00F1 E010 LDI R17,0
00F2 DFA6 RCALL _delay_ms
(0167)
(0168) PORTA=code;
00F3 BB4B OUT 0x1B,R20
(0169) E_0;
00F4 98AC CBI 0x15,4
(0170) delay_us(1);
00F5 E001 LDI R16,1
00F6 E010 LDI R17,0
00F7 DF8F RCALL _delay_us
(0171) //E_0;
(0172) RW_R;
00F8 9AAB SBI 0x15,3
(0173) DDRA=0x00;
00F9 2422 CLR R2
00FA BA2A OUT 0x1A,R2
(0174) WDR();
00FB 95A8 WDR
00FC 940E05E2 CALL pop_gset1
00FE 9508 RET
_Print:
str --> R20
00FF 940E05DF CALL push_gset1
0101 01A8 MOVW R20,R16
(0175) }
(0176)
(0177) //显示字符串******************************************************************
(0178) void Print(unsigned char *str)
(0179) {
0102 C006 RJMP 0x0109
(0180) while(*str!='\0')
(0181) {
(0182) WDR();
0103 95A8 WDR
(0183) lcd_write_data(*str);
0104 01FA MOVW R30,R20
0105 8100 LDD R16,Z+0
0106 DFBC RCALL _lcd_write_data
(0184) //delay_ms(100);
(0185) str++;
0107 5F4F SUBI R20,0xFF
0108 4F5F SBCI R21,0xFF
0109 01FA MOVW R30,R20
010A 8020 LDD R2,Z+0
010B 2022 TST R2
010C F7B1 BNE 0x0103
010D 940E05E2 CALL pop_gset1
010F 9508 RET
_GotoXY:
y --> R22
x --> R20
0110 940E05DD CALL push_gset2
0112 2F62 MOV R22,R18
0113 2F40 MOV R20,R16
(0186) }
(0187) }
(0188)
(0189) //显示位置************************************************************************
(0190) void GotoXY(unsigned char x,unsigned char y)
(0191) {
(0192) if(y==0)
0114 2366 TST R22
0115 F419 BNE 0x0119
(0193) lcd_write_code(0x80|x);
0116 2F04 MOV R16,R20
0117 6800 ORI R16,0x80
0118 DFC8 RCALL _lcd_write_code
(0194) if(y==1)
0119 3061 CPI R22,1
011A F421 BNE 0x011F
(0195) lcd_write_code(0x80|(x-0x40));
011B 2F04 MOV R16,R20
011C 5400 SUBI R16,0x40
011D 6800 ORI R16,0x80
011E DFC2 RCALL _lcd_write_code
011F 940E05D4 CALL pop_gset2
0121 9508 RET
(0196) }
(0197)
(0198) void lcd_init(void)
(0199) {
(0200) WDR();
_lcd_init:
0122 95A8 WDR
(0201) delay_ms(400);//等待LCD稳定
0123 E900 LDI R16,0x90
0124 E011 LDI R17,1
0125 DF73 RCALL _delay_ms
(0202) E_1;
0126 9AAC SBI 0x15,4
(0203) //lcd_write_code(0x01);
(0204) delay_ms(15);
0127 E00F LDI R16,0xF
0128 E010 LDI R17,0
0129 DF6F RCALL _delay_ms
(0205) lcd_write_code(0x38);//显示模式:8位数据端口,2行显示,5*7点阵
012A E308 LDI R16,0x38
012B DFB5 RCALL _lcd_write_code
(0206) delay_ms(5);
012C E005 LDI R16,5
012D E010 LDI R17,0
012E DF6A RCALL _delay_ms
(0207) lcd_write_code(0x38);
012F E308 LDI R16,0x38
0130 DFB0 RCALL _lcd_write_code
(0208) delay_ms(5);
0131 E005 LDI R16,5
0132 E010 LDI R17,0
0133 DF65 RCALL _delay_ms
(0209) lcd_write_code(0x38);
0134 E308 LDI R16,0x38
0135 DFAB RCALL _lcd_write_code
(0210) delay_ms(5);
0136 E005 LDI R16,5
0137 E010 LDI R17,0
0138 DF60 RCALL _delay_ms
(0211) lcd_write_code(0x0C);//开启显示, 无光标
0139 E00C LDI R16,0xC
013A DFA6 RCALL _lcd_write_code
(0212) delay_ms(5);
013B E005 LDI R16,5
013C E010 LDI R17,0
013D DF5B RCALL _delay_ms
(0213) lcd_write_code(0x06);//读写一个字符后光标加1,地址加1
013E E006 LDI R16,6
013F DFA1 RCALL _lcd_write_code
(0214) delay_ms(5);
0140 E005 LDI R16,5
0141 E010 LDI R17,0
0142 DF56 RCALL _delay_ms
(0215) lcd_write_code(0x01);//清屏:数据指针清0,显示清0
0143 E001 LDI R16,1
0144 DF9C RCALL _lcd_write_code
(0216) delay_ms(5);
0145 E005 LDI R16,5
0146 E010 LDI R17,0
0147 DF51 RCALL _delay_ms
(0217) lcd_write_code(0X02);//数据指针清0
0148 E002 LDI R16,2
0149 DF97 RCALL _lcd_write_code
(0218) WDR();
014A 95A8 WDR
014B 9508 RET
_IntToStr:
a --> Y+0
i --> R20
str --> R22
t --> R20
014C 940E05DD CALL push_gset2
014E 01B9 MOVW R22,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -