⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 一个用于LCD的菜单模式界面的程序,如何实现滚屏.
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0116 E5CF      LDI	R28,0x5F
    0117 E0D4      LDI	R29,4
    0118 BFCD      OUT	0x3D,R28
    0119 BFDE      OUT	0x3E,R29
    011A 51C0      SUBI	R28,0x10
    011B 40D0      SBCI	R29,0
    011C EA0A      LDI	R16,0xAA
    011D 8308      STD	Y+0,R16
    011E 2400      CLR	R0
    011F E3E0      LDI	R30,0x30
    0120 E0F2      LDI	R31,2
    0121 E012      LDI	R17,2
    0122 33E3      CPI	R30,0x33
    0123 07F1      CPC	R31,R17
    0124 F011      BEQ	0x0127
    0125 9201      ST	R0,Z+
    0126 CFFB      RJMP	0x0122
    0127 8300      STD	Z+0,R16
    0128 E5EC      LDI	R30,0x5C
    0129 E0F0      LDI	R31,0
    012A E6A0      LDI	R26,0x60
    012B E0B0      LDI	R27,0
    012C E012      LDI	R17,2
    012D 32EC      CPI	R30,0x2C
    012E 07F1      CPC	R31,R17
    012F F021      BEQ	0x0134
    0130 95C8      LPM
    0131 9631      ADIW	R30,1
    0132 920D      ST	R0,X+
    0133 CFF9      RJMP	0x012D
    0134 940E02CC  CALL	_main
