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

📄 timer.lst

📁 利用时间片思想设计的一个AVR单片机的时钟程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0031 E5CF      LDI	R28,0x5F
    0032 E0D4      LDI	R29,4
    0033 BFCD      OUT	0x3D,R28
    0034 BFDE      OUT	0x3E,R29
    0035 52C0      SUBI	R28,0x20
    0036 40D0      SBCI	R29,0
    0037 EA0A      LDI	R16,0xAA
    0038 8308      STD	Y+0,R16
    0039 2400      CLR	R0
    003A E6EE      LDI	R30,0x6E
    003B E0F0      LDI	R31,0
    003C E010      LDI	R17,0
    003D 37E4      CPI	R30,0x74
    003E 07F1      CPC	R31,R17
    003F F011      BEQ	0x0042
    0040 9201      ST	R0,Z+
    0041 CFFB      RJMP	0x003D
    0042 8300      STD	Z+0,R16
    0043 E5E4      LDI	R30,0x54
    0044 E0F0      LDI	R31,0
    0045 E6A0      LDI	R26,0x60
    0046 E0B0      LDI	R27,0
    0047 E010      LDI	R17,0
    0048 36E2      CPI	R30,0x62
    0049 07F1      CPC	R31,R17
    004A F021      BEQ	0x004F
    004B 95C8      LPM
    004C 9631      ADIW	R30,1
    004D 920D      ST	R0,X+
    004E CFF9      RJMP	0x0048
    004F 940E0346  CALL	_main
_exit:
    0051 CFFF      RJMP	_exit
FILE: G:\Demo\LCD_1602.h
(0001) //定义MCU与LCD的接口
(0002) //根据实际情况更改
(0003) #define LCD_RS_DDR     DDRA
(0004) #define LCD_RS_PORT    PORTA	//数据/命令
(0005) #define LCD_RS         0x08   //portc3         out
(0006) 
(0007) #define LCD_RW_DDR     DDRA
(0008) #define LCD_RW_PORT    PORTA	//读/写
(0009) #define LCD_RW         0x04   //portc2         out
(0010) 
(0011) #define	LCD_EN_DDR	   DDRA
(0012) #define LCD_EN_PORT    PORTA	//使能信号
(0013) #define LCD_EN         0x02   //portc1         out
(0014) 
(0015) #define LCD_DATA_PORT  PORTA
(0016) #define LCD_DATA_DDR   DDRA
(0017) #define LCD_DATA_PIN   PINA
(0018) #define LCD_DATA       0xf0   //portc4/5/6/7   out
(0019) #define	LCD_BUSY	   7	  //portc7
(0020) /*--------------------------------------------------------------------------------------------------
(0021) Public function prototypes
(0022) --------------------------------------------------------------------------------------------------*/
(0023) void LCD_init         (void);
(0024) void LCD_en_write     (void);
(0025) unsigned char LCD_write_char   (unsigned command,unsigned data);
(0026) unsigned char LCD_wait_Ready   (void);
(0027) void LCD_set_xy       (unsigned char x, unsigned char y);
(0028) unsigned char LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0029) unsigned char LCD_write_uint8(unsigned char X, unsigned char Y, unsigned int data, unsigned char num);
(0030) void delay_nus        (unsigned int n);
(0031) void delay_nms        (unsigned int n);
(0032) /**********************************************************
(0033) 光标命令
(0034) LCD_write_char(0x0e,0);    //光标开
(0035) LCD_write_char(0x0d,0);    //光标所在字符闪烁  
(0036) LCD_write_char(0x0c,0);    //光标关  
(0037) **********************************************************/
(0038) /**********************************************************
(0039) TC1602B LCD DISPLAY
(0040) 建立时间:2003年11月9号
(0041) 修改日期:2003年11月14号
(0042) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0043)                    入命令
(0044) LCD第一行显示寄存器地址:0X80-0X8F
(0045) LCD第二行显示寄存器地址:0XC0-0XCF
(0046) **********************************************************/
(0047) void LCD_init(void)
(0048) {   //add io intial
(0049) 	LCD_EN_DDR |= LCD_EN;	LCD_EN_PORT &= ~LCD_EN;
_LCD_init:
    0052 9AD1      SBI	0x1A,1
    0053 98D9      CBI	0x1B,1
(0050) 	LCD_RW_DDR |= LCD_RW;	LCD_RW_PORT &= ~LCD_RW;
    0054 9AD2      SBI	0x1A,2
    0055 98DA      CBI	0x1B,2
(0051) 	LCD_RS_DDR |= LCD_RS;	LCD_RS_PORT &= ~LCD_RS;
    0056 9AD3      SBI	0x1A,3
    0057 98DB      CBI	0x1B,3
(0052) 	
(0053) 	LCD_DATA_DDR |= LCD_DATA;
    0058 B38A      IN	R24,0x1A
    0059 6F80      ORI	R24,0xF0
    005A BB8A      OUT	0x1A,R24
(0054) 	
(0055) 	delay_nms(25);
    005B E109      LDI	R16,0x19
    005C E010      LDI	R17,0
    005D D134      RCALL	_delay_nms
(0056) 
(0057)     LCD_write_char(0x28,0);      //4bit test
    005E 2722      CLR	R18
    005F 2733      CLR	R19
    0060 E208      LDI	R16,0x28
    0061 E010      LDI	R17,0
    0062 D016      RCALL	_LCD_write_char
(0058)     LCD_write_char(0x0c,0);      //显示开
    0063 2722      CLR	R18
    0064 2733      CLR	R19
    0065 E00C      LDI	R16,0xC
    0066 E010      LDI	R17,0
    0067 D011      RCALL	_LCD_write_char
(0059)     LCD_write_char(0x01,0);      //显示清屏
    0068 2722      CLR	R18
    0069 2733      CLR	R19
    006A E001      LDI	R16,1
    006B E010      LDI	R17,0
    006C D00C      RCALL	_LCD_write_char
(0060)     LCD_write_char(0x06,0);      //显示光标移动设置
    006D 2722      CLR	R18
    006E 2733      CLR	R19
    006F E006      LDI	R16,6
    0070 E010      LDI	R17,0
    0071 D007      RCALL	_LCD_write_char
    0072 9508      RET
(0061) }
(0062) 
(0063) void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
(0064) {   LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
    0073 9AD9      SBI	0x1B,1
(0065)     delay_nus(2);
    0074 E002      LDI	R16,2
    0075 E010      LDI	R17,0
    0076 D102      RCALL	_delay_nus
(0066)     LCD_EN_PORT &= ~LCD_EN;
    0077 98D9      CBI	0x1B,1
    0078 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    0079 940E03B1  CALL	push_gset4
    007B 0169      MOVW	R12,R18
    007C 0158      MOVW	R10,R16
(0067) }
(0068) /*-----------------------------------------------------------------------
(0069) LCD_write_char    : 英文字符串显示函数
(0070) 
(0071) 输入参数:*s      :英文字符串指针;
(0072)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0073)                     LCD第一行显示寄存器地址:0X80-0X8F
(0074)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0075) 
(0076) 编写日期          :2003-11-19 
(0077) 最后修改日期      :2004-8-19 		
(0078) -----------------------------------------------------------------------*/
(0079) unsigned char LCD_write_char(unsigned command,unsigned data)
(0080) {	unsigned command_temp,data_temp;        
(0081)    
(0082)     command_temp = command;
    007D 01A5      MOVW	R20,R10
(0083)     data_temp = data;
    007E 01B6      MOVW	R22,R12
(0084)    
(0085)     if( LCD_wait_Ready() == 1 )
    007F D05C      RCALL	_LCD_wait_Ready
    0080 3001      CPI	R16,1
    0081 F411      BNE	0x0084
(0086)     {	return(1);	}
    0082 E001      LDI	R16,1
    0083 C055      RJMP	0x00D9
(0087)     
(0088) 	LCD_RW_PORT &= ~LCD_RW;                 //RW=0
    0084 98DA      CBI	0x1B,2
(0089) 	if (command == 0)
    0085 20AA      TST	R10
    0086 F491      BNE	0x0099
    0087 20BB      TST	R11
    0088 F481      BNE	0x0099
(0090) 	{	LCD_RS_PORT |= LCD_RS;             //RS=1 
    0089 9ADB      SBI	0x1B,3
(0091) 		asm("nop");
    008A 0000      NOP
(0092) 		LCD_DATA_PORT &= ~LCD_DATA;
    008B B38B      IN	R24,0x1B
    008C 708F      ANDI	R24,0xF
    008D BB8B      OUT	0x1B,R24
(0093) 		asm("nop");
    008E 0000      NOP
(0094) 		//LCD_DATA_PORT |= data_temp&LCD_DATA;   //send high 4bit
(0095) 		LCD_DATA_PORT |= (data_temp>>(7-LCD_BUSY)) & LCD_DATA;   //send high 4bit
    008F 01CB      MOVW	R24,R22
    0090 7F80      ANDI	R24,0xF0
    0091 7090      ANDI	R25,0
    0092 B22B      IN	R2,0x1B
    0093 2433      CLR	R3
    0094 2A28      OR	R2,R24
    0095 2A39      OR	R3,R25
    0096 BA2B      OUT	0x1B,R2
(0096) 		asm("nop");
    0097 0000      NOP
(0097) 	}
    0098 C00F      RJMP	0x00A8
(0098) 	else 
(0099) 	{	LCD_RS_PORT &= ~LCD_RS;            //RS=0
    0099 98DB      CBI	0x1B,3
(0100) 		asm("nop");
    009A 0000      NOP
(0101) 		LCD_DATA_PORT &= ~LCD_DATA;
    009B B38B      IN	R24,0x1B
    009C 708F      ANDI	R24,0xF
    009D BB8B      OUT	0x1B,R24
(0102) 		asm("nop");
    009E 0000      NOP
(0103) 	   	//LCD_DATA_PORT |= command_temp&LCD_DATA;//send high 4bit
(0104) 	   	LCD_DATA_PORT |= (command_temp>>(7-LCD_BUSY)) & LCD_DATA;//send high 4bit
    009F 01CA      MOVW	R24,R20
    00A0 7F80      ANDI	R24,0xF0
    00A1 7090      ANDI	R25,0
    00A2 B22B      IN	R2,0x1B
    00A3 2433      CLR	R3
    00A4 2A28      OR	R2,R24
    00A5 2A39      OR	R3,R25
    00A6 BA2B      OUT	0x1B,R2
(0105) 	   	asm("nop");
    00A7 0000      NOP
(0106) 	}
(0107)     LCD_en_write();
    00A8 DFCA      RCALL	_LCD_en_write
(0108)    
(0109)     command_temp=command_temp << 4;         //send low 4bit
    00A9 0F44      LSL	R20
    00AA 1F55      ROL	R21
    00AB 0F44      LSL	R20
    00AC 1F55      ROL	R21
    00AD 0F44      LSL	R20
    00AE 1F55      ROL	R21
    00AF 0F44      LSL	R20
    00B0 1F55      ROL	R21
(0110)     data_temp=data_temp       << 4;
    00B1 0F66      LSL	R22
    00B2 1F77      ROL	R23
    00B3 0F66      LSL	R22
    00B4 1F77      ROL	R23
    00B5 0F66      LSL	R22
    00B6 1F77      ROL	R23
    00B7 0F66      LSL	R22
    00B8 1F77      ROL	R23
(0111)    
(0112)     LCD_DATA_PORT &= ~LCD_DATA;
    00B9 B38B      IN	R24,0x1B
    00BA 708F      ANDI	R24,0xF
    00BB BB8B      OUT	0x1B,R24
(0113)     if (command==0)
    00BC 20AA      TST	R10
    00BD F459      BNE	0x00C9
    00BE 20BB      TST	R11
    00BF F449      BNE	0x00C9
(0114)     {	//LCD_DATA_PORT |= data_temp&LCD_DATA;	
(0115)     	LCD_DATA_PORT |= (data_temp>>(7-LCD_BUSY)) & LCD_DATA;	
    00C0 01CB      MOVW	R24,R22
    00C1 7F80      ANDI	R24,0xF0
    00C2 7090      ANDI	R25,0
    00C3 B22B      IN	R2,0x1B
    00C4 2433      CLR	R3
    00C5 2A28      OR	R2,R24
    00C6 2A39      OR	R3,R25
    00C7 BA2B      OUT	0x1B,R2
(0116)     }
    00C8 C008      RJMP	0x00D1
(0117)     else
(0118)     {	//LCD_DATA_PORT |= command_temp&LCD_DATA;	
(0119)     	LCD_DATA_PORT |= (command_temp>>(7-LCD_BUSY)) & LCD_DATA;	
    00C9 01CA      MOVW	R24,R20
    00CA 7F80      ANDI	R24,0xF0
    00CB 7090      ANDI	R25,0
    00CC B22B      IN	R2,0x1B
    00CD 2433      CLR	R3
    00CE 2A28      OR	R2,R24
    00CF 2A39      OR	R3,R25
    00D0 BA2B      OUT	0x1B,R2
(0120)     }
(0121)     LCD_en_write();
    00D1 DFA1      RCALL	_LCD_en_write
(0122)    
(0123)     LCD_RW_PORT |= LCD_RW;
    00D2 9ADA      SBI	0x1B,2
(0124) 	asm("nop");  
    00D3 0000      NOP
(0125)     LCD_RS_PORT ^= LCD_RS;    
    00D4 E088      LDI	R24,0x8
    00D5 B22B      IN	R2,0x1B
    00D6 2628      EOR	R2,R24
    00D7 BA2B      OUT	0x1B,R2
(0126)     
(0127)     return(0);
    00D8 2700      CLR	R16
    00D9 940E03AC  CALL	pop_gset4
    00DB 9508      RET
(0128) }
(0129) #define	LCD_ERROR_TIME	1000
(0130) unsigned char LCD_wait_Ready(void)                  //等待LCD空闲
(0131) {	unsigned int	temp;
(0132) 	LCD_DATA_DDR &= ~(1<<LCD_BUSY);             //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
  temp                 --> R16
    00DC 98D7      CBI	0x1A,7
(0133) 	asm("nop");
    00DD 0000      NOP
(0134) 	LCD_RW_PORT |= LCD_RW;                 //RW=1
    00DE 9ADA      SBI	0x1B,2
(0135)     asm("nop");
    00DF 0000      NOP
(0136)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    00E0 98DB      CBI	0x1B,3
(0137)     asm("nop");
    00E1 0000      NOP
(0138)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    00E2 9AD9      SBI	0x1B,1
(0139) 	asm("nop");
    00E3 0000      NOP
    00E4 C009      RJMP	0x00EE
(0140) 	while (!( LCD_DATA_PIN&(1<<LCD_BUSY) ) == 0)   //RW=1,读PD7,为0表示空闲;
(0141) 	{	temp ++;
    00E5 5F0F      SUBI	R16,0xFF
    00E6 4F1F      SBCI	R17,0xFF
(0142) 		if( temp > LCD_ERROR_TIME )
    00E7 EE88      LDI	R24,0xE8
    00E8 E093      LDI	R25,3
    00E9 1780      CP	R24,R16
    00EA 0791      CPC	R25,R17
    00EB F410      BCC	0x00EE
(0143) 		{	return(1);	}
    00EC E001      LDI	R16,1
    00ED C00F      RJMP	0x00FD
    00EE 99CF      SBIC	0x19,7
    00EF C003      RJMP	0x00F3
    00F0 E021      LDI	R18,1
    00F1 E030      LDI	R19,0
    00F2 C002      RJMP	0x00F5
    00F3 2722      CLR	R18
    00F4 2733      CLR	R19
    00F5 3020      CPI	R18,0
    00F6 0723      CPC	R18,R19
    00F7 F369      BEQ	0x00E5
(0144) 	}
(0145) 	asm("nop");
    00F8 0000      NOP
(0146) 	LCD_EN_PORT &= ~LCD_EN;                //EN=0 
    00F9 98D9      CBI	0x1B,1
(0147) 	asm("nop");
    00FA 0000      NOP
(0148) 	LCD_DATA_DDR |= (1<<LCD_BUSY);
    00FB 9AD7      SBI	0x1A,7
(0149) 	return(0);
    00FC 2700      CLR	R16
    00FD 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00FE 940E03B5  CALL	push_gset2
    0100 2F42      MOV	R20,R18
    0101 2F60      MOV	R22,R16
(0150) }
(0151) 
(0152) /*-----------------------------------------------------------------------
(0153) LCD_set_xy        : 设置LCD显示的起始位置
(0154) 
(0155) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0156)                     LCD第一行显示寄存器地址:0X80-0X8F
(0157)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0158) 
(0159) 编写日期          :2004-8-19 
(0160) 最后修改日期      :2004-8-19 		
(0161) -----------------------------------------------------------------------*/
(0162) void LCD_set_xy( unsigned char x, unsigned char y )
(0163) {	unsigned char address;
(0164) 	if (y == 0) address = 0x80 + x;
    0102 2344      TST	R20
    0103 F419      BNE	0x0107
    0104 2F46      MOV	R20,R22
    0105 5840      SUBI	R20,0x80
    0106 C002      RJMP	0x0109
(0165) 	else 
(0166) 	address = 0xc0 + x;
    0107 2F46      MOV	R20,R22
    0108 5440      SUBI	R20,0x40
(0167) 	LCD_write_char( address, 0 );
    0109 2722      CLR	R18
    010A 2733      CLR	R19
    010B 2F04      MOV	R16,R20
    010C 2711      CLR	R17
    010D DF6B      RCALL	_LCD_write_char
    010E 940E03A6  CALL	pop_gset2
    0110 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    0111 940E03B3  CALL	push_gset3
    0113 2EA2      MOV	R10,R18
    0114 2F60      MOV	R22,R16
    0115 814E      LDD	R20,Y+6
    0116 815F      LDD	R21,Y+7
(0168) }
(0169) /*-----------------------------------------------------------------------
(0170) LCD_write_string  : 英文字符串显示函数
(0171) 
(0172) 输入参数:*s      :英文字符串指针;
(0173)           X、Y    : 显示字符串的位置
(0174) 
(0175) 编写日期          :2004-8-19 
(0176) 最后修改日期      :2004-8-19 		
(0177) -----------------------------------------------------------------------*/
(0178) unsigned char LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0179) {	LCD_set_xy( X, Y );
    0117 2D2A      MOV	R18,R10
    0118 2F06      MOV	R16,R22
    0119 DFE4      RCALL	_LCD_set_xy

⌨️ 快捷键说明

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