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

📄 yj12864.lst

📁 12864菜单
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0306 E5CF      LDI	R28,0x5F
    0307 E0D4      LDI	R29,4
    0308 BFCD      OUT	0x3D,R28
    0309 BFDE      OUT	0x3E,R29
    030A 51C0      SUBI	R28,0x10
    030B 40D0      SBCI	R29,0
    030C EA0A      LDI	R16,0xAA
    030D 8308      STD	Y+0,R16
    030E 2400      CLR	R0
    030F EEE6      LDI	R30,0xE6
    0310 E0F1      LDI	R31,1
    0311 E011      LDI	R17,1
    0312 3EE6      CPI	R30,0xE6
    0313 07F1      CPC	R31,R17
    0314 F011      BEQ	0x0317
    0315 9201      ST	R0,Z+
    0316 CFFB      RJMP	0x0312
    0317 8300      STD	Z+0,R16
    0318 E8E5      LDI	R30,0x85
    0319 E0F4      LDI	R31,4
    031A E6A0      LDI	R26,0x60
    031B E0B0      LDI	R27,0
    031C E016      LDI	R17,6
    031D 30EB      CPI	R30,0xB
    031E 07F1      CPC	R31,R17
    031F F021      BEQ	0x0324
    0320 95C8      LPM
    0321 9631      ADIW	R30,1
    0322 920D      ST	R0,X+
    0323 CFF9      RJMP	0x031D
    0324 940E0A59  CALL	_main
_exit:
    0326 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    0327 940E0A7E  CALL	push_gset2
    0329 01B8      MOVW	R22,R16
FILE: C:\DOCUME~1\Administrator\桌面\12864液晶菜单显示时钟不过不能调2\AVR_PQ1A.h
(0001) /*******************************************
(0002)   文件:AVR_PQ1A.H
(0003)   功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005) 
(0006) #include <iom16v.h>			//包含型号头文件
(0007) #include <macros.h>			//包含"位"操作头文件
(0008) 
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) 
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2	//LED锁存器控制端
(0015) #define SEGLK PA3	//数码管段选锁存器控制端
(0016) #define BITLK PA4	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功    能: 延时指定微秒(8M晶振)
(0024) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值  : 无
(0026) /********************************************/
(0027) void Delayus(uint US)		  
(0028) {
(0029)  uint i;
(0030)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    032A E005      LDI	R16,5
    032B E010      LDI	R17,0
    032C 019B      MOVW	R18,R22
    032D 940E0A5F  CALL	empy16s
    032F 01B8      MOVW	R22,R16
    0330 9576      LSR	R23
    0331 9567      ROR	R22
    0332 9576      LSR	R23
    0333 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    0334 2744      CLR	R20
    0335 2755      CLR	R21
    0336 C002      RJMP	0x0339
    0337 5F4F      SUBI	R20,0xFF
    0338 4F5F      SBCI	R21,0xFF
    0339 1746      CP	R20,R22
    033A 0757      CPC	R21,R23
    033B F3D8      BCS	0x0337
    033C 940E0A6F  CALL	pop_gset2
    033E 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    033F 940E0A7E  CALL	push_gset2
(0032) }
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功    能: 延时指定毫秒(8M晶振)
(0036) 参    数: MS--延时的毫秒数
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)		  
(0040) {
(0041)  uint i,j;
(0042)  for( i=0;i<MS;i++)
    0341 2744      CLR	R20
    0342 2755      CLR	R21
    0343 C00B      RJMP	0x034F
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0344 2766      CLR	R22
    0345 2777      CLR	R23
    0346 C002      RJMP	0x0349
    0347 5F6F      SUBI	R22,0xFF
    0348 4F7F      SBCI	R23,0xFF
    0349 3765      CPI	R22,0x75
    034A E0E4      LDI	R30,4
    034B 077E      CPC	R23,R30
    034C F3D0      BCS	0x0347
    034D 5F4F      SUBI	R20,0xFF
    034E 4F5F      SBCI	R21,0xFF
    034F 1740      CP	R20,R16
    0350 0751      CPC	R21,R17
    0351 F390      BCS	0x0344
    0352 940E0A6F  CALL	pop_gset2
    0354 9508      RET
(0044) }
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    0355 EF8F      LDI	R24,0xFF
    0356 BB8A      OUT	0x1A,R24
(0054) 	DDRB=0xFF;
    0357 BB87      OUT	0x17,R24
(0055) 	DDRC=0xFF;
    0358 BB84      OUT	0x14,R24
(0056) 	DDRD=0xFF;
    0359 BB81      OUT	0x11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    035A 2422      CLR	R2
    035B B82D      OUT	0x0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    035C 9ADE      SBI	0x1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    035D 98AE      CBI	0x15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    035E 98D9      CBI	0x1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    035F BB88      OUT	0x18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    0360 9ADA      SBI	0x1B,2
(0065)  	Delayus(5);		
    0361 E005      LDI	R16,5
    0362 E010      LDI	R17,0
    0363 DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    0364 98DA      CBI	0x1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    0365 2422      CLR	R2
    0366 BA28      OUT	0x18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    0367 9ADB      SBI	0x1B,3
(0070)  	Delayus(50);			  
    0368 E302      LDI	R16,0x32
    0369 E010      LDI	R17,0
    036A DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    036B 98DB      CBI	0x1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    036C EF8F      LDI	R24,0xFF
    036D BB88      OUT	0x18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    036E 9ADC      SBI	0x1B,4
(0075)  	Delayus(50);				   
    036F E302      LDI	R16,0x32
    0370 E010      LDI	R17,0
    0371 DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    0372 98DC      CBI	0x1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    0373 EF8F      LDI	R24,0xFF
    0374 BB82      OUT	0x12,R24
(0079) 	PORTA|=BIT(PA7);
    0375 9ADF      SBI	0x1B,7
(0080) 	Delayus(50);
    0376 E302      LDI	R16,0x32
    0377 E010      LDI	R17,0
    0378 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    0379 98DF      CBI	0x1B,7
    037A 9508      RET
FILE: C:\DOCUME~1\Administrator\桌面\12864液晶菜单显示时钟不过不能调2\MKEY.C
(0001) /*******************************************
(0002)   文件:MKEY.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的矩阵键盘,按不同的键,则数码管显示键码0~F
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) 
(0013) /*******************************************
(0014) 函数名称: Key_press
(0015) 功    能: 检测是否有键按下
(0016) 参    数: 无
(0017) 返回值  : pressed--有键按下时为TRUE,否则为FALSE
(0018) /********************************************/
(0019) uchar Mkey_press(void)
(0020) {
(0021)  uchar pressed;		 		
(0022)  KEY_DDR=OUT;			//定义数据端口为输出
_Mkey_press:
  pressed              --> R16
    037B EF8F      LDI	R24,0xFF
    037C BB81      OUT	0x11,R24
(0023)  KEY_PORTO=0xF0;			//输出数据(输出检测码)
    037D EF80      LDI	R24,0xF0
    037E BB82      OUT	0x12,R24
(0024)  KEY_DDR=IN;				//定义数据端口为输入
    037F BB81      OUT	0x11,R24
(0025)  if((KEY_PORTI)!=0xF0)		//检测是否有键按下
    0380 B380      IN	R24,0x10
    0381 3F80      CPI	R24,0xF0
    0382 F011      BEQ	0x0385
(0026)  	pressed=TRUE;			//有键按下则返回TRUE
    0383 E001      LDI	R16,1
    0384 C001      RJMP	0x0386
(0027)  else
(0028)  	pressed=FALSE;			//无键按下则返回FALSE
    0385 2700      CLR	R16
(0029)  KEY_DDR=OUT;				//数据端口还原为输出
    0386 EF8F      LDI	R24,0xFF
    0387 BB81      OUT	0x11,R24
(0030)  return pressed;
    0388 9508      RET
_Mkey_scan:
  keycode              --> R20
  i                    --> R10
    0389 940E0A7C  CALL	push_gset3
(0031) }
(0032) /*******************************************
(0033) 函数名称: Key_scan
(0034) 功    能: 扫描所按的键并返回键值
(0035) 参    数: 无
(0036) 返回值  : keycode--被按下键值
(0037) /********************************************/
(0038) uchar Mkey_scan(void)
(0039) {
(0040)  uchar i=0x7F,keycode=0xFF;		//i为扫描码,
    038B E78F      LDI	R24,0x7F
    038C 2EA8      MOV	R10,R24
    038D EF4F      LDI	R20,0xFF
(0041)  Delayms(15);					//延时消抖
    038E E00F      LDI	R16,0xF
    038F E010      LDI	R17,0
    0390 DFAE      RCALL	_Delayms
(0042)  if(Mkey_press()==TRUE)			//如果有键按下
    0391 DFE9      RCALL	_Mkey_press
    0392 3001      CPI	R16,1
    0393 F009      BEQ	0x0395
    0394 C092      RJMP	0x0427
(0043)  {
(0044)   	do
(0045) 	{
(0046) 	   i=(i<<1|i>>7);		//进行行扫描
    0395 2C2A      MOV	R2,R10
    0396 9426      LSR	R2
    0397 9426      LSR	R2
    0398 9426      LSR	R2
    0399 9426      LSR	R2
    039A 9426      LSR	R2
    039B 9426      LSR	R2
    039C 9426      LSR	R2
    039D 2C3A      MOV	R3,R10
    039E 0C33      LSL	R3
    039F 2832      OR	R3,R2
    03A0 2CA3      MOV	R10,R3
(0047) 	   KEY_DDR=0x0F;		//定义数据端口低四位为输出,高四位为输入
    03A1 E08F      LDI	R24,0xF
    03A2 BB81      OUT	0x11,R24
(0048) 	   KEY_PORTO=i;			//输出扫描码	   	   
    03A3 BA32      OUT	0x12,R3
(0049) 	   Delayms(1);			//防止读入出错,加入延时
    03A4 E001      LDI	R16,1
    03A5 E010      LDI	R17,0
    03A6 DF98      RCALL	_Delayms
(0050) 	   keycode=KEY_PORTI;	//读入原始键码
    03A7 B340      IN	R20,0x10
(0051) 	}while((keycode&0xF0)==0xF0);	//是否检测到被按下按键(扫描到就跳出循环,否则继续扫描)
    03A8 2F84      MOV	R24,R20
    03A9 7F80      ANDI	R24,0xF0
    03AA 3F80      CPI	R24,0xF0
    03AB F349      BEQ	0x0395
(0052) 	do
(0053) 	{
(0054) 	}while(Mkey_press()==TRUE);	//等待按键释放(为了防止按一次,执行多次的现象)
    03AC DFCE      RCALL	_Mkey_press
    03AD 3001      CPI	R16,1
    03AE F3E9      BEQ	0x03AC
(0055) 	Delayms(15);				//延时消抖
    03AF E00F      LDI	R16,0xF
    03B0 E010      LDI	R17,0
    03B1 DF8D      RCALL	_Delayms
(0056) 	switch(keycode)				//将原始键码翻译成0~F
    03B2 2F64      MOV	R22,R20
    03B3 2777      CLR	R23
    03B4 3B67      CPI	R22,0xB7
    03B5 E0E0      LDI	R30,0
    03B6 077E      CPC	R23,R30
    03B7 F409      BNE	0x03B9
    03B8 C06B      RJMP	0x0424
    03B9 3B6B      CPI	R22,0xBB
    03BA E0E0      LDI	R30,0
    03BB 077E      CPC	R23,R30
    03BC F409      BNE	0x03BE
    03BD C05E      RJMP	0x041C
    03BE 3B6D      CPI	R22,0xBD
    03BF E0E0      LDI	R30,0
    03C0 077E      CPC	R23,R30
    03C1 F409      BNE	0x03C3
    03C2 C051      RJMP	0x0414
    03C3 3B6E      CPI	R22,0xBE
    03C4 E0E0      LDI	R30,0
    03C5 077E      CPC	R23,R30
    03C6 F409      BNE	0x03C8
    03C7 C044      RJMP	0x040C
    03C8 EB8E      LDI	R24,0xBE
    03C9 E090      LDI	R25,0
    03CA 1786      CP	R24,R22
    03CB 0797      CPC	R25,R23
    03CC F0A4      BLT	0x03E1
    03CD 3767      CPI	R22,0x77
    03CE E0E0      LDI	R30,0
    03CF 077E      CPC	R23,R30
    03D0 F409      BNE	0x03D2
    03D1 C054      RJMP	0x0426
    03D2 376B      CPI	R22,0x7B
    03D3 E0E0      LDI	R30,0
    03D4 077E      CPC	R23,R30
    03D5 F409      BNE	0x03D7

⌨️ 快捷键说明

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