_exit:
    0136 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\Menu\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008) 
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ;
(0013) #ifndef __delay_h
(0014) #define __delay_h 
(0015) 
(0016) void delay_1us(void)                 //1us延时函数
(0017)   {
(0018)    asm("nop");
_delay_1us:
    0137 0000      NOP
    0138 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0139 940E045B  CALL	push_gset2
    013B 01B8      MOVW	R22,R16
(0019)   }
(0020) 
(0021) void delay_nus(unsigned int n)       //N us延时函数
(0022)   {
(0023)    unsigned int i=0;
    013C 2744      CLR	R20
    013D 2755      CLR	R21
(0024)    for (i=0;i<n;i++)
    013E C003      RJMP	0x0142
(0025)    delay_1us();
    013F DFF7      RCALL	_delay_1us
    0140 5F4F      SUBI	R20,0xFF
    0141 4F5F      SBCI	R21,0xFF
    0142 1746      CP	R20,R22
    0143 0757      CPC	R21,R23
    0144 F3D0      BCS	0x013F
    0145 940E044F  CALL	pop_gset2
    0147 9508      RET
(0026)   }
(0027)   
(0028) void delay_1ms(void)                 //1ms延时函数
(0029)   {
(0030)    unsigned int i;
(0031)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0148 2700      CLR	R16
    0149 2711      CLR	R17
    014A C002      RJMP	0x014D
    014B 5F0F      SUBI	R16,0xFF
    014C 4F1F      SBCI	R17,0xFF
    014D 3704      CPI	R16,0x74
    014E E0E4      LDI	R30,4
    014F 071E      CPC	R17,R30
    0150 F3D0      BCS	0x014B
    0151 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0152 940E045B  CALL	push_gset2
    0154 01B8      MOVW	R22,R16
(0032)   }
(0033)   
(0034) void delay_nms(unsigned int n)       //N ms延时函数
(0035)   {
(0036)    unsigned int i=0;
    0155 2744      CLR	R20
    0156 2755      CLR	R21
(0037)    for (i=0;i<n;i++)
    0157 C003      RJMP	0x015B
(0038)    delay_1ms();
    0158 DFEF      RCALL	_delay_1ms
    0159 5F4F      SUBI	R20,0xFF
    015A 4F5F      SBCI	R21,0xFF
    015B 1746      CP	R20,R22
    015C 0757      CPC	R21,R23
    015D F3D0      BCS	0x0158
    015E 940E044F  CALL	pop_gset2
    0160 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\1602.h
(0001) 
(0002) /* 用法:
(0003)    LCD_init();
(0004)    LCD_write_string(列,行,"字符串");
(0005)    LCD_write_char(列,行,'字符'); 
(0006)  ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PA2 ->RS
(0009) PA3 ->EN
(0010) 地  ->RW
(0011) PA4 ->D4
(0012) PA5 ->D5
(0013) PA6 ->D6
(0014) PA7 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT    PORTA   //以下2个要设为同一个口
(0018) #define LCD_EN_DDR     DDRA
(0019) #define LCD_RS_PORT    PORTA   //以下2个要设为同一个口
(0020) #define LCD_RS_DDR     DDRA
(0021) #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR   DDRA    //一定要用高4位
(0023) #define LCD_DATA_PIN   PINA
(0024) #define LCD_RS         (1<<PA2) //0x04   portA2       out
(0025) #define LCD_EN         (1<<PA3) //0x08   portA3       out
(0026) #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned  char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037) #ifndef __1602_h
(0038) #define __1602_h
(0039) //-----------------------------------------------------------------------------------------
(0040) #include "delay.h"
(0041) 
(0042) void LCD_init(void)         //液晶初始化
(0043) {
(0044)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
    0161 B38A      IN	R24,0x1A
    0162 6F80      ORI	R24,0xF0
    0163 BB8A      OUT	0x1A,R24
(0045)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
    0164 9AD3      SBI	0x1A,3
(0046)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
    0165 9AD2      SBI	0x1A,2
(0047)   LCD_write_command(0x28); 
    0166 E208      LDI	R16,0x28
    0167 D014      RCALL	_LCD_write_command
(0048)   LCD_en_write();
    0168 D00D      RCALL	_LCD_en_write
(0049)   delay_nus(40);
    0169 E208      LDI	R16,0x28
    016A E010      LDI	R17,0
    016B DFCD      RCALL	_delay_nus
(0050)   LCD_write_command(0x28);  //4位显示
    016C E208      LDI	R16,0x28
    016D D00E      RCALL	_LCD_write_command
(0051)   LCD_write_command(0x0c);  //显示开
    016E E00C      LDI	R16,0xC
    016F D00C      RCALL	_LCD_write_command
(0052)   LCD_write_command(0x01);  //清屏
    0170 E001      LDI	R16,1
    0171 D00A      RCALL	_LCD_write_command
(0053)   delay_nms(2);
    0172 E002      LDI	R16,2
    0173 E010      LDI	R17,0
    0174 DFDD      RCALL	_delay_nms
    0175 9508      RET
(0054) }
(0055) 
(0056) void LCD_en_write(void)  //液晶使能
(0057) {
(0058)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    0176 9ADB      SBI	0x1B,3
(0059)   delay_nus(1);
    0177 E001      LDI	R16,1
    0178 E010      LDI	R17,0
    0179 DFBF      RCALL	_delay_nus
(0060)   LCD_EN_PORT&=~LCD_EN;
    017A 98DB      CBI	0x1B,3
    017B 9508      RET
_LCD_write_command:
  command              --> R20
    017C 940E045D  CALL	push_gset1
    017E 2F40      MOV	R20,R16
(0061) }
(0062) 
(0063) void LCD_write_command(unsigned char command) //写指令
(0064) {
(0065)   delay_nus(16);
    017F E100      LDI	R16,0x10
    0180 E010      LDI	R17,0
    0181 DFB7      RCALL	_delay_nus
(0066)   LCD_RS_PORT&=~LCD_RS;        //RS=0
    0182 98DA      CBI	0x1B,2
(0067)   LCD_DATA_PORT&=0X0f;         //清高四位
    0183 B38B      IN	R24,0x1B
    0184 708F      ANDI	R24,0xF
    0185 BB8B      OUT	0x1B,R24
(0068)   LCD_DATA_PORT|=command&0xf0; //写高四位
    0186 2F84      MOV	R24,R20
    0187 7F80      ANDI	R24,0xF0
    0188 B22B      IN	R2,0x1B
    0189 2A28      OR	R2,R24
    018A BA2B      OUT	0x1B,R2
(0069)   LCD_en_write();
    018B DFEA      RCALL	_LCD_en_write
(0070)   command=command<<4;          //低四位移到高四位
    018C 2F84      MOV	R24,R20
    018D 708F      ANDI	R24,0xF
    018E 9582      SWAP	R24
    018F 2F48      MOV	R20,R24
(0071)   LCD_DATA_PORT&=0x0f;         //清高四位
    0190 B38B      IN	R24,0x1B
    0191 708F      ANDI	R24,0xF
    0192 BB8B      OUT	0x1B,R24
(0072)   LCD_DATA_PORT|=command&0xf0; //写低四位
    0193 2F84      MOV	R24,R20
    0194 7F80      ANDI	R24,0xF0
    0195 B22B      IN	R2,0x1B
    0196 2A28      OR	R2,R24
    0197 BA2B      OUT	0x1B,R2
(0073)   LCD_en_write();
    0198 DFDD      RCALL	_LCD_en_write
    0199 940E0460  CALL	pop_gset1
    019B 9508      RET
_LCD_write_data:
  data                 --> R20
    019C 940E045D  CALL	push_gset1
    019E 2F40      MOV	R20,R16
(0074)   
(0075) }
(0076) 
(0077) void LCD_write_data(unsigned char data) //写数据
(0078) {
(0079)   delay_nus(16);
    019F E100      LDI	R16,0x10
    01A0 E010      LDI	R17,0
    01A1 DF97      RCALL	_delay_nus
(0080)   LCD_RS_PORT|=LCD_RS;       //RS=1
    01A2 9ADA      SBI	0x1B,2
(0081)   LCD_DATA_PORT&=0X0f;       //清高四位
    01A3 B38B      IN	R24,0x1B
    01A4 708F      ANDI	R24,0xF
    01A5 BB8B      OUT	0x1B,R24
(0082)   LCD_DATA_PORT|=data&0xf0;  //写高四位
    01A6 2F84      MOV	R24,R20
    01A7 7F80      ANDI	R24,0xF0
    01A8 B22B      IN	R2,0x1B
    01A9 2A28      OR	R2,R24
    01AA BA2B      OUT	0x1B,R2
(0083)   LCD_en_write();
    01AB DFCA      RCALL	_LCD_en_write
(0084)   data=data<<4;               //低四位移到高四位
    01AC 2F84      MOV	R24,R20
    01AD 708F      ANDI	R24,0xF
    01AE 9582      SWAP	R24
    01AF 2F48      MOV	R20,R24
(0085)   LCD_DATA_PORT&=0X0f;        //清高四位
    01B0 B38B      IN	R24,0x1B
    01B1 708F      ANDI	R24,0xF
    01B2 BB8B      OUT	0x1B,R24
(0086)   LCD_DATA_PORT|=data&0xf0;   //写低四位
    01B3 2F84      MOV	R24,R20
    01B4 7F80      ANDI	R24,0xF0
    01B5 B22B      IN	R2,0x1B
    01B6 2A28      OR	R2,R24
    01B7 BA2B      OUT	0x1B,R2
(0087)   LCD_en_write();
    01B8 DFBD      RCALL	_LCD_en_write
    01B9 940E0460  CALL	pop_gset1
    01BB 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    01BC 940E045B  CALL	push_gset2
    01BE 2F42      MOV	R20,R18
    01BF 2F60      MOV	R22,R16
(0088) }
(0089) 
(0090) 
(0091) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0092) {
(0093)     unsigned char address;
(0094)     if (y == 0) address = 0x80 + x;
    01C0 2344      TST	R20
    01C1 F419      BNE	0x01C5
    01C2 2F46      MOV	R20,R22
    01C3 5840      SUBI	R20,0x80
    01C4 C002      RJMP	0x01C7
(0095)     else   address = 0xc0 + x;
    01C5 2F46      MOV	R20,R22
    01C6 5440      SUBI	R20,0x40
(0096)     LCD_write_command( address);
    01C7 2F04      MOV	R16,R20
    01C8 DFB3      RCALL	_LCD_write_command
    01C9 940E044F  CALL	pop_gset2
    01CB 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    01CC 940E0459  CALL	push_gset3
    01CE 2EA2      MOV	R10,R18
    01CF 2F60      MOV	R22,R16
    01D0 814E      LDD	R20,Y+6
    01D1 815F      LDD	R21,Y+7
(0097) }
(0098)   
(0099) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0100) {
(0101)     LCD_set_xy( X, Y ); //写地址    
    01D2 2D2A      MOV	R18,R10
    01D3 2F06      MOV	R16,R22
    01D4 DFE7      RCALL	_LCD_set_xy
    01D5 C005      RJMP	0x01DB
(0102)     while (*s)  // 写显示字符
(0103)     {
(0104)       LCD_write_data( *s );
    01D6 01FA      MOVW	R30,R20
    01D7 8100      LDD	R16,Z+0
    01D8 DFC3      RCALL	_LCD_write_data
(0105)       s ++;
    01D9 5F4F      SUBI	R20,0xFF
    01DA 4F5F      SBCI	R21,0xFF
    01DB 01FA      MOVW	R30,R20
    01DC 8020      LDD	R2,Z+0
    01DD 2022      TST	R2
    01DE F7B9      BNE	0x01D6
    01DF 940E0452  CALL	pop_gset3
    01E1 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    01E2 940E045B  CALL	push_gset2
    01E4 2F62      MOV	R22,R18
    01E5 2F40      MOV	R20,R16
(0106)     }
(0107)       
(0108) }
(0109) 
(0110) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0111) {
(0112)   LCD_set_xy( X, Y ); //写地址
    01E6 2F26      MOV	R18,R22
    01E7 2F04      MOV	R16,R20
    01E8 DFD3      RCALL	_LCD_set_xy
(0113)   LCD_write_data( data);
    01E9 810C      LDD	R16,Y+4
    01EA DFB1      RCALL	_LCD_write_data
    01EB 940E044F  CALL	pop_gset2
    01ED 9508      RET
_key_read:
  i                    --> R20
    01EE 940E045D  CALL	push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\Menu\key.h
(0001) 
(0002) 
(0003) //函数说明
(0004) //--------------------------------
(0005)   unsigned char get_key(void);
(0006) //--------------------------------
(0007) #ifndef __key_h
(0008) #define __key_h
(0009) unsigned char key_read(void)
(0010) {
(0011)  	 unsigned char i;
(0012) 	/*获取列地址*/
(0013) 	DDRB=0xf0; //高4位输出,低4位输入
    01F0 EF80      LDI	R24,0xF0
    01F1 BB87      OUT	0x17,R24
(0014) 	PORTB=0x0f;//高4位输出0,低4位带上拉输入
    01F2 E08F      LDI	R24,0xF
    01F3 BB88      OUT	0x18,R24
(0015) 	delay_nms(1);
    01F4 E001      LDI	R16,1
    01F5 E010      LDI	R17,0
    01F6 DF5B      RCALL	_delay_nms
(0016) 
(0017) 	i=PINB&0x0f;
    01F7 B346      IN	R20,0x16
    01F8 704F      ANDI	R20,0xF
(0018) 	
(0019) 	/*获取行地址*/
(0020) 	DDRB=0x0f;//高4位输入,低4位输出
    01F9 E08F      LDI	R24,0xF
    01FA BB87      OUT	0x17,R24
(0021) 	PORTB=0xf0;//低4位输出0,高4位带上拉输入
    01FB EF80      LDI	R24,0xF0
    01FC BB88      OUT	0x18,R24
(0022) 	delay_nms(1);
    01FD E001      LDI	R16,1
    01FE E010      LDI	R17,0
    01FF DF52      RCALL	_delay_nms
(0023) 
(0024) 	i|=PINB&0xf0;
    0200 B386      IN	R24,0x16
    0201 7F80      ANDI	R24,0xF0
    0202 2B48      OR	R20,R24
(0025) 	
(0026) 	switch(i)
    0203 2755      CLR	R21
    0204 3D47      CPI	R20,0xD7
    0205 E0E0      LDI	R30,0
    0206 075E      CPC	R21,R30
    0207 F409      BNE	0x0209
    0208 C075      RJMP	0x027E
    0209 3D4B      CPI	R20,0xDB
    020A E0E0      LDI	R30,0
    020B 075E      CPC	R21,R30
    020C F409      BNE	0x020E

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -