📄 1602b_lcd_prj.lst
字号:
__start:
__text_start:
002C E5CF LDI R28,0x5F
002D E0D4 LDI R29,4
002E BFCD OUT 0x3D,R28
002F BFDE OUT 0x3E,R29
0030 51C0 SUBI R28,0x10
0031 40D0 SBCI R29,0
0032 EA0A LDI R16,0xAA
0033 8308 STD Y+0,R16
0034 2400 CLR R0
0035 E7E5 LDI R30,0x75
0036 E0F0 LDI R31,0
0037 E010 LDI R17,0
0038 37E7 CPI R30,0x77
0039 07F1 CPC R31,R17
003A F011 BEQ 0x003D
003B 9201 ST R0,Z+
003C CFFB RJMP 0x0038
003D 8300 STD Z+0,R16
003E E4E2 LDI R30,0x42
003F E0F0 LDI R31,0
0040 E6A0 LDI R26,0x60
0041 E0B0 LDI R27,0
0042 E010 LDI R17,0
0043 35E7 CPI R30,0x57
0044 07F1 CPC R31,R17
0045 F021 BEQ 0x004A
0046 95C8 LPM
0047 9631 ADIW R30,1
0048 920D ST R0,X+
0049 CFF9 RJMP 0x0043
004A D1B0 RCALL _main
_exit:
004B CFFF RJMP _exit
FILE: I:\AVR\1602\MEGA8-1602\CLOCKA~1\test6\1602B_LCD.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004)
(0005) /**********************************************************
(0006) 光标命令
(0007) LCD_write_char(0x0e,0); //光标开
(0008) LCD_write_char(0x0d,0); //光标所在字符闪烁
(0009) LCD_write_char(0x0c,0); //光标关
(0010) **********************************************************/
(0011) /**********************************************************
(0012) TC1602B LCD DISPLAY
(0013) 建立时间:2003年11月9号
(0014) 修改日期:2003年11月14号
(0015) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0016) 入命令
(0017) LCD第一行显示寄存器地址:0X80-0X8F
(0018) LCD第二行显示寄存器地址:0XC0-0XCF
(0019) **********************************************************/
(0020) void LCD_init(void)
(0021) {
(0022) delay_nms(20);
_LCD_init:
004C E104 LDI R16,0x14
004D E010 LDI R17,0
004E D1E9 RCALL _delay_nms
(0023)
(0024) LCD_write_char(0x28,0); //4bit test
004F 2722 CLR R18
0050 2733 CLR R19
0051 E208 LDI R16,0x28
0052 E010 LDI R17,0
0053 D016 RCALL _LCD_write_char
(0025) LCD_write_char(0x0c,0); //显示开
0054 2722 CLR R18
0055 2733 CLR R19
0056 E00C LDI R16,0xC
0057 E010 LDI R17,0
0058 D011 RCALL _LCD_write_char
(0026) LCD_write_char(0x01,0); //显示清屏
0059 2722 CLR R18
005A 2733 CLR R19
005B E001 LDI R16,1
005C E010 LDI R17,0
005D D00C RCALL _LCD_write_char
(0027) LCD_write_char(0x06,0); //显示光标移动设置
005E 2722 CLR R18
005F 2733 CLR R19
0060 E006 LDI R16,6
0061 E010 LDI R17,0
0062 D007 RCALL _LCD_write_char
0063 9508 RET
(0028) }
(0029)
(0030) void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0031) {
(0032) LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
0064 9AAD SBI 0x15,5
(0033) delay_nus(5);
0065 E005 LDI R16,5
0066 E010 LDI R17,0
0067 D1B9 RCALL _delay_nus
(0034) LCD_EN_PORT &= ~LCD_EN;
0068 98AD CBI 0x15,5
0069 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
006A D1FA RCALL push_gset4
006B 0169 MOVW R12,R18
006C 0158 MOVW R10,R16
(0035) }
(0036)
(0037) /*-----------------------------------------------------------------------
(0038) LCD_write_char : 英文字符串显示函数
(0039)
(0040) 输入参数:*s :英文字符串指针;
(0041) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0042) LCD第一行显示寄存器地址:0X80-0X8F
(0043) LCD第一行显示寄存器地址:0XC0-0XCF
(0044)
(0045) 编写日期 :2003-11-19
(0046) 最后修改日期 :2004-8-19
(0047) -----------------------------------------------------------------------*/
(0048) void LCD_write_char(unsigned command,unsigned data)
(0049) {
(0050) unsigned command_temp,data_temp;
(0051)
(0052) command_temp = command;
006D 01A5 MOVW R20,R10
(0053) data_temp = data;
006E 01B6 MOVW R22,R12
(0054)
(0055) LCD_wait_Ready();
006F D04E RCALL _LCD_wait_Ready
(0056)
(0057) LCD_RW_PORT &= ~LCD_RW; //RW=0
0070 9893 CBI 0x12,3
(0058)
(0059) if (command == 0)
0071 3040 CPI R20,0
0072 0745 CPC R20,R21
0073 F469 BNE 0x0081
(0060) {
(0061) LCD_RS_PORT |= LCD_RS; //RS=1
0074 9AAC SBI 0x15,4
(0062) LCD_DATA_PORT &= 0X0F;
0075 B382 IN R24,0x12
0076 708F ANDI R24,0xF
0077 BB82 OUT 0x12,R24
(0063) LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
0078 01CB MOVW R24,R22
0079 7F80 ANDI R24,0xF0
007A 7090 ANDI R25,0
007B B222 IN R2,0x12
007C 2433 CLR R3
007D 2A28 OR R2,R24
007E 2A39 OR R3,R25
007F BA22 OUT 0x12,R2
(0064) }
0080 C00C RJMP 0x008D
(0065) else
(0066) {
(0067) LCD_RS_PORT &= ~LCD_RS; //RS=0
0081 98AC CBI 0x15,4
(0068) LCD_DATA_PORT &= 0X0F;
0082 B382 IN R24,0x12
0083 708F ANDI R24,0xF
0084 BB82 OUT 0x12,R24
(0069) LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
0085 01CA MOVW R24,R20
0086 7F80 ANDI R24,0xF0
0087 7090 ANDI R25,0
0088 B222 IN R2,0x12
0089 2433 CLR R3
008A 2A28 OR R2,R24
008B 2A39 OR R3,R25
008C BA22 OUT 0x12,R2
(0070) }
(0071) LCD_en_write();
008D DFD6 RCALL _LCD_en_write
(0072)
(0073) command_temp=command_temp << 4; //send low 4bit
008E 0F44 LSL R20
008F 1F55 ROL R21
0090 0F44 LSL R20
0091 1F55 ROL R21
0092 0F44 LSL R20
0093 1F55 ROL R21
0094 0F44 LSL R20
0095 1F55 ROL R21
(0074) data_temp=data_temp << 4;
0096 0F66 LSL R22
0097 1F77 ROL R23
0098 0F66 LSL R22
0099 1F77 ROL R23
009A 0F66 LSL R22
009B 1F77 ROL R23
009C 0F66 LSL R22
009D 1F77 ROL R23
(0075)
(0076) LCD_DATA_PORT &= 0X0F;
009E B382 IN R24,0x12
009F 708F ANDI R24,0xF
00A0 BB82 OUT 0x12,R24
(0077) if (command==0)
00A1 20AA TST R10
00A2 F459 BNE 0x00AE
00A3 20BB TST R11
00A4 F449 BNE 0x00AE
(0078) LCD_DATA_PORT |= data_temp&0xf0;
00A5 01CB MOVW R24,R22
00A6 7F80 ANDI R24,0xF0
00A7 7090 ANDI R25,0
00A8 B222 IN R2,0x12
00A9 2433 CLR R3
00AA 2A28 OR R2,R24
00AB 2A39 OR R3,R25
00AC BA22 OUT 0x12,R2
00AD C008 RJMP 0x00B6
(0079) else
(0080) LCD_DATA_PORT |= command_temp&0xf0;
00AE 01CA MOVW R24,R20
00AF 7F80 ANDI R24,0xF0
00B0 7090 ANDI R25,0
00B1 B222 IN R2,0x12
00B2 2433 CLR R3
00B3 2A28 OR R2,R24
00B4 2A39 OR R3,R25
00B5 BA22 OUT 0x12,R2
(0081) LCD_en_write();
00B6 DFAD RCALL _LCD_en_write
(0082)
(0083) LCD_RW_PORT |= LCD_RW;
00B7 9A93 SBI 0x12,3
(0084)
(0085) LCD_RS_PORT ^= LCD_RS;
00B8 E180 LDI R24,0x10
00B9 B225 IN R2,0x15
00BA 2628 EOR R2,R24
00BB BA25 OUT 0x15,R2
00BC D1A4 RCALL pop_gset4
00BD 9508 RET
(0086) }
(0087)
(0088) void LCD_wait_Ready(void) //等待LCD空闲
(0089) {
(0090) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
00BE 988F CBI 0x11,7
(0091)
(0092) LCD_RW_PORT |= LCD_RW; //RW=1
00BF 9A93 SBI 0x12,3
(0093)
(0094) LCD_RS_PORT &= ~LCD_RS; //RS=0
00C0 98AC CBI 0x15,4
(0095)
(0096) LCD_EN_PORT |= LCD_EN; //EN=1
00C1 9AAD SBI 0x15,5
(0097)
(0098) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
00C2 9987 SBIC 0x10,7
00C3 C003 RJMP 0x00C7
00C4 E001 LDI R16,1
00C5 E010 LDI R17,0
00C6 C002 RJMP 0x00C9
00C7 2700 CLR R16
00C8 2711 CLR R17
00C9 3000 CPI R16,0
00CA 0701 CPC R16,R17
00CB F3B1 BEQ 0x00C2
(0099)
(0100) LCD_EN_PORT &= ~LCD_EN; //EN=0
00CC 98AD CBI 0x15,5
(0101)
(0102) LCD_DATA_DDR |= 0xf0;
00CD B381 IN R24,0x11
00CE 6F80 ORI R24,0xF0
00CF BB81 OUT 0x11,R24
00D0 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00D1 D197 RCALL push_gset2
00D2 2F42 MOV R20,R18
00D3 2F60 MOV R22,R16
(0103) }
(0104)
(0105) /*-----------------------------------------------------------------------
(0106) LCD_set_xy : 设置LCD显示的起始位置
(0107)
(0108) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0109) LCD第一行显示寄存器地址:0X80-0X8F
(0110) LCD第一行显示寄存器地址:0XC0-0XCF
(0111)
(0112) 编写日期 :2004-8-19
(0113) 最后修改日期 :2004-8-19
(0114) -----------------------------------------------------------------------*/
(0115) void LCD_set_xy( unsigned char x, unsigned char y )
(0116) {
(0117) unsigned char address;
(0118) if (y == 0) address = 0x80 + x;
00D4 2344 TST R20
00D5 F419 BNE 0x00D9
00D6 2F46 MOV R20,R22
00D7 5840 SUBI R20,0x80
00D8 C002 RJMP 0x00DB
(0119) else
(0120) address = 0xc0 + x;
00D9 2F46 MOV R20,R22
00DA 5440 SUBI R20,0x40
(0121) LCD_write_char( address, 0 );
00DB 2722 CLR R18
00DC 2733 CLR R19
00DD 2F04 MOV R16,R20
00DE 2711 CLR R17
00DF DF8A RCALL _LCD_write_char
00E0 D17C RCALL pop_gset2
00E1 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00E2 D184 RCALL push_gset3
00E3 2EA2 MOV R10,R18
00E4 2F60 MOV R22,R16
00E5 814E LDD R20,Y+6
00E6 815F LDD R21,Y+7
(0122) }
(0123) /*-----------------------------------------------------------------------
(0124) LCD_write_string : 英文字符串显示函数
(0125)
(0126) 输入参数:*s :英文字符串指针;
(0127) X、Y : 显示字符串的位置
(0128)
(0129) 编写日期 :2004-8-19
(0130) 最后修改日期 :2004-8-19
(0131) -----------------------------------------------------------------------*/
(0132) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0133) {
(0134) LCD_set_xy( X, Y );
00E7 2D2A MOV R18,R10
00E8 2F06 MOV R16,R22
00E9 DFE7 RCALL _LCD_set_xy
00EA C008 RJMP 0x00F3
(0135)
(0136) while (*s)
(0137) {
(0138) LCD_write_char( 0, *s );
00EB 01FA MOVW R30,R20
00EC 8120 LDD R18,Z+0
00ED 2733 CLR R19
00EE 2700 CLR R16
00EF 2711 CLR R17
00F0 DF79 RCALL _LCD_write_char
(0139) s ++;
00F1 5F4F SUBI R20,0xFF
00F2 4F5F SBCI R21,0xFF
00F3 01FA MOVW R30,R20
00F4 8020 LDD R2,Z+0
00F5 2022 TST R2
00F6 F7A1 BNE 0x00EB
00F7 D167 RCALL pop_gset3
00F8 9508 RET
FILE: I:\AVR\1602\MEGA8-1602\CLOCKA~1\test6\1602B_LCD_TEST.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include <math.h>
(0004) #include "1602LCD.h"
(0005) const unsigned char table[]="0123456789";
(0006) const unsigned char love[]="I Love U,MeiMei!";
(0007) unsigned char h=0x0A,m=0x28,s=0x20,temp1;
(0008) unsigned char ch,ch1=0;
(0009)
(0010) //TIMER1 initialize - prescale:1024
(0011) // WGM: 0) Normal, TOP=0xFFFF
(0012) // desired value: 1Hz
(0013) // actual value: 1.000Hz (0.0%)
(0014) void timer1_init(void)
(0015) {
(0016) TCCR1B = 0x00; //stop
_timer1_init:
00F9 2422 CLR R2
00FA BC2E OUT 0x2E,R2
(0017) TCNT1H = 0xF0; //setup
00FB EF80 LDI R24,0xF0
00FC BD8D OUT 0x2D,R24
(0018) TCNT1L = 0xBE;
00FD EB8E LDI R24,0xBE
00FE BD8C OUT 0x2C,R24
(0019) OCR1AH = 0x0F;
00FF E08F LDI R24,0xF
0100 BD8B OUT 0x2B,R24
(0020) OCR1AL = 0x42;
0101 E482 LDI R24,0x42
0102 BD8A OUT 0x2A,R24
(0021) OCR1BH = 0x0F;
0103 E08F LDI R24,0xF
0104 BD89 OUT 0x29,R24
(0022) OCR1BL = 0x42;
0105 E482 LDI R24,0x42
0106 BD88 OUT 0x28,R24
(0023) ICR1H = 0x0F;
0107 E08F LDI R24,0xF
0108 BD87 OUT 0x27,R24
(0024) ICR1L = 0x42;
0109 E482 LDI R24,0x42
010A BD86 OUT 0x26,R24
(0025) TCCR1A = 0x00;
010B BC2F OUT 0x2F,R2
(0026) TCCR1B = 0x04; //start Timer
010C E084 LDI R24,4
010D BD8E OUT 0x2E,R24
010E 9508 RET
_timer1_ovf_isr:
010F D172 RCALL push_lset
0110 9722 SBIW R28,2
(0027) }
(0028)
(0029) #pragma interrupt_handler timer1_ovf_isr:9
(0030) void timer1_ovf_isr(void)
(0031) {
(0032) //TIMER1 has overflowed
(0033) TCNT1H = 0xF0; //reload counter high value
0111 EF80 LDI R24,0xF0
0112 BD8D OUT 0x2D,R24
(0034) TCNT1L = 0xBE; //reload counter low value
0113 EB8E LDI R24,0xBE
0114 BD8C OUT 0x2C,R24
(0035) s++;
0115 91800062 LDS R24,s
0117 5F8F SUBI R24,0xFF
0118 93800062 STS s,R24
(0036) if(s>0x3B)
011A E38B LDI R24,0x3B
011B 90200062 LDS R2,s
011D 1582 CP R24,R2
011E F440 BCC 0x0127
(0037) {s=0x0;
011F 2422 CLR R2
0120 92200062 STS s,R2
(0038) m++;}
0122 91800061 LDS R24,m
0124 5F8F SUBI R24,0xFF
0125 93800061 STS m,R24
(0039) if(m>0x3B)
0127 E38B LDI R24,0x3B
0128 90200061 LDS R2,m
012A 1582 CP R24,R2
012B F440 BCC 0x0134
(0040) {m=0x0;
012C 2422 CLR R2
012D 92200061 STS m,R2
(0041) h++;}
012F 91800060 LDS R24,h
0131 5F8F SUBI R24,0xFF
0132 93800060 STS h,R24
(0042) if(h>0x0C)
0134 E08C LDI R24,0xC
0135 90200060 LDS R2,h
0137 1582 CP R24,R2
0138 F418 BCC 0x013C
(0043) {h=0x0;}
0139 2422 CLR R2
013A 92200060 STS h,R2
(0044)
(0045) write_s(s);
013C 91000062 LDS R16,s
013E 2711 CLR R17
013F D095 RCALL _write_s
(0046) write_m(m);
0140 91000061 LDS R16,m
0142 2711 CLR R17
0143 D066 RCALL _write_m
(0047) write_h(h);
0144 91000060 LDS R16,h
0146 2711 CLR R17
0147 D037 RCALL _write_h
(0048) LCD_set_xy(ch,1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -