📄 1602_duoji.lst
字号:
__text_start:
__start:
0048 E5CF LDI R28,0x5F
0049 E0D4 LDI R29,4
004A BFCD OUT 0x3D,R28
004B BFDE OUT 0x3E,R29
004C 51C0 SUBI R28,0x10
004D 40D0 SBCI R29,0
004E EA0A LDI R16,0xAA
004F 8308 STD Y+0,R16
0050 2400 CLR R0
0051 E9EB LDI R30,0x9B
0052 E0F0 LDI R31,0
0053 E010 LDI R17,0
0054 3AE3 CPI R30,0xA3
0055 07F1 CPC R31,R17
0056 F011 BEQ 0x0059
0057 9201 ST R0,Z+
0058 CFFB RJMP 0x0054
0059 8300 STD Z+0,R16
005A E5E4 LDI R30,0x54
005B E0F0 LDI R31,0
005C E6A0 LDI R26,0x60
005D E0B0 LDI R27,0
005E E010 LDI R17,0
005F 38EF CPI R30,0x8F
0060 07F1 CPC R31,R17
0061 F021 BEQ 0x0066
0062 95C8 LPM
0063 9631 ADIW R30,1
0064 920D ST R0,X+
0065 CFF9 RJMP 0x005F
0066 940E0274 CALL _main
_exit:
0068 CFFF RJMP _exit
FILE: E:\mcu\avr\test\1602_duoji\1602B_LCD.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004)
(0005) /**********************************************************
(0006) **********************************************************/
(0007) /**********************************************************
(0008) TC1602B LCD DISPLAY
(0009) 建立时间:2003年11月9号
(0010) 修改日期:2003年11月14号
(0011) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0012) 入命令
(0013) LCD第一行显示寄存器地址:0X80-0X8F
(0014) LCD第二行显示寄存器地址:0XC0-0XCF
(0015) **********************************************************/
(0016) void LCD_init(void)
(0017) {
(0018) delay_nms(15);
_LCD_init:
0069 E00F LDI R16,0xF
006A E010 LDI R17,0
006B 940E0344 CALL _delay_nms
(0019)
(0020) LCD_write_char(0x28,0); //4bit test
006D 2722 CLR R18
006E 2733 CLR R19
006F E208 LDI R16,0x28
0070 E010 LDI R17,0
0071 D017 RCALL _LCD_write_char
(0021) LCD_write_char(0x0f,0); //显示开,显示光标,产生闪烁
0072 2722 CLR R18
0073 2733 CLR R19
0074 E00F LDI R16,0xF
0075 E010 LDI R17,0
0076 D012 RCALL _LCD_write_char
(0022) LCD_write_char(0x01,0); //显示清屏
0077 2722 CLR R18
0078 2733 CLR R19
0079 E001 LDI R16,1
007A E010 LDI R17,0
007B D00D RCALL _LCD_write_char
(0023) LCD_write_char(0x06,0); //显示光标移动设置
007C 2722 CLR R18
007D 2733 CLR R19
007E E006 LDI R16,6
007F E010 LDI R17,0
0080 D008 RCALL _LCD_write_char
0081 9508 RET
(0024) }
(0025)
(0026) void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0027) {
(0028) LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
0082 9A95 SBI 0x12,5
(0029) delay_nus(1);
0083 E001 LDI R16,1
0084 E010 LDI R17,0
0085 940E032B CALL _delay_nus
(0030) LCD_EN_PORT &= ~LCD_EN;
0087 9895 CBI 0x12,5
0088 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
0089 940E0446 CALL push_gset4
008B 0169 MOVW R12,R18
008C 0158 MOVW R10,R16
(0031) }
(0032)
(0033) /*-----------------------------------------------------------------------
(0034) LCD_write_char : 英文字符串显示函数
(0035)
(0036) 输入参数:*s :英文字符串指针;
(0037) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0038) LCD第一行显示寄存器地址:0X80-0X8F
(0039) LCD第一行显示寄存器地址:0XC0-0XCF
(0040)
(0041) 编写日期 :2003-11-19
(0042) 最后修改日期 :2004-8-19
(0043) -----------------------------------------------------------------------*/
(0044) void LCD_write_char(unsigned command,unsigned data)//把写数据与写指令结合到了一起
(0045) {
(0046) unsigned command_temp,data_temp;
(0047)
(0048) command_temp = command;
008D 01A5 MOVW R20,R10
(0049) data_temp = data;
008E 01B6 MOVW R22,R12
(0050)
(0051) LCD_wait_Ready();
008F D04F RCALL _LCD_wait_Ready
(0052)
(0053) LCD_RW_PORT &= ~LCD_RW; //RW=0
0090 9893 CBI 0x12,3
(0054)
(0055) if (command == 0)
0091 3040 CPI R20,0
0092 0745 CPC R20,R21
0093 F469 BNE 0x00A1
(0056) {
(0057) LCD_RS_PORT |= LCD_RS; //RS=1
0094 9A94 SBI 0x12,4
(0058) LCD_DATA_PORT &= 0X0F;
0095 B388 IN R24,0x18
0096 708F ANDI R24,0xF
0097 BB88 OUT 0x18,R24
(0059) LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
0098 01CB MOVW R24,R22
0099 7F80 ANDI R24,0xF0
009A 7090 ANDI R25,0
009B B228 IN R2,0x18
009C 2433 CLR R3
009D 2A28 OR R2,R24
009E 2A39 OR R3,R25
009F BA28 OUT 0x18,R2
(0060) }
00A0 C00C RJMP 0x00AD
(0061) else
(0062) {
(0063) LCD_RS_PORT &= ~LCD_RS; //RS=0
00A1 9894 CBI 0x12,4
(0064) LCD_DATA_PORT &= 0X0F;
00A2 B388 IN R24,0x18
00A3 708F ANDI R24,0xF
00A4 BB88 OUT 0x18,R24
(0065) LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
00A5 01CA MOVW R24,R20
00A6 7F80 ANDI R24,0xF0
00A7 7090 ANDI R25,0
00A8 B228 IN R2,0x18
00A9 2433 CLR R3
00AA 2A28 OR R2,R24
00AB 2A39 OR R3,R25
00AC BA28 OUT 0x18,R2
(0066) }
(0067) LCD_en_write();
00AD DFD4 RCALL _LCD_en_write
(0068)
(0069) command_temp=command_temp << 4; //send low 4bit
00AE 0F44 LSL R20
00AF 1F55 ROL R21
00B0 0F44 LSL R20
00B1 1F55 ROL R21
00B2 0F44 LSL R20
00B3 1F55 ROL R21
00B4 0F44 LSL R20
00B5 1F55 ROL R21
(0070) data_temp=data_temp << 4;
00B6 0F66 LSL R22
00B7 1F77 ROL R23
00B8 0F66 LSL R22
00B9 1F77 ROL R23
00BA 0F66 LSL R22
00BB 1F77 ROL R23
00BC 0F66 LSL R22
00BD 1F77 ROL R23
(0071)
(0072) LCD_DATA_PORT &= 0X0F;
00BE B388 IN R24,0x18
00BF 708F ANDI R24,0xF
00C0 BB88 OUT 0x18,R24
(0073) if (command==0)
00C1 20AA TST R10
00C2 F459 BNE 0x00CE
00C3 20BB TST R11
00C4 F449 BNE 0x00CE
(0074) LCD_DATA_PORT |= data_temp&0xf0;
00C5 01CB MOVW R24,R22
00C6 7F80 ANDI R24,0xF0
00C7 7090 ANDI R25,0
00C8 B228 IN R2,0x18
00C9 2433 CLR R3
00CA 2A28 OR R2,R24
00CB 2A39 OR R3,R25
00CC BA28 OUT 0x18,R2
00CD C008 RJMP 0x00D6
(0075) else
(0076) LCD_DATA_PORT |= command_temp&0xf0;
00CE 01CA MOVW R24,R20
00CF 7F80 ANDI R24,0xF0
00D0 7090 ANDI R25,0
00D1 B228 IN R2,0x18
00D2 2433 CLR R3
00D3 2A28 OR R2,R24
00D4 2A39 OR R3,R25
00D5 BA28 OUT 0x18,R2
(0077) LCD_en_write();
00D6 DFAB RCALL _LCD_en_write
(0078)
(0079) LCD_RW_PORT |= LCD_RW;
00D7 9A93 SBI 0x12,3
(0080)
(0081) LCD_RS_PORT ^= LCD_RS;
00D8 E180 LDI R24,0x10
00D9 B222 IN R2,0x12
00DA 2628 EOR R2,R24
00DB BA22 OUT 0x12,R2
00DC 940E0441 CALL pop_gset4
00DE 9508 RET
(0082) }
(0083)
(0084) void LCD_wait_Ready(void) //等待LCD空闲
(0085) {
(0086) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
00DF 98BF CBI 0x17,7
(0087)
(0088) LCD_RW_PORT |= LCD_RW; //RW=1
00E0 9A93 SBI 0x12,3
(0089)
(0090) LCD_RS_PORT &= ~LCD_RS; //RS=0
00E1 9894 CBI 0x12,4
(0091)
(0092) LCD_EN_PORT |= LCD_EN; //EN=1
00E2 9A95 SBI 0x12,5
(0093)
(0094) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
00E3 99B7 SBIC 0x16,7
00E4 C003 RJMP 0x00E8
00E5 E001 LDI R16,1
00E6 E010 LDI R17,0
00E7 C002 RJMP 0x00EA
00E8 2700 CLR R16
00E9 2711 CLR R17
00EA 3000 CPI R16,0
00EB 0701 CPC R16,R17
00EC F3B1 BEQ 0x00E3
(0095)
(0096) LCD_EN_PORT &= ~LCD_EN; //EN=0
00ED 9895 CBI 0x12,5
(0097)
(0098) LCD_DATA_DDR |= 0xf0;
00EE B387 IN R24,0x17
00EF 6F80 ORI R24,0xF0
00F0 BB87 OUT 0x17,R24
00F1 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00F2 940E044A CALL push_gset2
00F4 2F42 MOV R20,R18
00F5 2F60 MOV R22,R16
(0099) }
(0100)
(0101) /*-----------------------------------------------------------------------
(0102) LCD_set_xy : 设置LCD显示的起始位置
(0103)
(0104) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0105) LCD第一行显示寄存器地址:0X80-0X8F
(0106) LCD第一行显示寄存器地址:0XC0-0XCF
(0107)
(0108) 编写日期 :2004-8-19
(0109) 最后修改日期 :2004-8-19
(0110) -----------------------------------------------------------------------*/
(0111) void LCD_set_xy( unsigned char x, unsigned char y )
(0112) {
(0113) unsigned char address;
(0114) if (y == 0) address = 0x80 + x;
00F6 2344 TST R20
00F7 F419 BNE 0x00FB
00F8 2F46 MOV R20,R22
00F9 5840 SUBI R20,0x80
00FA C002 RJMP 0x00FD
(0115) else
(0116) address = 0xc0 + x;
00FB 2F46 MOV R20,R22
00FC 5440 SUBI R20,0x40
(0117) LCD_write_char( address, 0 );
00FD 2722 CLR R18
00FE 2733 CLR R19
00FF 2F04 MOV R16,R20
0100 2711 CLR R17
0101 DF87 RCALL _LCD_write_char
0102 940E043B CALL pop_gset2
0104 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
0105 940E0448 CALL push_gset3
0107 2EA2 MOV R10,R18
0108 2F60 MOV R22,R16
0109 814E LDD R20,Y+6
010A 815F LDD R21,Y+7
(0118) }
(0119) /*-----------------------------------------------------------------------
(0120) LCD_write_string : 英文字符串显示函数
(0121)
(0122) 输入参数:*s :英文字符串指针;
(0123) X、Y : 显示字符串的位置
(0124)
(0125) 编写日期 :2004-8-19
(0126) 最后修改日期 :2004-8-19
(0127) -----------------------------------------------------------------------*/
(0128) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0129) {
(0130) LCD_set_xy( X, Y );
010B 2D2A MOV R18,R10
010C 2F06 MOV R16,R22
010D DFE4 RCALL _LCD_set_xy
010E C008 RJMP 0x0117
(0131)
(0132) while (*s)
(0133) {
(0134) LCD_write_char( 0, *s );
010F 01FA MOVW R30,R20
0110 8120 LDD R18,Z+0
0111 2733 CLR R19
0112 2700 CLR R16
0113 2711 CLR R17
0114 DF74 RCALL _LCD_write_char
(0135) s ++;
0115 5F4F SUBI R20,0xFF
0116 4F5F SBCI R21,0xFF
0117 01FA MOVW R30,R20
0118 8020 LDD R2,Z+0
0119 2022 TST R2
011A F7A1 BNE 0x010F
011B 940E043E CALL pop_gset3
011D 9508 RET
_timer2_ovf_isr:
011E 922A ST R2,-Y
011F 923A ST R3,-Y
0120 938A ST R24,-Y
0121 939A ST R25,-Y
0122 B62F IN R2,0x3F
0123 922A ST R2,-Y
FILE: E:\mcu\avr\test\1602_duoji\1602B_LCD_TEST.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004) volatile int zkb;
(0005) volatile int zq;
(0006) volatile int t1,t2;
(0007) uchar n=0,t=0;
(0008) void delay_1ms(void); //函数声明,本实验中会用到这两个函数
(0009) void delay_nms(unsigned int n);
(0010) /*DS1302函数声明*/
(0011) void write_data(uchar addr,uchar data);
(0012) uchar read_data(uchar addr);
(0013) void init_1302(void);
(0014) void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d,uchar year);
(0015) //PWM信号产生中断函数
(0016) #pragma interrupt_handler timer2_ovf_isr:5
(0017) void timer2_ovf_isr(void)
(0018) {
(0019) // Reinitialize Timer 2 value
(0020) //每次触发为20微秒
(0021) TCNT2 = 0xF1; //反转值,理论值为0xEC 但是实测值为0xEF 有点没搞懂 ??
0124 EF81 LDI R24,0xF1
0125 BD84 OUT 0x24,R24
(0022)
(0023) if((--zq)==0)
0126 9180009F LDS R24,zq
0128 919000A0 LDS R25,zq+1
012A 9701 SBIW R24,1
012B 939000A0 STS zq+1,R25
012D 9380009F STS zq,R24
012F 3080 CPI R24,0
0130 0789 CPC R24,R25
0131 F4C9 BNE 0x014B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -