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

📄 timer.lst

📁 利用时间片思想设计的一个AVR单片机的时钟程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    011A C00C      RJMP	0x0127
(0180)     while (*s) 
(0181)     {	if( LCD_write_char( 0, *s ) == 1 )
    011B 01FA      MOVW	R30,R20
    011C 8120      LDD	R18,Z+0
    011D 2733      CLR	R19
    011E 2700      CLR	R16
    011F 2711      CLR	R17
    0120 DF58      RCALL	_LCD_write_char
    0121 3001      CPI	R16,1
    0122 F411      BNE	0x0125
(0182)     	{	return( 1 );	}
    0123 E001      LDI	R16,1
    0124 C007      RJMP	0x012C
(0183) 		s ++;
    0125 5F4F      SUBI	R20,0xFF
    0126 4F5F      SBCI	R21,0xFF
    0127 01FA      MOVW	R30,R20
    0128 8020      LDD	R2,Z+0
    0129 2022      TST	R2
    012A F781      BNE	0x011B
(0184)     }
(0185)     return( 0 );
    012B 2700      CLR	R16
    012C 940E03A9  CALL	pop_gset3
    012E 9508      RET
_LCD_write_uint8:
  tempbuf              --> Y+0
  i                    --> R20
  num                  --> R22
  data                 --> Y+9
  Y                    --> R10
  X                    --> R20
    012F 940E03B3  CALL	push_gset3
    0131 2EA2      MOV	R10,R18
    0132 2F40      MOV	R20,R16
    0133 9723      SBIW	R28,3
    0134 856B      LDD	R22,Y+11
(0186) }
(0187) 
(0188) unsigned char LCD_write_uint8(unsigned char X, unsigned char Y, unsigned int data, unsigned char num)
(0189) {	unsigned char tempbuf[3],i;
(0190) 	tempbuf[0]=(data/100)+'0';
    0135 E624      LDI	R18,0x64
    0136 E030      LDI	R19,0
    0137 8509      LDD	R16,Y+9
    0138 851A      LDD	R17,Y+10
    0139 940E0374  CALL	div16u
    013B 01C8      MOVW	R24,R16
    013C 96C0      ADIW	R24,0x30
    013D 8388      STD	Y+0,R24
(0191) 	tempbuf[1]=((data%100)/10)+'0';
    013E E624      LDI	R18,0x64
    013F E030      LDI	R19,0
    0140 8509      LDD	R16,Y+9
    0141 851A      LDD	R17,Y+10
    0142 940E0372  CALL	mod16u
    0144 E02A      LDI	R18,0xA
    0145 E030      LDI	R19,0
    0146 940E0374  CALL	div16u
    0148 01C8      MOVW	R24,R16
    0149 96C0      ADIW	R24,0x30
    014A 8389      STD	Y+1,R24
(0192) 	tempbuf[2]=(data%10)+'0';
    014B E02A      LDI	R18,0xA
    014C E030      LDI	R19,0
    014D 8509      LDD	R16,Y+9
    014E 851A      LDD	R17,Y+10
    014F 940E0372  CALL	mod16u
    0151 01C8      MOVW	R24,R16
    0152 96C0      ADIW	R24,0x30
    0153 838A      STD	Y+2,R24
(0193) 	LCD_set_xy( X, Y );
    0154 2D2A      MOV	R18,R10
    0155 2F04      MOV	R16,R20
    0156 DFA7      RCALL	_LCD_set_xy
(0194) 	for( i=0; i<num; i++ )
    0157 2744      CLR	R20
    0158 C017      RJMP	0x0170
(0195) 	{	if( LCD_write_char( 0, tempbuf[(3-num)+i] ) == 1 )	{	return( 1 );	}	}
    0159 2E26      MOV	R2,R22
    015A 2433      CLR	R3
    015B E0E3      LDI	R30,3
    015C E0F0      LDI	R31,0
    015D 19E2      SUB	R30,R2
    015E 09F3      SBC	R31,R3
    015F 2E24      MOV	R2,R20
    0160 2433      CLR	R3
    0161 0DE2      ADD	R30,R2
    0162 1DF3      ADC	R31,R3
    0163 01CE      MOVW	R24,R28
    0164 0FE8      ADD	R30,R24
    0165 1FF9      ADC	R31,R25
    0166 8120      LDD	R18,Z+0
    0167 2733      CLR	R19
    0168 2700      CLR	R16
    0169 2711      CLR	R17
    016A DF0E      RCALL	_LCD_write_char
    016B 3001      CPI	R16,1
    016C F411      BNE	0x016F
    016D E001      LDI	R16,1
    016E C004      RJMP	0x0173
    016F 9543      INC	R20
    0170 1746      CP	R20,R22
    0171 F338      BCS	0x0159
(0196) 	return(0);
    0172 2700      CLR	R16
    0173 9623      ADIW	R28,3
    0174 940E03A9  CALL	pop_gset3
    0176 9508      RET
(0197) }
(0198) /*-----------------------------------------------------------------------
(0199) 延时函数
(0200) 系统时钟:8M
(0201) -----------------------------------------------------------------------*/
(0202) void delay_1us(void)                 //1us延时函数
(0203) {   asm("nop");  }
_delay_1us:
    0177 0000      NOP
    0178 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0179 940E03B5  CALL	push_gset2
    017B 01B8      MOVW	R22,R16
(0204) 
(0205) void delay_nus(unsigned int n)       //N us延时函数
(0206) {   unsigned int i=0;
    017C 2744      CLR	R20
    017D 2755      CLR	R21
(0207) 	for (i=0;i<n;i++)
    017E C003      RJMP	0x0182
(0208)    	delay_1us();
    017F DFF7      RCALL	_delay_1us
    0180 5F4F      SUBI	R20,0xFF
    0181 4F5F      SBCI	R21,0xFF
    0182 1746      CP	R20,R22
    0183 0757      CPC	R21,R23
    0184 F3D0      BCS	0x017F
    0185 940E03A6  CALL	pop_gset2
    0187 9508      RET
(0209) }
(0210) 
(0211) void delay_1ms(void)                 //1ms延时函数
(0212) {	unsigned int i;
(0213)    	for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0188 2700      CLR	R16
    0189 2711      CLR	R17
    018A C002      RJMP	0x018D
    018B 5F0F      SUBI	R16,0xFF
    018C 4F1F      SBCI	R17,0xFF
    018D 3704      CPI	R16,0x74
    018E E0E4      LDI	R30,4
    018F 071E      CPC	R17,R30
    0190 F3D0      BCS	0x018B
    0191 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0192 940E03B5  CALL	push_gset2
    0194 01B8      MOVW	R22,R16
(0214) }
(0215)   
(0216) void delay_nms(unsigned int n)       //N ms延时函数
(0217) {	unsigned int i=0;
    0195 2744      CLR	R20
    0196 2755      CLR	R21
(0218)    	for (i=0;i<n;i++)
    0197 C003      RJMP	0x019B
(0219)    	delay_1ms();
    0198 DFEF      RCALL	_delay_1ms
    0199 5F4F      SUBI	R20,0xFF
    019A 4F5F      SBCI	R21,0xFF
    019B 1746      CP	R20,R22
    019C 0757      CPC	R21,R23
    019D F3D0      BCS	0x0198
    019E 940E03A6  CALL	pop_gset2
    01A0 9508      RET
FILE: G:\Demo\Deal.h
(0001) #define	KEYPIN	PINC
(0002) #define	KEYDDR	DDRC
(0003) #define	KEYPORT	PORTC
(0004) #define	KEYMASK	0x0f
(0005) 
(0006) uchar	KeyTask = 0;
(0007) uchar	Keybuf = 0;
(0008) uchar	Keydata = 0;
(0009) void	InitalKey(void)
(0010) {	KEYDDR = KEYMASK;
_InitalKey:
    01A1 E08F      LDI	R24,0xF
    01A2 BB84      OUT	0x14,R24
(0011) 	KEYPORT = ~KEYMASK;
    01A3 EF80      LDI	R24,0xF0
    01A4 BB85      OUT	0x15,R24
    01A5 9508      RET
(0012) }
(0013) /**********************************************************
(0014) *原型:uchar ScanKey(void)
(0015) *功能:扫描键盘模块
(0016) *说明:采用算法进行扫描,不循环等待。
(0017) *参数:无
(0018) *返回:uchar按键数据
(0019) **********************************************************/	
(0020) uchar	ScanKey(void)
(0021) {	uchar	temp,i;
(0022) 	switch(KeyTask)
_ScanKey:
  i                    --> R16
  temp                 --> R18
    01A6 91000065  LDS	R16,KeyTask
    01A8 2711      CLR	R17
    01A9 3000      CPI	R16,0
    01AA 0701      CPC	R16,R17
    01AB F0C1      BEQ	0x01C4
    01AC 3001      CPI	R16,1
    01AD E0E0      LDI	R30,0
    01AE 071E      CPC	R17,R30
    01AF F0F9      BEQ	0x01CF
    01B0 3002      CPI	R16,2
    01B1 E0E0      LDI	R30,0
    01B2 071E      CPC	R17,R30
    01B3 F0F9      BEQ	0x01D3
    01B4 3003      CPI	R16,3
    01B5 E0E0      LDI	R30,0
    01B6 071E      CPC	R17,R30
    01B7 F409      BNE	0x01B9
    01B8 C047      RJMP	0x0200
    01B9 3004      CPI	R16,4
    01BA E0E0      LDI	R30,0
    01BB 071E      CPC	R17,R30
    01BC F409      BNE	0x01BE
    01BD C04A      RJMP	0x0208
    01BE 3005      CPI	R16,5
    01BF E0E0      LDI	R30,0
    01C0 071E      CPC	R17,R30
    01C1 F409      BNE	0x01C3
    01C2 C049      RJMP	0x020C
    01C3 C053      RJMP	0x0217
(0023) 	{	case 0:/***有按键按下吗?***/
(0024) 				KEYPORT = ~KEYMASK;
    01C4 EF80      LDI	R24,0xF0
    01C5 BB85      OUT	0x15,R24
(0025) 				if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
    01C6 B383      IN	R24,0x13
    01C7 7F80      ANDI	R24,0xF0
    01C8 3F80      CPI	R24,0xF0
    01C9 F409      BNE	0x01CB
    01CA C04C      RJMP	0x0217
(0026)             	{	KeyTask=1;	}	/***延时一个系统时间***/
    01CB E081      LDI	R24,1
    01CC 93800065  STS	KeyTask,R24
(0027)             break;
    01CE C048      RJMP	0x0217
(0028)     	case 1: /***键按下去抖延时***/
(0029)         		KeyTask=2;                    /***延时一个系统时间***/
    01CF E082      LDI	R24,2
    01D0 93800065  STS	KeyTask,R24
(0030)         	break;
    01D2 C044      RJMP	0x0217
(0031)     	case 2: /***键值判断***/
(0032)     			if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
    01D3 B383      IN	R24,0x13
    01D4 7F80      ANDI	R24,0xF0
    01D5 3F80      CPI	R24,0xF0
    01D6 F119      BEQ	0x01FA
(0033)     			{	temp = 0x01;
    01D7 E021      LDI	R18,1
(0034)     				for( i=0; i<4; i++ )
    01D8 2700      CLR	R16
    01D9 C01E      RJMP	0x01F8
(0035)     				{	KEYPORT |= KEYMASK;		//输出全为高电平
    01DA B385      IN	R24,0x15
    01DB 608F      ORI	R24,0xF
    01DC BB85      OUT	0x15,R24
(0036)     					KEYPORT &= ~temp;		//输出某个为低电平
    01DD 2E22      MOV	R2,R18
    01DE 9420      COM	R2
    01DF B235      IN	R3,0x15
    01E0 2032      AND	R3,R2
    01E1 BA35      OUT	0x15,R3
(0037)     					asm("nop");	asm("nop");	asm("nop");	asm("nop");
    01E2 0000      NOP
    01E3 0000      NOP
    01E4 0000      NOP
    01E5 0000      NOP
(0038)     					if( (KEYPIN&(~KEYMASK)) != (~KEYMASK) )
    01E6 B383      IN	R24,0x13
    01E7 7F80      ANDI	R24,0xF0
    01E8 3F80      CPI	R24,0xF0
    01E9 F061      BEQ	0x01F6
(0039)     					{	Keybuf = (KEYPIN&(~KEYMASK)) + temp;	
    01EA B383      IN	R24,0x13
    01EB 7F80      ANDI	R24,0xF0
    01EC 0F82      ADD	R24,R18
    01ED 93800066  STS	Keybuf,R24
(0040)     						KeyTask = 3;	KEYPORT = ~KEYMASK;	return(1);	
    01EF E083      LDI	R24,3
    01F0 93800065  STS	KeyTask,R24
    01F2 EF80      LDI	R24,0xF0
    01F3 BB85      OUT	0x15,R24
    01F4 E001      LDI	R16,1
    01F5 C022      RJMP	0x0218
(0041)     					}
(0042)     					temp = temp<<1;
    01F6 0F22      LSL	R18
    01F7 9503      INC	R16
    01F8 3004      CPI	R16,4
    01F9 F300      BCS	0x01DA
(0043)     				}
(0044)     			}
(0045)     			KEYPORT = ~KEYMASK;
    01FA EF80      LDI	R24,0xF0
    01FB BB85      OUT	0x15,R24
(0046)         		KeyTask=0;            		/*抖动*/
    01FC 2422      CLR	R2
    01FD 92200065  STS	KeyTask,R2
(0047)         	break;
    01FF C017      RJMP	0x0217
(0048)     	case 3: /***有松开吗?***/
(0049)     			if( (KEYPIN&(~KEYMASK)) == (~KEYMASK) )
    0200 B383      IN	R24,0x13
    0201 7F80      ANDI	R24,0xF0
    0202 3F80      CPI	R24,0xF0
    0203 F499      BNE	0x0217
(0050)         		{	KeyTask=4;	}
    0204 E084      LDI	R24,4
    0205 93800065  STS	KeyTask,R24
(0051)         	break;
    0207 C00F      RJMP	0x0217
(0052)     	case 4: /***键松开去抖延时***/
(0053)             	KeyTask=5;                    /***延时一个系统时间***/
    0208 E085      LDI	R24,5
    0209 93800065  STS	KeyTask,R24
(0054)            	break;
    020B C00B      RJMP	0x0217
(0055)    		case 5: /***键值判断***/
(0056)             	if( (KEYPIN&(~KEYMASK)) == (~KEYMASK) )
    020C B383      IN	R24,0x13
    020D 7F80      ANDI	R24,0xF0
    020E 3F80      CPI	R24,0xF0
    020F F421      BNE	0x0214
(0057)             	{	KeyTask=0;	}                  /*去按键检测开始*/
    0210 2422      CLR	R2
    0211 92200065  STS	KeyTask,R2
    0213 C003      RJMP	0x0217
(0058)             	else
(0059)             	{	KeyTask=3; 	}              /*抖动*/
    0214 E083      LDI	R24,3
    0215 93800065  STS	KeyTask,R24
(0060)             	break;
(0061) 	}
(0062) 	return(0);
    0217 2700      CLR	R16
    0218 9508      RET
(0063) }
(0064) 
(0065) void	DealKey(void)
(0066) {	//LCD_write_uint8(0,1,Keybuf,3);
(0067) 	switch( Keybuf )
_DealKey:
    0219 91000066  LDS	R16,Keybuf
    021B 2711      CLR	R17
    021C 3701      CPI	R16,0x71
    021D E0E0      LDI	R30,0
    021E 071E      CPC	R17,R30
    021F F009      BEQ	0x0221
    0220 C000      RJMP	0x0221
(0068) 	{	case	KEYONE:
(0069) 				break;
    0221 9508      RET
_DispTime:
    0222 9723      SBIW	R28,3
(0070) 	}
(0071) }
(0072) 
(0073) void	DispTime(void)
(0074) {	
(0075) 	LCD_write_uint8(0, 0, Time.year, 2);
    0223 E082      LDI	R24,2
    0224 838A      STD	Y+2,R24
    0225 9020006E  LDS	R2,Time
    0227 2433      CLR	R3
    0228 8239      STD	Y+1,R3
    0229 8228      STD	Y+0,R2
    022A 2722      CLR	R18
    022B 2700      CLR	R16
    022C DF02      RCALL	_LCD_write_uint8
(0076) 	LCD_write_string(2,0,"-");	
    022D E68C      LDI	R24,0x6C
    022E E090      LDI	R25,0
    022F 8399      STD	Y+1,R25
    0230 8388      STD	Y+0,R24
    0231 2722      CLR	R18
    0232 E002      LDI	R16,2
    0233 DEDD      RCALL	_LCD_write_string
(0077) 	LCD_write_uint8(3, 0, Time.month, 2);
    0234 E082      LDI	R24,2
    0235 838A      STD	Y+2,R24
    0236 9020006F  LDS	R2,Time+1
    0238 2433      CLR	R3
    0239 8239      STD	Y+1,R3
    023A 8228      STD	Y+0,R2
    023B 2722      CLR	R18
    023C E003      LDI	R16,3
    023D DEF1      RCALL	_LCD_write_uint8
(0078) 	LCD_write_string(5,0,"-");	
    023E E68C      LDI	R24,0x6C
    023F E090      LDI	R25,0
    0240 8399      STD	Y+1,R25
    0241 8388      STD	Y+0,R24
    0242 2722      CLR	R18
    0243 E005      LDI	R16,5
    0244 DECC      RCALL	_LCD_write_string
(0079) 	LCD_write_uint8(6, 0, Time.day, 2);
    0245 E082      LDI	R24,2
    0246 838A      STD	Y+2,R24
    0247 90200070  LDS	R2,Time+2
    0249 2433      CLR	R3
    024A 8239      STD	Y+1,R3
    024B 8228      STD	Y+0,R2
    024C 2722      CLR	R18
    024D E006      LDI	R16,6
    024E DEE0      RCALL	_LCD_write_uint8
(0080) 	

⌨️ 快捷键说明

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