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

📄 3510i.lst

📁 3510 TFT彩屏的测试程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    16F7 E5CF      LDI	R28,0x5F
    16F8 E0D4      LDI	R29,4
    16F9 BFCD      OUT	0x3D,R28
    16FA BFDE      OUT	0x3E,R29
    16FB 51C0      SUBI	R28,0x10
    16FC 40D0      SBCI	R29,0
    16FD EA0A      LDI	R16,0xAA
    16FE 8308      STD	Y+0,R16
    16FF 2400      CLR	R0
    1700 EBE3      LDI	R30,0xB3
    1701 E0F0      LDI	R31,0
    1702 E010      LDI	R17,0
    1703 3BEF      CPI	R30,0xBF
    1704 07F1      CPC	R31,R17
    1705 F011      BEQ	0x1708
    1706 9201      ST	R0,Z+
    1707 CFFB      RJMP	0x1703
    1708 8300      STD	Z+0,R16
    1709 E9EA      LDI	R30,0x9A
    170A E2FD      LDI	R31,0x2D
    170B E6A0      LDI	R26,0x60
    170C E0B0      LDI	R27,0
    170D E21D      LDI	R17,0x2D
    170E 3EED      CPI	R30,0xED
    170F 07F1      CPC	R31,R17
    1710 F021      BEQ	0x1715
    1711 95C8      LPM
    1712 9631      ADIW	R30,1
    1713 920D      ST	R0,X+
    1714 CFF9      RJMP	0x170E
    1715 940E197C  CALL	_main
_exit:
    1717 CFFF      RJMP	_exit
_Get_Key_Value:
  keynum               --> Y+0
  keyvalue             --> R14
  i                    --> R12
    1718 940E1E8C  CALL	push_gset5x
    171A 9721      SBIW	R28,1
FILE: D:\StudyRoom\学习AVR\3510测试ICC版\keyscan.c
(0001) /*--------------------------------------------------------------------------------
(0002) **工程名称:3*4键盘扫描测试程序
(0003) **编译器:ICCAVR6.31A pro
(0004) **日期:2005.10.10
(0005) **作者:coole
(0006) 
(0007) **芯片类型:M16
(0008) **时钟频率:内部8M
(0009) 
(0010) ---------------------------------------------------------------------------------*/
(0011) #include "keyscan.h"
(0012) #include "3510i.h"
(0013) #include "buzzpr.h"
(0014) 
(0015) extern 	uchar fBuzzring;
(0016) extern	uchar BuzzringCnt;
(0017) extern	uchar BuzzringTime;
(0018) extern 	LCD_BGColor;
(0019) 
(0020) //**************************************************************
(0021) const		uchar	Convert[]={0,1,4,7,10,2,5,8,11,3,6,9,12};
(0022) uchar 	flag1;
(0023) #define 	fkeyreq   		0	//按键请求
(0024) #define 	fkeyeff   		1	//按键有效
(0025) #define 	fkeyhid   		2	//按键屏蔽
(0026) #define 	fkeysucc  		3	//连键判断
(0027) #define	finputeff		4	//按键输入有效
(0028) 
(0029) uchar 	MenuLevel;
(0030) uchar	MenuItemMax;
(0031) uchar 	MenuSelect[3];
(0032) 
(0033) uchar 	KeyNow,KeyOld,KeyCode,KeyCnt;
(0034) uchar Get_Key_Value(void)
(0035) {
(0036) 	uchar  i,keyvalue,keynum;
(0037) 	keynum=0xff;
    171B EF8F      LDI	R24,0xFF
    171C 8388      STD	Y+0,R24
(0038)     	DDRD  = 0xf0;//低四位为输入,高四位为输出
    171D EF80      LDI	R24,0xF0
    171E BB81      OUT	0x11,R24
(0039)     	for(i=0;i<3;i++)
    171F 24CC      CLR	R12
    1720 C048      RJMP	0x1769
(0040)     	{
(0041)     		PORTD = 0xff;
    1721 EF8F      LDI	R24,0xFF
    1722 BB82      OUT	0x12,R24
(0042)     		clr_bit(PORTD,4+i);//将第i列输出低电平
    1723 2D1C      MOV	R17,R12
    1724 5F1C      SUBI	R17,0xFC
    1725 E001      LDI	R16,1
    1726 940E1E99  CALL	lsl8
    1728 2E20      MOV	R2,R16
    1729 9420      COM	R2
    172A B232      IN	R3,0x12
    172B 2032      AND	R3,R2
    172C BA32      OUT	0x12,R3
(0043)     		delay_nus(20);
    172D E104      LDI	R16,0x14
    172E E010      LDI	R17,0
    172F D1F5      RCALL	_delay_nus
(0044)     		keyvalue=PIND&0x0f;
    1730 B380      IN	R24,0x10
    1731 708F      ANDI	R24,0xF
    1732 2EE8      MOV	R14,R24
(0045)     		if(keyvalue!=0x0f)
    1733 308F      CPI	R24,0xF
    1734 F199      BEQ	0x1768
(0046)     		{
(0047)     			switch(keyvalue)
    1735 2EA8      MOV	R10,R24
    1736 24BB      CLR	R11
    1737 01C5      MOVW	R24,R10
    1738 3087      CPI	R24,7
    1739 E0E0      LDI	R30,0
    173A 079E      CPC	R25,R30
    173B F129      BEQ	0x1761
    173C 308B      CPI	R24,0xB
    173D E0E0      LDI	R30,0
    173E 079E      CPC	R25,R30
    173F F0C9      BEQ	0x1759
    1740 308D      CPI	R24,0xD
    1741 E0E0      LDI	R30,0
    1742 079E      CPC	R25,R30
    1743 F069      BEQ	0x1751
    1744 308E      CPI	R24,0xE
    1745 E0E0      LDI	R30,0
    1746 079E      CPC	R25,R30
    1747 F009      BEQ	0x1749
    1748 C01F      RJMP	0x1768
(0048)     			{
(0049)     				case 	0x0e:keynum=13-(3-i)*4;break;
    1749 E013      LDI	R17,3
    174A 191C      SUB	R17,R12
    174B E004      LDI	R16,4
    174C 0201      MULS	R16,R17
    174D E08D      LDI	R24,0xD
    174E 1980      SUB	R24,R0
    174F 8388      STD	Y+0,R24
    1750 C017      RJMP	0x1768
(0050)     				case	0x0d:keynum=14-(3-i)*4;break;
    1751 E013      LDI	R17,3
    1752 191C      SUB	R17,R12
    1753 E004      LDI	R16,4
    1754 0201      MULS	R16,R17
    1755 E08E      LDI	R24,0xE
    1756 1980      SUB	R24,R0
    1757 8388      STD	Y+0,R24
    1758 C00F      RJMP	0x1768
(0051)     				case	0x0b:keynum=15-(3-i)*4;break;
    1759 E013      LDI	R17,3
    175A 191C      SUB	R17,R12
    175B E004      LDI	R16,4
    175C 0201      MULS	R16,R17
    175D E08F      LDI	R24,0xF
    175E 1980      SUB	R24,R0
    175F 8388      STD	Y+0,R24
    1760 C007      RJMP	0x1768
(0052)     				case	0x07:keynum=16-(3-i)*4;break;
    1761 E013      LDI	R17,3
    1762 191C      SUB	R17,R12
    1763 E004      LDI	R16,4
    1764 0201      MULS	R16,R17
    1765 E180      LDI	R24,0x10
    1766 1980      SUB	R24,R0
    1767 8388      STD	Y+0,R24
    1768 94C3      INC	R12
    1769 2D8C      MOV	R24,R12
    176A 3083      CPI	R24,3
    176B F408      BCC	0x176D
    176C CFB4      RJMP	0x1721
(0053)     				default:break;
(0054)     			}
(0055) 
(0056)     		}
(0057)     	}
(0058)     	DDRD  = 0xff;
    176D EF8F      LDI	R24,0xFF
    176E BB81      OUT	0x11,R24
(0059)     	PORTD = 0xff;
    176F BB82      OUT	0x12,R24
(0060)     	return  keynum;//return  0xff;
    1770 8108      LDD	R16,Y+0
    1771 9621      ADIW	R28,1
    1772 940E1E82  CALL	pop_gset5x
    1774 9508      RET
_Key_Scan:
  temp                 --> R10
    1775 940E1E85  CALL	push_gset3x
(0061) }
(0062) 
(0063) //**************************************//
(0064) //	函数名称:void Key_Scan()
(0065) //	输--入:无
(0066) //	输--出:无
(0067) //	功--能:按键扫描
(0068) //	影响标志:
(0069) //	创--建:
(0070) //	修--改:
(0071) //**************************************//
(0072) void Key_Scan(void)
(0073) {
(0074) 	uchar temp;
(0075) 	temp=Get_Key_Value();
    1777 DFA0      RCALL	_Get_Key_Value
    1778 2EA0      MOV	R10,R16
(0076) 	if(temp!=0xff)
    1779 3F0F      CPI	R16,0xFF
    177A F051      BEQ	0x1785
(0077) 	{
(0078) 		KeyNow=Convert[temp];
    177B E584      LDI	R24,0x54
    177C E090      LDI	R25,0
    177D 2DEA      MOV	R30,R10
    177E 27FF      CLR	R31
    177F 0FE8      ADD	R30,R24
    1780 1FF9      ADC	R31,R25
    1781 91E4      LPM	R30,0(Z)
    1782 93E000B6  STS	_KeyNow,R30
(0079) 		//LCD_WriteEnglishChar((KeyNow+48),10 , 50);
(0080) 	}
    1784 C007      RJMP	0x178C
(0081) 	else
(0082) 	{
(0083) 		KeyNow=0;
    1785 2422      CLR	R2
    1786 922000B6  STS	_KeyNow,R2
(0084) 		KeyCode=0;
    1788 922000B4  STS	_KeyCode,R2
(0085) 		KeyOld=0;
    178A 922000B5  STS	_KeyOld,R2
(0086) 	}
(0087) 	if(KeyNow)
    178C 902000B6  LDS	R2,_KeyNow
    178E 2022      TST	R2
    178F F0F9      BEQ	0x17AF
(0088) 	{
(0089) 		if(KeyNow!=KeyCode)
    1790 902000B4  LDS	R2,_KeyCode
    1792 903000B6  LDS	R3,_KeyNow
    1794 1432      CP	R3,R2
    1795 F039      BEQ	0x179D
(0090) 		{
(0091) 			KeyCode=KeyNow;
    1796 2C23      MOV	R2,R3
    1797 922000B4  STS	_KeyCode,R2
(0092) 			KeyCnt=0;
    1799 2422      CLR	R2
    179A 922000B3  STS	_KeyCnt,R2
(0093) 		}
    179C C012      RJMP	0x17AF
(0094) 		else
(0095) 		{	//起滤波作用,修改这里的数字可以调整按键的灵敏度
(0096) 			KeyCnt++;
    179D 918000B3  LDS	R24,_KeyCnt
    179F 5F8F      SUBI	R24,0xFF
    17A0 938000B3  STS	_KeyCnt,R24
(0097) 			if(KeyCnt>5)
    17A2 E085      LDI	R24,5
    17A3 902000B3  LDS	R2,_KeyCnt
    17A5 1582      CP	R24,R2
    17A6 F440      BCC	0x17AF
(0098) 			{
(0099) 				KeyCnt=0;
    17A7 2422      CLR	R2
    17A8 922000B3  STS	_KeyCnt,R2
(0100) 				set_bit(flag1,fkeyreq);
    17AA 918000BC  LDS	R24,_flag1
    17AC 6081      ORI	R24,1
    17AD 938000BC  STS	_flag1,R24
(0101) 			}
(0102) 		}
(0103) 	}
(0104) 	if(get_bit(flag1,fkeyreq))
    17AF 902000BC  LDS	R2,_flag1
    17B1 FE20      SBRS	R2,0
    17B2 C01B      RJMP	0x17CE
(0105) 	{
(0106) 		clr_bit(flag1,fkeyreq);
    17B3 2D82      MOV	R24,R2
    17B4 7F8E      ANDI	R24,0xFE
    17B5 938000BC  STS	_flag1,R24
(0107) 		if(KeyCode!=KeyOld)
    17B7 902000B5  LDS	R2,_KeyOld
    17B9 903000B4  LDS	R3,_KeyCode
    17BB 1432      CP	R3,R2
    17BC F061      BEQ	0x17C9
(0108) 		{
(0109) 			//无连键
(0110) 			if(!(get_bit(flag1,fkeyhid)))
    17BD FD82      SBRC	R24,2
    17BE C00F      RJMP	0x17CE
(0111) 			{
(0112) 				set_bit(flag1,fkeyhid); //有按键时,设置按键屏蔽,屏蔽掉其它按键
    17BF 6084      ORI	R24,4
    17C0 938000BC  STS	_flag1,R24
(0113) 				KeyOld=KeyCode;
    17C2 2C23      MOV	R2,R3
    17C3 922000B5  STS	_KeyOld,R2
(0114) 				set_bit(flag1,fkeyeff);
    17C5 6082      ORI	R24,2
    17C6 938000BC  STS	_flag1,R24
(0115) 			}
(0116) 			//keyccnt=40;
(0117) 		}
    17C8 C005      RJMP	0x17CE
(0118) 		else
(0119) 		{
(0120) 			//有连键现象
(0121) 			set_bit(flag1,fkeyhid);
    17C9 918000BC  LDS	R24,_flag1
    17CB 6084      ORI	R24,4
    17CC 938000BC  STS	_flag1,R24
(0122) 			/*if((KeyCode==3)||(KeyCode==4))		//这里的数字对应有连键现象的键值
(0123) 			{
(0124) 				keyccnt--;
(0125) 				if(keyccnt==0)
(0126) 				{
(0127) 					keyccnt=6;
(0128) 					set_bit(flag1,fkeyeff);
(0129) 					set_bit(flag1,fkeysucc);
(0130) 				}
(0131) 			}*/
(0132) 		}
(0133) 	}
(0134) 	if(!KeyNow) 	//没有任何按键时,清除按键屏蔽
    17CE 902000B6  LDS	R2,_KeyNow
    17D0 2022      TST	R2
    17D1 F429      BNE	0x17D7
(0135) 		clr_bit(flag1,fkeyhid);            	                     
    17D2 918000BC  LDS	R24,_flag1
    17D4 7F8B      ANDI	R24,0xFB
    17D5 938000BC  STS	_flag1,R24
    17D7 940E1E73  CALL	pop_gset3x
    17D9 9508      RET
_Key_Pr:
    17DA 940E1E85  CALL	push_gset3x
    17DC 9723      SBIW	R28,3
(0136) }
(0137) //**************************************//
(0138) //	函数名称:void Key_Pr()
(0139) //	输--入:KeyCode
(0140) //	输--出:data_buffer[0]
(0141) //	功--能:按键处理
(0142) //	影响标志:
(0143) //	创--建:
(0144) //	修--改:
(0145) //**************************************//
(0146) void Key_Pr(void)
(0147) {
(0148) 	if(get_bit(flag1,fkeyeff))
    17DD 902000BC  LDS	R2,_flag1
    17DF FE21      SBRS	R2,1
    17E0 C13E      RJMP	0x191F
(0149) 	{
(0150) 		fBuzzring|=(1<<fbuzzeff)|(1<<fbuzzring);
    17E1 918000B2  LDS	R24,0xB2
    17E3 6083      ORI	R24,3
    17E4 938000B2  STS	0xB2,R24
(0151) 		BuzzringCnt=2;
    17E6 E082      LDI	R24,2
    17E7 938000B1  STS	0xB1,R24
(0152) 		clr_bit(flag1,fkeyeff);
    17E9 2D82      MOV	R24,R2
    17EA 7F8D      ANDI	R24,0xFD
    17EB 938000BC  STS	_flag1,R24
(0153) 		set_bit(flag1,finputeff);
    17ED 6180      ORI	R24,0x10
    17EE 938000BC  STS	_flag1,R24
(0154) 		if(KeyOld==10)
    17F0 918000B5  LDS	R24,_KeyOld
    17F2 308A      CPI	R24,0xA
    17F3 F419      BNE	0x17F7
(0155) 			KeyOld=0;
    17F4 2422      CLR	R2
    17F5 922000B5  STS	_KeyOld,R2
(0156) 		//******************
(0157) 		//**各按键功能处理
(0158) 		//******************
(0159) 		switch(KeyOld)
    17F7 90A000B5  LDS	R10,_KeyOld
    17F9 24BB      CLR	R11
    17FA 20AA      TST	R10
    17FB F419      BNE	0x17FF
    17FC 20BB      TST	R11
    17FD F409      BNE	0x17FF
    17FE C120      RJMP	0x191F
    17FF 01C5      MOVW	R24,R10
    1800 3081      CPI	R24,1
    1801 E0E0      LDI	R30,0
    1802 079E      CPC	R25,R30
    1803 F409      BNE	0x1805
    1804 C033      RJMP	0x1838
    1805 3082      CPI	R24,2
    1806 E0E0      LDI	R30,0
    1807 079E      CPC	R25,R30
    1808 F409      BNE	0x180A
    1809 C059      RJMP	0x1863
    180A 3083      CPI	R24,3
    180B E0E0      LDI	R30,0
    180C 079E      CPC	R25,R30
    180D F409      BNE	0x180F
    180E C06A      RJMP	0x1879
    180F 3084      CPI	R24,4
    1810 E0E0      LDI	R30,0
    1811 079E      CPC	R25,R30
    1812 F409      BNE	0x1814
    1813 C088      RJMP	0x189C
    1814 3085      CPI	R24,5
    1815 E0E0      LDI	R30,0
    1816 079E      CPC	R25,R30
    1817 F409      BNE	0x1819
    1818 C099      RJMP	0x18B2
    1819 3086      CPI	R24,6
    181A E0E0      LDI	R30,0
    181B 079E      CPC	R25,R30
    181C F409      BNE	0x181E

⌨️ 快捷键说明

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