📄 test.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 E1EB LDI R30,0x1B
005E E0F1 LDI R31,1
005F E011 LDI R17,1
0060 31EB CPI R30,0x1B
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 3AE7 CPI R30,0xA7
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 940E0075 CALL _main
_exit:
0074 CFFF RJMP _exit
_main:
0075 9722 SBIW R28,2
FILE: E:\2007年电子竞赛\LCD1602\main.c
(0001) /*--------------------------------------------------*/
(0002) /* AVR-ARM开发网论坛 */
(0003) /* http://www.avrarm.com */
(0004) /* AVR生成代码测试程序 */
(0005) /*--------------------------------------------------*/
(0006) /* 程序由AVR辅助开发工具V2.1.1自动生成 */
(0007) /* AVR系统的处理器为: ATMega128 */
(0008) /* AVR系统的晶振频率: 1.0000 Mhz */
(0009) /*--------------------------------------------------*/
(0010)
(0011) #include <iom128v.h>
(0012) #include <macros.h>
(0013) #include "lcd.h"
(0014) #include "delay.h"
(0015)
(0016) //-----------------------------------------------------------
(0017) //主函数
(0018) //-----------------------------------------------------------
(0019) void main(void)
(0020) {
(0021)
(0022) LCD16xx_init();
0076 940E00B6 CALL _LCD16xx_init
(0023) LCD16xx_clr(); //显示清屏
0078 940E00DC CALL _LCD16xx_clr
(0024) delay_nms(1);
007A E001 LDI R16,1
007B E010 LDI R17,0
007C 940E0165 CALL _delay_nms
(0025) LCD16xx_write_string(3,0,"Welcome to");
007E E180 LDI R24,0x10
007F E091 LDI R25,1
0080 8399 STD Y+1,R25
0081 8388 STD Y+0,R24
0082 2722 CLR R18
0083 E003 LDI R16,3
0084 940E0134 CALL _LCD16xx_write_string
(0026) LCD16xx_write_string(1,1,"www.stuelab.cn!");
0086 E080 LDI R24,0
0087 E091 LDI R25,1
0088 8399 STD Y+1,R25
0089 8388 STD Y+0,R24
008A E021 LDI R18,1
008B E001 LDI R16,1
008C 940E0134 CALL _LCD16xx_write_string
(0027) delay_nms(500);
008E EF04 LDI R16,0xF4
008F E011 LDI R17,1
0090 940E0165 CALL _delay_nms
(0028) LCD16xx_clr(); //显示清屏
0092 940E00DC CALL _LCD16xx_clr
(0029) delay_nms(2);
0094 E002 LDI R16,2
0095 E010 LDI R17,0
0096 940E0165 CALL _delay_nms
0098 C01A RJMP 0x00B3
(0030)
(0031) while(1)
(0032) {
(0033) LCD16xx_write_string(3,0,"Welcome to");
0099 E180 LDI R24,0x10
009A E091 LDI R25,1
009B 8399 STD Y+1,R25
009C 8388 STD Y+0,R24
009D 2722 CLR R18
009E E003 LDI R16,3
009F 940E0134 CALL _LCD16xx_write_string
(0034) LCD16xx_write_string(1,1,"www.stuelab.cn!");
00A1 E080 LDI R24,0
00A2 E091 LDI R25,1
00A3 8399 STD Y+1,R25
00A4 8388 STD Y+0,R24
00A5 E021 LDI R18,1
00A6 E001 LDI R16,1
00A7 940E0134 CALL _LCD16xx_write_string
(0035) delay_nms(1000);
00A9 EE08 LDI R16,0xE8
00AA E013 LDI R17,3
00AB 940E0165 CALL _delay_nms
(0036) LCD16xx_clr(); //显示清屏
00AD 940E00DC CALL _LCD16xx_clr
(0037) delay_nms(1000);
00AF EE08 LDI R16,0xE8
00B0 E013 LDI R17,3
00B1 940E0165 CALL _delay_nms
00B3 CFE5 RJMP 0x0099
00B4 9622 ADIW R28,2
00B5 9508 RET
FILE: E:\2007年电子竞赛\LCD1602\lcd.c
(0001) /*--------------------------------------------------*/
(0002) /* AVR-ARM开发网论坛 */
(0003) /* http://www.avrarm.com */
(0004) /* AVR生成代码测试程序 */
(0005) /*--------------------------------------------------*/
(0006) /* 程序由AVR辅助开发工具V2.1.1自动生成 */
(0007) /* AVR系统的处理器为: ATMega128 */
(0008) /* AVR系统的晶振频率: 1.0000 Mhz */
(0009) /*--------------------------------------------------*/
(0010)
(0011) #include <iom128v.h>
(0012) #include <macros.h>
(0013) #include "lcd.h"
(0014) #include "delay.h"
(0015)
(0016) /**********************************************************
(0017) 光标命令
(0018) LCD16xx_write_char(1,0x0e); //光标开
(0019) LCD16xx_write_char(1,0x0d); //光标所在字符闪烁
(0020) LCD16xx_write_char(1,0x0c); //光标关
(0021) **********************************************************/
(0022) /**********************************************************
(0023) TC16xxB LCD DISPLAY
(0024) 建立时间:2006年08月30日
(0025) 修改日期:2006年08月30日
(0026) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0027) 入命令
(0028) LCD第一行显示寄存器地址:0x80-0x8F
(0029) LCD第二行显示寄存器地址:0xC0-0xCF
(0030) **********************************************************/
(0031) void LCD16xx_init(void)
(0032) {
(0033) LCD_DATA_DDR |= LCD_DATA;
_LCD16xx_init:
00B6 B38A IN R24,0x1A
00B7 6F80 ORI R24,0xF0
00B8 BB8A OUT 0x1A,R24
(0034) LCD_EN_DDR |= LCD_EN;
00B9 9AD2 SBI 0x1A,2
(0035) LCD_RS_DDR |= LCD_RS;
00BA 9AD0 SBI 0x1A,0
(0036) LCD_RW_DDR |= LCD_RW;
00BB 9AD1 SBI 0x1A,1
(0037) RW_L;
00BC 98D9 CBI 0x1B,1
(0038)
(0039) LCD_DATA_PORT = 0x20;
00BD E280 LDI R24,0x20
00BE BB8B OUT 0x1B,R24
(0040) LCD16xx_en_write();
00BF D015 RCALL _LCD16xx_en_write
(0041) delay_nus(50);
00C0 E302 LDI R16,0x32
00C1 E010 LDI R17,0
00C2 940E0152 CALL _delay_nus
(0042)
(0043) LCD16xx_write_char(1,0x28); //4bit test
00C4 E228 LDI R18,0x28
00C5 E001 LDI R16,1
00C6 D019 RCALL _LCD16xx_write_char
(0044) delay_nms(5);
00C7 E005 LDI R16,5
00C8 E010 LDI R17,0
00C9 940E0165 CALL _delay_nms
(0045) LCD16xx_write_char(1,0x0c); //显示开
00CB E02C LDI R18,0xC
00CC E001 LDI R16,1
00CD D012 RCALL _LCD16xx_write_char
(0046) LCD16xx_write_char(1,0x01); //显示清屏
00CE E021 LDI R18,1
00CF E001 LDI R16,1
00D0 D00F RCALL _LCD16xx_write_char
(0047) LCD16xx_write_char(1,0x06); //显示光标移动设置
00D1 E026 LDI R18,6
00D2 E001 LDI R16,1
00D3 D00C RCALL _LCD16xx_write_char
00D4 9508 RET
(0048) }
(0049)
(0050) void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0051) {
(0052) E_H;
_LCD16xx_en_write:
00D5 9ADA SBI 0x1B,2
(0053) delay_nus(4); //如果晶振频率太高,则可相应提高延时
00D6 E004 LDI R16,4
00D7 E010 LDI R17,0
00D8 940E0152 CALL _delay_nus
(0054) E_L;
00DA 98DA CBI 0x1B,2
00DB 9508 RET
(0055) }
(0056)
(0057) /************************************************************************/
(0058) /* LCD16xx清屏 */
(0059) /************************************************************************/
(0060) void LCD16xx_clr(void)
(0061) {
(0062) LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
00DC E021 LDI R18,1
00DD E001 LDI R16,1
00DE D001 RCALL _LCD16xx_write_char
00DF 9508 RET
_LCD16xx_write_char:
datal --> R20
datah --> R22
data --> R20
command --> R10
00E0 940E017B CALL push_gset3
00E2 2F42 MOV R20,R18
00E3 2EA0 MOV R10,R16
(0063) }
(0064)
(0065) /*-----------------------------------------------------------------------
(0066) LCD16xx_write_char : 英文字符串显示函数
(0067)
(0068) 输入参数:*s :英文字符串指针;
(0069) X、Y : 显示字符串的位置,X:0-15,Y:0-1
(0070) LCD第一行显示寄存器地址:0x80-0x8F
(0071) LCD第一行显示寄存器地址:0xC0-0xCF
(0072) 编写日期 :2006年08月30日
(0073) 最后修改日期 :2006年08月30日
(0074) -----------------------------------------------------------------------*/
(0075) void LCD16xx_write_char(unsigned char command,unsigned char data)
(0076) {
(0077) unsigned char datah,datal;
(0078)
(0079) datah = data;
00E4 2F64 MOV R22,R20
(0080) datal = data<<4 ;
00E5 2F84 MOV R24,R20
00E6 708F ANDI R24,0xF
00E7 9582 SWAP R24
00E8 2F48 MOV R20,R24
(0081)
(0082) //LCD16xx_wait_Ready();
(0083)
(0084) RW_L; //RW=0
00E9 98D9 CBI 0x1B,1
(0085) if (command == 0) //data
00EA 20AA TST R10
00EB F411 BNE 0x00EE
(0086) RS_H; //RS=1
00EC 9AD8 SBI 0x1B,0
00ED C001 RJMP 0x00EF
(0087) else //command
(0088) RS_L; //RS=0
00EE 98D8 CBI 0x1B,0
(0089)
(0090) LCD_DATA_PORT &= 0x0F;
00EF B38B IN R24,0x1B
00F0 708F ANDI R24,0xF
00F1 BB8B OUT 0x1B,R24
(0091) LCD_DATA_PORT |= datah&0xf0; //send high 4bit
00F2 2F86 MOV R24,R22
00F3 7F80 ANDI R24,0xF0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -