📄 aa.lst
字号:
__text_start:
__start:
0034 E5CF LDI R28,0x5F
0035 E0D4 LDI R29,4
0036 BFCD OUT 0x3D,R28
0037 BFDE OUT 0x3E,R29
0038 51C0 SUBI R28,0x10
0039 40D0 SBCI R29,0
003A EA0A LDI R16,0xAA
003B 8308 STD Y+0,R16
003C 2400 CLR R0
003D E7E4 LDI R30,0x74
003E E0F0 LDI R31,0
003F E010 LDI R17,0
0040 37E4 CPI R30,0x74
0041 07F1 CPC R31,R17
0042 F011 BEQ 0x0045
0043 9201 ST R0,Z+
0044 CFFB RJMP 0x0040
0045 8300 STD Z+0,R16
0046 E5E4 LDI R30,0x54
0047 E0F0 LDI R31,0
0048 E6A0 LDI R26,0x60
0049 E0B0 LDI R27,0
004A E010 LDI R17,0
004B 36E8 CPI R30,0x68
004C 07F1 CPC R31,R17
004D F021 BEQ 0x0052
004E 95C8 LPM
004F 9631 ADIW R30,1
0050 920D ST R0,X+
0051 CFF9 RJMP 0x004B
0052 940E0110 CALL _main
_exit:
0054 CFFF RJMP _exit
FILE: E:\avr\测试\lcd1\lcd.c
(0001) /*--------------------------------------------------*/
(0002) /* AVR-ARM开发网论坛 */
(0003) /* http://www.avrarm.com */
(0004) /* AVR生成代码测试程序 */
(0005) /*--------------------------------------------------*/
(0006) /* 程序由AVR辅助开发工具V2.1.1自动生成 */
(0007) /* AVR系统的处理器为: ATMega16 */
(0008) /* AVR系统的晶振频率: 1.0000 Mhz */
(0009) /*--------------------------------------------------*/
(0010)
(0011) #include <iom16v.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:
0055 B381 IN R24,0x11
0056 6F80 ORI R24,0xF0
0057 BB81 OUT 0x11,R24
(0034) LCD_EN_DDR |= LCD_EN;
0058 9AD0 SBI 0x1A,0
(0035) LCD_RS_DDR |= LCD_RS;
0059 9AD2 SBI 0x1A,2
(0036) LCD_RW_DDR |= LCD_RW;
005A 9AD1 SBI 0x1A,1
(0037) RW_L;
005B 98D9 CBI 0x1B,1
(0038)
(0039) LCD_DATA_PORT = 0x20;
005C E280 LDI R24,0x20
005D BB82 OUT 0x12,R24
(0040) LCD16xx_en_write();
005E D014 RCALL _LCD16xx_en_write
(0041) delay_nus(50);
005F E302 LDI R16,0x32
0060 E010 LDI R17,0
0061 940E00EF CALL _delay_nus
(0042)
(0043) LCD16xx_write_char(1,0x28); //4bit test
0063 E228 LDI R18,0x28
0064 E001 LDI R16,1
0065 D017 RCALL _LCD16xx_write_char
(0044) delay_nms(5);
0066 E005 LDI R16,5
0067 E010 LDI R17,0
0068 940E0101 CALL _delay_nms
(0045) LCD16xx_write_char(1,0x0c); //显示开
006A E02C LDI R18,0xC
006B E001 LDI R16,1
006C D010 RCALL _LCD16xx_write_char
(0046) LCD16xx_write_char(1,0x01); //显示清屏
006D E021 LDI R18,1
006E E001 LDI R16,1
006F D00D RCALL _LCD16xx_write_char
(0047) LCD16xx_write_char(1,0x06); //显示光标移动设置
0070 E026 LDI R18,6
0071 E001 LDI R16,1
(0048) }
0072 C00A RJMP _LCD16xx_write_char
(0049)
(0050) void LCD16xx_en_write(void) //EN端产生一个高电平脉冲,写LCD
(0051) {
(0052) E_H;
_LCD16xx_en_write:
0073 9AD8 SBI 0x1B,0
(0053) delay_nus(4); //如果晶振频率太高,则可相应提高延时
0074 E004 LDI R16,4
0075 E010 LDI R17,0
0076 940E00EF CALL _delay_nus
(0054) E_L;
0078 98D8 CBI 0x1B,0
(0055) }
0079 9508 RET
(0056)
(0057) /************************************************************************/
(0058) /* LCD16xx清屏 */
(0059) /************************************************************************/
(0060) void LCD16xx_clr(void)
(0061) {
(0062) LCD16xx_write_char(1,0x01);
_LCD16xx_clr:
007A E021 LDI R18,1
007B E001 LDI R16,1
(0063) }
007C C000 RJMP _LCD16xx_write_char
007D 940E0171 CALL push_gset3
007F 2F42 MOV R20,R18
0080 2EA0 MOV R10,R16
(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;
0081 2F64 MOV R22,R20
(0080) datal = data<<4 ;
0082 2F84 MOV R24,R20
0083 708F ANDI R24,0xF
0084 9582 SWAP R24
0085 2F48 MOV R20,R24
(0081)
(0082) //LCD16xx_wait_Ready();
(0083)
(0084) RW_L; //RW=0
0086 98D9 CBI 0x1B,1
(0085) if (command == 0) //data
0087 20AA TST R10
0088 F411 BNE 0x008B
(0086) RS_H; //RS=1
0089 9ADA SBI 0x1B,2
008A C001 RJMP 0x008C
(0087) else //command
(0088) RS_L; //RS=0
008B 98DA CBI 0x1B,2
(0089)
(0090) LCD_DATA_PORT &= 0x0F;
008C B382 IN R24,0x12
008D 708F ANDI R24,0xF
008E BB82 OUT 0x12,R24
(0091) LCD_DATA_PORT |= datah&0xf0; //send high 4bit
008F 2F86 MOV R24,R22
0090 7F80 ANDI R24,0xF0
0091 B222 IN R2,0x12
0092 2A28 OR R2,R24
0093 BA22 OUT 0x12,R2
(0092) LCD16xx_en_write();
0094 DFDE RCALL _LCD16xx_en_write
(0093)
(0094) LCD_DATA_PORT &= 0x0F;
0095 B382 IN R24,0x12
0096 708F ANDI R24,0xF
0097 BB82 OUT 0x12,R24
(0095) LCD_DATA_PORT |= datal&0xf0; //send low 4bit
0098 2F84 MOV R24,R20
0099 7F80 ANDI R24,0xF0
009A B222 IN R2,0x12
009B 2A28 OR R2,R24
009C BA22 OUT 0x12,R2
(0096) LCD16xx_en_write();
009D DFD5 RCALL _LCD16xx_en_write
(0097) }
009E 940E0153 CALL pop_gset3
00A0 9508 RET
(0098)
(0099) void LCD16xx_wait_Ready(void) //等待LCD空闲
(0100) {
(0101) LCD_DATA_DDR &= ~0x80; //PD7 I/O口方向设置为输入
_LCD16xx_wait_Ready:
00A1 988F CBI 0x11,7
(0102) RW_H; //RW=1
00A2 9AD9 SBI 0x1B,1
(0103) RS_L; //RS=0
00A3 98DA CBI 0x1B,2
(0104) E_H; //EN=1
00A4 9AD8 SBI 0x1B,0
(0105) while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
00A5 9987 SBIC 0x10,7
00A6 C003 RJMP 0x00AA
00A7 E001 LDI R16,1
00A8 E010 LDI R17,0
00A9 C002 RJMP 0x00AC
00AA 2700 CLR R16
00AB 2711 CLR R17
00AC 3000 CPI R16,0
00AD 0701 CPC R16,R17
00AE F3B1 BEQ 0x00A5
(0106) E_L; //EN=0
00AF 98D8 CBI 0x1B,0
(0107) LCD_DATA_DDR |= LCD_DATA;
00B0 B381 IN R24,0x11
00B1 6F80 ORI R24,0xF0
00B2 BB81 OUT 0x11,R24
(0108) }
00B3 9508 RET
_LCD16xx_set_xy:
address --> R20
y --> R10
x --> R22
00B4 940E0171 CALL push_gset3
00B6 2EA2 MOV R10,R18
00B7 2F60 MOV R22,R16
(0109)
(0110) /*-----------------------------------------------------------------------
(0111) LCD_set_xy : 设置LCD显示的起始位置
(0112)
(0113) 输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
(0114) LCD第一行显示寄存器地址:0x80-0x8F
(0115) LCD第一行显示寄存器地址:0xC0-0xCF
(0116) 编写日期 :2006年08月30日
(0117) 最后修改日期 :2006年08月30日
(0118) -----------------------------------------------------------------------*/
(0119) void LCD16xx_set_xy( unsigned char x, unsigned char y )
(0120) {
(0121) unsigned char address;
(0122) if (y == 0)
00B8 20AA TST R10
00B9 F419 BNE 0x00BD
(0123) address = 0x80 + x;
00BA 2F46 MOV R20,R22
00BB 5840 SUBI R20,0x80
00BC C00E RJMP 0x00CB
(0124) else if(y == 1)
00BD 2D8A MOV R24,R10
00BE 3081 CPI R24,1
00BF F419 BNE 0x00C3
(0125) address = 0xc0 + x;
00C0 2F46 MOV R20,R22
00C1 5440 SUBI R20,0x40
00C2 C008 RJMP 0x00CB
(0126) else if(y == 2)
00C3 2D8A MOV R24,R10
00C4 3082 CPI R24,2
00C5 F419 BNE 0x00C9
(0127) address = 0x90 + x;
00C6 2F46 MOV R20,R22
00C7 5740 SUBI R20,0x70
00C8 C002 RJMP 0x00CB
(0128) else
(0129) address = 0xd0 + x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -