📄 lcd.lst
字号:
__text_start:
__start:
0054 EFCF LDI R28,0xFF
0055 E1D0 LDI R29,0x10
0056 BFCD OUT 0x3D,R28
0057 BFDE OUT 0x3E,R29
0058 51C0 SUBI R28,0x10
0059 40D0 SBCI R29,0
005A EA0A LDI R16,0xAA
005B 8308 STD Y+0,R16
005C 2400 CLR R0
005D E1EC LDI R30,0x1C
005E E0F1 LDI R31,1
005F E011 LDI R17,1
0060 31EC CPI R30,0x1C
0061 07F1 CPC R31,R17
0062 F011 BEQ 0x0065
0063 9201 ST R0,Z+
0064 CFFB RJMP 0x0060
0065 8300 STD Z+0,R16
0066 E8EC LDI R30,0x8C
0067 E0F0 LDI R31,0
0068 E0A0 LDI R26,0
0069 E0B1 LDI R27,1
006A E010 LDI R17,0
006B 3AE8 CPI R30,0xA8
006C 07F1 CPC R31,R17
006D F021 BEQ 0x0072
006E 95C8 LPM
006F 9631 ADIW R30,1
0070 920D ST R0,X+
0071 CFF9 RJMP 0x006B
0072 940E0103 CALL _main
_exit:
0074 CFFF RJMP _exit
FILE: E:\icc\lcd\lcd_init.h
(0001) /*
(0002) LCD12864液晶驱动模块
(0003) */
(0004) /*
(0005) PG0---RS---4
(0006) PG1---R/W--5
(0007) PG2---EN---6
(0008) PA0---DB0---7
(0009) PA1---DB1---8
(0010) PA2---DB2---9
(0011) PA3---DB3---10
(0012) PA4---DB4---11
(0013) PA5---DB5---12
(0014) PA6---DB6---13
(0015) PA7---DB7---14
(0016)
(0017) */
(0018) #include <iom128v.h>
(0019) #include <macros.h>
(0020)
(0021)
(0022) /*命令或是数据选择*/
(0023) /*RS = 0命令,RS = 1数据*/
(0024) #define RS_CLR PORTG&=~(1<<0)
(0025) #define RS_SET PORTG|=(1<<0)
(0026) /*读取或写入选择*/
(0027) /*RW = 1读,RW = 0写*/
(0028) #define RW_CLR PORTG&=~(1<<1)
(0029) #define RW_SET PORTG|=(1<<1)
(0030) /*读写使能信号*/
(0031) /*下降沿有效*/
(0032) #define EN_CLR PORTG&=~(1<<2)
(0033) #define EN_SET PORTG|=(1<<2)
(0034) /*芯片复位脚*/
(0035) /*高电平复位
(0036) #define RST_CLR PORTD&=~(1<<PD7)
(0037) #define RST_SET PORTD|=(1<<PD7)*/
(0038) //延时函数
(0039) void delay (unsigned int n)
(0040) {
(0041) while(n--);
_delay:
n --> R16
0075 0118 MOVW R2,R16
0076 5001 SUBI R16,1
0077 4010 SBCI R17,0
0078 2022 TST R2
0079 F7D9 BNE 0x0075
007A 2033 TST R3
007B F7C9 BNE 0x0075
007C 9508 RET
(0042) }
(0043) void chk_busy(void)
(0044) {
(0045) PORTA=0XFF;
_chk_busy:
007D EF8F LDI R24,0xFF
007E BB8B OUT 0x1B,R24
(0046) RS_CLR;
007F 91800065 LDS R24,0x65
0081 7F8E ANDI R24,0xFE
0082 93800065 STS 0x65,R24
(0047) RW_SET;
0084 91800065 LDS R24,0x65
0086 6082 ORI R24,2
0087 93800065 STS 0x65,R24
(0048)
(0049) DDRA=0X00;
0089 2422 CLR R2
008A BA2A OUT 0x1A,R2
(0050)
(0051) EN_SET;
008B 91800065 LDS R24,0x65
008D 6084 ORI R24,4
008E 93800065 STS 0x65,R24
(0052) while(PINA&0X80);
0090 99CF SBIC 0x19,7
0091 CFFE RJMP 0x0090
(0053) EN_CLR;
0092 91800065 LDS R24,0x65
0094 7F8B ANDI R24,0xFB
0095 93800065 STS 0x65,R24
(0054) DDRA=0XFF;
0097 EF8F LDI R24,0xFF
0098 BB8A OUT 0x1A,R24
0099 9508 RET
_LCD_write_code:
code --> R20
009A 940E011B CALL push_gset1
009C 2F40 MOV R20,R16
(0055) }
(0056) //显示屏命令写入函数
(0057) void LCD_write_code(unsigned char code)
(0058) {
(0059) chk_busy();
009D DFDF RCALL _chk_busy
(0060) RS_CLR;
009E 91800065 LDS R24,0x65
00A0 7F8E ANDI R24,0xFE
00A1 93800065 STS 0x65,R24
(0061) RW_CLR;
00A3 91800065 LDS R24,0x65
00A5 7F8D ANDI R24,0xFD
00A6 93800065 STS 0x65,R24
(0062) PORTA=code;
00A8 BB4B OUT 0x1B,R20
(0063) EN_SET;
00A9 91800065 LDS R24,0x65
00AB 6084 ORI R24,4
00AC 93800065 STS 0x65,R24
(0064) delay(100);
00AE E604 LDI R16,0x64
00AF E010 LDI R17,0
00B0 DFC4 RCALL _delay
(0065) EN_CLR;
00B1 91800065 LDS R24,0x65
00B3 7F8B ANDI R24,0xFB
00B4 93800065 STS 0x65,R24
00B6 940E011E CALL pop_gset1
00B8 9508 RET
_LCD_write_data:
data --> R20
00B9 940E011B CALL push_gset1
00BB 2F40 MOV R20,R16
(0066) }
(0067) //显示屏数据显写入函数
(0068) void LCD_write_data(unsigned char data)
(0069) {
(0070) chk_busy();
00BC DFC0 RCALL _chk_busy
(0071) RS_SET;
00BD 91800065 LDS R24,0x65
00BF 6081 ORI R24,1
00C0 93800065 STS 0x65,R24
(0072) RW_CLR;
00C2 91800065 LDS R24,0x65
00C4 7F8D ANDI R24,0xFD
00C5 93800065 STS 0x65,R24
(0073) PORTA=data;
00C7 BB4B OUT 0x1B,R20
(0074) EN_SET;
00C8 91800065 LDS R24,0x65
00CA 6084 ORI R24,4
00CB 93800065 STS 0x65,R24
(0075) delay(100);
00CD E604 LDI R16,0x64
00CE E010 LDI R17,0
00CF DFA5 RCALL _delay
(0076) EN_CLR;
00D0 91800065 LDS R24,0x65
00D2 7F8B ANDI R24,0xFB
00D3 93800065 STS 0x65,R24
00D5 940E011E CALL pop_gset1
00D7 9508 RET
_disp_char:
asii --> R20
position --> R22
00D8 940E0119 CALL push_gset2
00DA 2F42 MOV R20,R18
00DB 2F60 MOV R22,R16
(0077) }
(0078) /*单个字符输入函数;position--显示位置,data--显示内容*/
(0079) void disp_char(unsigned char position,unsigned char asii)
(0080) {
(0081) LCD_write_code(position);
00DC 2F06 MOV R16,R22
00DD DFBC RCALL _LCD_write_code
(0082) LCD_write_data(asii);
00DE 2F04 MOV R16,R20
00DF DFD9 RCALL _LCD_write_data
00E0 940E0110 CALL pop_gset2
00E2 9508 RET
_disp_word:
word --> R20
position --> R22
00E3 940E0119 CALL push_gset2
00E5 01A9 MOVW R20,R18
00E6 2F60 MOV R22,R16
(0083) }
(0084) /*一串字符输入函数
(0085) void disp_char_str(unsigned char position,unsigned char *str)
(0086) {
(0087) LCD_write_code(position);
(0088) while(*str!=0) //含义???
(0089) {
(0090)
(0091) LCD_write_data(*str);
(0092) str++;
(0093) }
(0094) }*/
(0095) /*汉字输入*/
(0096) void disp_word(unsigned char position,unsigned char *word)
(0097) {
(0098) LCD_write_code(position);//要显示的位置
00E7 2F06 MOV R16,R22
00E8 DFB1 RCALL _LCD_write_code
00E9 C005 RJMP 0x00EF
(0099) while(*word!=0)
(0100) {
(0101) LCD_write_data(*word);
00EA 01FA MOVW R30,R20
00EB 8100 LDD R16,Z+0
00EC DFCC RCALL _LCD_write_data
(0102) word++;
00ED 5F4F SUBI R20,0xFF
00EE 4F5F SBCI R21,0xFF
00EF 01FA MOVW R30,R20
00F0 8020 LDD R2,Z+0
00F1 2022 TST R2
00F2 F7B9 BNE 0x00EA
00F3 940E0110 CALL pop_gset2
00F5 9508 RET
(0103) }
(0104)
(0105) }
(0106)
(0107) //显示屏初始化
(0108) void disp_init(void)
(0109) {
(0110) DDRA=0XFF;
_disp_init:
00F6 EF8F LDI R24,0xFF
00F7 BB8A OUT 0x1A,R24
(0111) //DDRD=(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
(0112) DDRG=0XFF;
00F8 93800064 STS 0x64,R24
(0113)
(0114) LCD_write_code(0x30);//功能设定/*30---基本指令动作
00FA E300 LDI R16,0x30
00FB DF9E RCALL _LCD_write_code
(0115) LCD_write_code(0x01);//清屏,地址指针指向00H
00FC E001 LDI R16,1
00FD DF9C RCALL _LCD_write_code
(0116) LCD_write_code(0x06);//光标的移动方向
00FE E006 LDI R16,6
00FF DF9A RCALL _LCD_write_code
(0117) LCD_write_code(0x0c);//光标反白显示--0x0f/*开显示,关游标
0100 E00C LDI R16,0xC
0101 DF98 RCALL _LCD_write_code
0102 9508 RET
FILE: E:\icc\lcd\lcd.c
(0001) //ICC-AVR application builder : 2008-10-8 下午 04:03:04
(0002) // Target : M128
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "lcd_init.h"
(0008)
(0009) void main(void)
(0010) {
(0011) disp_init();
_main:
0103 DFF2 RCALL _disp_init
(0012) delay(0xffff);
0104 EF0F LDI R16,0xFF
0105 EF1F LDI R17,0xFF
0106 DF6E RCALL _delay
(0013) disp_word(0x80,"任务:EEPROM");
0107 E02F LDI R18,0xF
0108 E031 LDI R19,1
0109 E800 LDI R16,0x80
010A DFD8 RCALL _disp_word
(0014) disp_word(0x90,"2008年10月09日");
FILE: <library>
010B E020 LDI R18,0
010C E031 LDI R19,1
010D E900 LDI R16,0x90
010E DFD4 RCALL _disp_word
010F 9508 RET
pop_gset2:
0110 E0E2 LDI R30,2
0111 940C011F JMP pop
push_gset5:
0113 92FA ST R15,-Y
0114 92EA ST R14,-Y
push_gset4:
0115 92DA ST R13,-Y
0116 92CA ST R12,-Y
push_gset3:
0117 92BA ST R11,-Y
0118 92AA ST R10,-Y
push_gset2:
0119 937A ST R23,-Y
011A 936A ST R22,-Y
push_gset1:
011B 935A ST R21,-Y
011C 934A ST R20,-Y
011D 9508 RET
pop_gset1:
011E E0E1 LDI R30,1
pop:
011F 9149 LD R20,Y+
0120 9159 LD R21,Y+
0121 FDE0 SBRC R30,0
0122 9508 RET
0123 9169 LD R22,Y+
0124 9179 LD R23,Y+
0125 FDE1 SBRC R30,1
0126 9508 RET
0127 90A9 LD R10,Y+
0128 90B9 LD R11,Y+
0129 FDE2 SBRC R30,2
012A 9508 RET
012B 90C9 LD R12,Y+
012C 90D9 LD R13,Y+
012D FDE3 SBRC R30,3
012E 9508 RET
012F 90E9 LD R14,Y+
0130 90F9 LD R15,Y+
0131 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -