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

📄 1602_8563_timer.lst

📁 avr单片机的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    004B E5CF      LDI	R28,0x5F
    004C E0D4      LDI	R29,4
    004D BFCD      OUT	0x3D,R28
    004E BFDE      OUT	0x3E,R29
    004F 51C0      SUBI	R28,0x10
    0050 40D0      SBCI	R29,0
    0051 EA0A      LDI	R16,0xAA
    0052 8308      STD	Y+0,R16
    0053 2400      CLR	R0
    0054 EAE1      LDI	R30,0xA1
    0055 E0F0      LDI	R31,0
    0056 E010      LDI	R17,0
    0057 3AE9      CPI	R30,0xA9
    0058 07F1      CPC	R31,R17
    0059 F011      BEQ	0x005C
    005A 9201      ST	R0,Z+
    005B CFFB      RJMP	0x0057
    005C 8300      STD	Z+0,R16
    005D E5E4      LDI	R30,0x54
    005E E0F0      LDI	R31,0
    005F E6A0      LDI	R26,0x60
    0060 E0B0      LDI	R27,0
    0061 E010      LDI	R17,0
    0062 39E5      CPI	R30,0x95
    0063 07F1      CPC	R31,R17
    0064 F021      BEQ	0x0069
    0065 95C8      LPM
    0066 9631      ADIW	R30,1
    0067 920D      ST	R0,X+
    0068 CFF9      RJMP	0x0062
    0069 940E02DD  CALL	_main
_exit:
    006B CFFF      RJMP	_exit
FILE: D:\PCF8563\1602_time\timer_io.h
(0001) /*******************************************
(0002) *            联接关系头文件		   		   *
(0003) *  文 件 名:timer_io.h					   *
(0004) *  设    计:铜河						   *
(0005) *  修改日期:2007年07月08日				   *
(0006) *  版    本:V1.0						   *
(0007) *  主控芯片:Mega16						   *
(0008) *******************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) 
(0012) #define SPK_ON PORTD|=1<<6	  		//蜂鸣器接在PD6
(0013) #define SPK_OFF PORTD&=~(1<<6)
(0014) #define SPK_TG PORTD^=1<<6
(0015) 
(0016) #define LED_ON PORTB|=1<<3	  		//背光接到PB3
(0017) #define LED_OFF PORTB&=~(1<<3)
(0018) #define LED_TG PORTB^=1<<3
(0019) 
(0020) //输入端口定义
(0021) //按键定义:S1-0x01,S2-0x02,S3-0x04,S4-0x08
(0022) #define KEY_RD (~(((PIND>>2)|0xFE)&((PINC>>1)|0xF1)))
(0023) 
(0024) /**********************************
(0025) *          端口设置函数			  *
(0026) **********************************/
(0027) void port_init(void)
(0028)     {
(0029) 	DDRA  = 0xFF;
_port_init:
    006C EF8F      LDI	R24,0xFF
    006D BB8A      OUT	0x1A,R24
(0030) 	PORTA = 0x00;
    006E 2422      CLR	R2
    006F BA2B      OUT	0x1B,R2
(0031) 	DDRB  = 0x08;
    0070 E088      LDI	R24,0x8
    0071 BB87      OUT	0x17,R24
(0032) 	PORTB = 0x00;
    0072 BA28      OUT	0x18,R2
(0033) 	DDRC  = 0x00;
    0073 BA24      OUT	0x14,R2
(0034) 	PORTC = 0xFF;
    0074 EF8F      LDI	R24,0xFF
    0075 BB85      OUT	0x15,R24
(0035) 	DDRD  = 0xF0;
    0076 EF80      LDI	R24,0xF0
    0077 BB81      OUT	0x11,R24
(0036) 	PORTD = 0x0F;
    0078 E08F      LDI	R24,0xF
    0079 BB82      OUT	0x12,R24
    007A 9508      RET
FILE: D:\PCF8563\1602_time\delay.h
(0001) //延时函数
(0002) #include <iom16v.h>
(0003) 
(0004) //数据简化宏定义
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007) 
(0008) /***********************************
(0009) *         微秒级延时函数		   *
(0010) * 入口参数:i 需延时时长  us	   *
(0011) * 最大延时:65536 us	  		   *
(0012) * 时钟频率:7.3728M 其它频率不适用 *		  
(0013) ***********************************/
(0014) void delay_us(uint i)
(0015)     {
_delay_us:
  i                    --> R16
    007B C005      RJMP	0x0081
(0016) 	while(i)
(0017) 	    {
(0018) 		i--;
    007C 5001      SUBI	R16,1
    007D 4010      SBCI	R17,0
(0019) 		NOP();
    007E 0000      NOP
(0020) 		NOP();
    007F 0000      NOP
(0021) 		NOP();
    0080 0000      NOP
    0081 3000      CPI	R16,0
    0082 0701      CPC	R16,R17
    0083 F7C1      BNE	0x007C
    0084 9508      RET
_delay_ms:
  a                    --> R20
  i                    --> R16
    0085 940E052B  CALL	push_gset1
(0022) 		}
(0023) 	}
(0024) 
(0025) /***********************************
(0026) *         毫秒级延时函数		   *
(0027) * 入口参数:i 需延时时长  ms	   *
(0028) * 最大延时:65536 ms	  		   *
(0029) * 时钟频率:7.3728M 其它频率不适用 *	  
(0030) ***********************************/
(0031) void delay_ms(uint i)
(0032)     {
(0033) 	uint a;
(0034) 	for(;i;i--)
    0087 C00A      RJMP	0x0092
(0035) 	    {
(0036) 		for(a=1143;a;a--)
    0088 E747      LDI	R20,0x77
    0089 E054      LDI	R21,4
    008A C002      RJMP	0x008D
    008B 5041      SUBI	R20,1
    008C 4050      SBCI	R21,0
    008D 3040      CPI	R20,0
    008E 0745      CPC	R20,R21
    008F F7D9      BNE	0x008B
    0090 5001      SUBI	R16,1
    0091 4010      SBCI	R17,0
    0092 3000      CPI	R16,0
    0093 0701      CPC	R16,R17
    0094 F799      BNE	0x0088
    0095 940E052E  CALL	pop_gset1
    0097 9508      RET
_lcd_da:
  a                    --> R20
  data                 --> R22
    0098 940E0529  CALL	push_gset2
    009A 2F60      MOV	R22,R16
FILE: D:\PCF8563\1602_time\lcd1602_4h.h
(0001) /*******************************************
(0002) *              LCD1602联接函数	      	   *
(0003) *    LCD1602操作函数,4位数据联接关系:    *
(0004) *	 LCD1602:DB4-DB7 __ M16:PA4-PA7		   *
(0005) *	 LCD1602:RS _______ M16:PA2			   *
(0006) *	 LCD1602:E ________	M16:PA3			   *
(0007) *	 LCD1602:R/W ______	GND				   *
(0008) *	 时钟频率:外部7.3728M晶体			   * 
(0009) *	 作    者:铜河  					   *
(0010) *	 日	   期:2007年3月31日			   *
(0011) *******************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) 
(0015) //LCD相关端口定义
(0016) #define RS1602 PA2 					//RS接在PORTA.2上
(0017) #define E1602 PA3					//E接在PORTA.3上
(0018) #define LCD_CON PORTA				//控制接在PA口
(0019) #define CLR_RS LCD_CON&=~(1<<RS1602)//RS清0
(0020) #define SET_RS LCD_CON|=1<<RS1602	//RS置1
(0021) #define CLR_E LCD_CON&=~(1<<E1602)	//E清0
(0022) #define SET_E LCD_CON|=1<<E1602		//E置1
(0023) #define LCD_DATA PORTA				//数据接在PA口
(0024) //简化宏定义
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027) 
(0028) /*************************************
(0029) *         LCD1602操作函数组			 *
(0030) *************************************/
(0031) //写数据到LCD的函数:入口data,需写入的显示数据
(0032) void lcd_da(uchar data)
(0033)     {
(0034) 	uchar a;
(0035) 	SET_RS;				    		//RS置高,写数据
    009B 9ADA      SBI	0x1B,2
(0036) 	SET_E;
    009C 9ADB      SBI	0x1B,3
(0037) 	a=data|0x0F;					//将低四位置1,保留高4位
    009D 2F46      MOV	R20,R22
    009E 604F      ORI	R20,0xF
(0038) 	LCD_DATA=((LCD_DATA|0xF0)&a);	//数据高4位送端口
    009F B38B      IN	R24,0x1B
    00A0 6F80      ORI	R24,0xF0
    00A1 2384      AND	R24,R20
    00A2 BB8B      OUT	0x1B,R24
(0039) 	delay_us(50);
    00A3 E302      LDI	R16,0x32
    00A4 E010      LDI	R17,0
    00A5 DFD5      RCALL	_delay_us
(0040) 	CLR_E;							//E下降沿写入数据
    00A6 98DB      CBI	0x1B,3
(0041) 	delay_ms(1);					//延时50uS
    00A7 E001      LDI	R16,1
    00A8 E010      LDI	R17,0
    00A9 DFDB      RCALL	_delay_ms
(0042) 	
(0043)    	SET_E;
    00AA 9ADB      SBI	0x1B,3
(0044) 	a=((data<<4)|0x0F);				//将低四位移到高四位并保留
    00AB 2F46      MOV	R20,R22
    00AC 704F      ANDI	R20,0xF
    00AD 9542      SWAP	R20
    00AE 604F      ORI	R20,0xF
(0045) 	LCD_DATA=((LCD_DATA|0xF0)&a);	//数据低4位送端口
    00AF B38B      IN	R24,0x1B
    00B0 6F80      ORI	R24,0xF0
    00B1 2384      AND	R24,R20
    00B2 BB8B      OUT	0x1B,R24
(0046) 	delay_us(50);
    00B3 E302      LDI	R16,0x32
    00B4 E010      LDI	R17,0
    00B5 DFC5      RCALL	_delay_us
(0047) 	CLR_E;							//E下降沿写入数据
    00B6 98DB      CBI	0x1B,3
(0048) 	delay_ms(1);					//延时50uS
    00B7 E001      LDI	R16,1
    00B8 E010      LDI	R17,0
    00B9 DFCB      RCALL	_delay_ms
    00BA 940E051D  CALL	pop_gset2
    00BC 9508      RET
_lcd_comm:
  a                    --> R20
  data                 --> R22
    00BD 940E0529  CALL	push_gset2
    00BF 2F60      MOV	R22,R16
(0049) 	} 
(0050) 
(0051) //写指令到LCD的函数:入口data,需写入的控制指令
(0052) void lcd_comm(uchar data)
(0053) 	{
(0054) 	uchar a;
(0055) 	CLR_RS;				 			//RS清0,写指令
    00C0 98DA      CBI	0x1B,2
(0056) 	SET_E;
    00C1 9ADB      SBI	0x1B,3
(0057) 	a=data|0x0F;					//将低四位置1,保留高4位
    00C2 2F46      MOV	R20,R22
    00C3 604F      ORI	R20,0xF
(0058) 	LCD_DATA=((LCD_DATA|0xF0)&a);	//指令高4位送端口
    00C4 B38B      IN	R24,0x1B
    00C5 6F80      ORI	R24,0xF0
    00C6 2384      AND	R24,R20
    00C7 BB8B      OUT	0x1B,R24
(0059) 	delay_us(50);
    00C8 E302      LDI	R16,0x32
    00C9 E010      LDI	R17,0
    00CA DFB0      RCALL	_delay_us
(0060) 	CLR_E;							//E下降沿写入指令
    00CB 98DB      CBI	0x1B,3
(0061) 	delay_ms(1);					//延时50uS
    00CC E001      LDI	R16,1
    00CD E010      LDI	R17,0
    00CE DFB6      RCALL	_delay_ms
(0062) 	
(0063) 	SET_E;
    00CF 9ADB      SBI	0x1B,3
(0064) 	a=((data<<4)|0x0F);				//将低四位移到高四位并保留
    00D0 2F46      MOV	R20,R22
    00D1 704F      ANDI	R20,0xF
    00D2 9542      SWAP	R20
    00D3 604F      ORI	R20,0xF
(0065) 	LCD_DATA=((LCD_DATA|0xF0)&a);	//指令低4位送端口
    00D4 B38B      IN	R24,0x1B
    00D5 6F80      ORI	R24,0xF0
    00D6 2384      AND	R24,R20
    00D7 BB8B      OUT	0x1B,R24
(0066) 	delay_us(50);
    00D8 E302      LDI	R16,0x32
    00D9 E010      LDI	R17,0
    00DA DFA0      RCALL	_delay_us
(0067) 	CLR_E;							//E下降沿写入指令
    00DB 98DB      CBI	0x1B,3
(0068) 	delay_ms(1);					//延时50uS
    00DC E001      LDI	R16,1
    00DD E010      LDI	R17,0
    00DE DFA6      RCALL	_delay_ms
    00DF 940E051D  CALL	pop_gset2
    00E1 9508      RET
_lcd_comm_b:
  a                    --> R20
  data                 --> R20
    00E2 940E052B  CALL	push_gset1
    00E4 2F40      MOV	R20,R16
(0069) 	}
(0070) 
(0071) //写半指令到LCD的函数:入口data,需写入的控制指令
(0072) void lcd_comm_b(uchar data)
(0073)     {
(0074) 	uchar a;
(0075) 	CLR_RS;				 			//RS清0,写指令
    00E5 98DA      CBI	0x1B,2
(0076) 	SET_E;
    00E6 9ADB      SBI	0x1B,3
(0077) 	a=data|0x0F;					//将低四位置1,保留高4位
    00E7 604F      ORI	R20,0xF
(0078) 	LCD_DATA=((LCD_DATA|0xF0)&a);	//指令高4位送端口
    00E8 B38B      IN	R24,0x1B
    00E9 6F80      ORI	R24,0xF0
    00EA 2384      AND	R24,R20
    00EB BB8B      OUT	0x1B,R24
(0079) 	delay_us(50);
    00EC E302      LDI	R16,0x32
    00ED E010      LDI	R17,0
    00EE DF8C      RCALL	_delay_us
(0080) 	CLR_E;							//E下降沿写入指令
    00EF 98DB      CBI	0x1B,3
(0081) 	delay_ms(1);					//延时50uS
    00F0 E001      LDI	R16,1
    00F1 E010      LDI	R17,0
    00F2 DF92      RCALL	_delay_ms
    00F3 940E052E  CALL	pop_gset1
    00F5 9508      RET
(0082) 	}   
(0083) 
(0084) //LCD1602初始化函数
(0085) void lcd_init(void)
(0086)     {
(0087) 	delay_ms(2);
_lcd_init:
    00F6 E002      LDI	R16,2
    00F7 E010      LDI	R17,0
    00F8 DF8C      RCALL	_delay_ms
(0088) 	lcd_comm_b(0x20);				//写半指令:4位数据
    00F9 E200      LDI	R16,0x20
    00FA DFE7      RCALL	_lcd_comm_b
(0089) 	delay_us(400);  
    00FB E900      LDI	R16,0x90
    00FC E011      LDI	R17,1
    00FD DF7D      RCALL	_delay_us
(0090) 	lcd_comm(0x28);			 		 //写指令:4位数据、2行显示、5*8点阵
    00FE E208      LDI	R16,0x28
    00FF DFBD      RCALL	_lcd_comm
(0091) 	delay_us(200);
    0100 EC08      LDI	R16,0xC8
    0101 E010      LDI	R17,0
    0102 DF78      RCALL	_delay_us
(0092) 	lcd_comm(0x0C);			 		 //写指令:显示开
    0103 E00C      LDI	R16,0xC
    0104 DFB8      RCALL	_lcd_comm
(0093) 	delay_us(200);
    0105 EC08      LDI	R16,0xC8
    0106 E010      LDI	R17,0
    0107 DF73      RCALL	_delay_us
(0094) 	lcd_comm(0x06);			 		 //写指令:自左向右显示
    0108 E006      LDI	R16,6
    0109 DFB3      RCALL	_lcd_comm
(0095) 	delay_us(100);
    010A E604      LDI	R16,0x64
    010B E010      LDI	R17,0
    010C DF6E      RCALL	_delay_us
(0096) 	lcd_comm(0x01);			 		 //写指令:CLS
    010D E001      LDI	R16,1
    010E DFAE      RCALL	_lcd_comm
(0097) 	delay_ms(10);
    010F E00A      LDI	R16,0xA
    0110 E010      LDI	R17,0
    0111 DF73      RCALL	_delay_ms
    0112 9508      RET
(0098) 	}
(0099) 
(0100) //清屏指令函数
(0101) void cls(void)
(0102)     {
(0103) 	lcd_comm(0x01);
_cls:
    0113 E001      LDI	R16,1
    0114 DFA8      RCALL	_lcd_comm
(0104) 	delay_ms(5);

⌨️ 快捷键说明

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