📄 3510i.lst
字号:
__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 + -