📄 matrixkey.lst
字号:
(0075)
(0076) /* bit operation */
(0077) //#ifndef BIT
(0078) //#define BIT(x) ( 1<<(x) )
(0079) //#endif
(0080)
(0081) /* USART configs for 4 Mhz crystal */
(0082) //#define BAUD9600 25
(0083) //#define BAUD19000 12
(0084) //#define UART_TRAN_ON() UCR |= 0x08
(0085) //#define UART_TRAN_OFF() UCR &= ~0x08
(0086) //#define UART_RCV_ON() UCR |= 0x10
(0087) //#define UART_RCV_OFF() UCR &= ~0x10
(0088)
(0089) /*--------------------------------------------------------------------
(0090) 函数全称:50us 延时
(0091) 函数功能:当然是 50us延时 啦
(0092) 注意事项:基于7.3728M晶振,稍微有点误差
(0093) 提示说明:调用Delay50us(20),得到1ms延时
(0094) 输 入:
(0095) 返 回:无
(0096) --------------------------------------------------------------------*/
(0097) void delay50us(sint16 t)
(0098) {
(0099) uint8 j;
(0100) for(;t>0;t--)
00B0 C007 RJMP 0x00B8
(0101) for(j=0;j<70;j++)
00B1 2744 CLR R20
00B2 C001 RJMP 0x00B4
00B3 9543 INC R20
00B4 3446 CPI R20,0x46
00B5 F3E8 BCS 0x00B3
00B6 5001 SUBI R16,1
00B7 4010 SBCI R17,0
00B8 2422 CLR R2
00B9 2433 CLR R3
00BA 1620 CP R2,R16
00BB 0631 CPC R3,R17
00BC F3A4 BLT 0x00B1
(0102) ;
(0103) }
00BD 940E01EB CALL pop_gset1
00BF 9508 RET
_delay50ms:
i --> R20
t --> R16
00C0 940E01E8 CALL push_gset1
(0104) /*--------------------------------------------------------------------
(0105) 函数全称:50ms 延时
(0106) 函数功能:当然是 50ms延时 啦
(0107) 注意事项:基于7.3728M晶振,稍微有点误差
(0108) 提示说明:调用delay50ms(20),得到1s延时
(0109) 输 入:
(0110) 返 回:无
(0111) --------------------------------------------------------------------*/
(0112) void delay50ms(sint16 t)
(0113) {
(0114) uint16 i;
(0115) for(;t>0;t--)
00C2 C00B RJMP 0x00CE
(0116) for(i=0;i<52642;i++)
00C3 2744 CLR R20
00C4 2755 CLR R21
00C5 C002 RJMP 0x00C8
00C6 5F4F SUBI R20,0xFF
00C7 4F5F SBCI R21,0xFF
00C8 3A42 CPI R20,0xA2
00C9 ECED LDI R30,0xCD
00CA 075E CPC R21,R30
00CB F3D0 BCS 0x00C6
00CC 5001 SUBI R16,1
00CD 4010 SBCI R17,0
00CE 2422 CLR R2
00CF 2433 CLR R3
00D0 1620 CP R2,R16
00D1 0631 CPC R3,R17
00D2 F384 BLT 0x00C3
(0117) ;
(0118) }
00D3 940E01EB CALL pop_gset1
00D5 9508 RET
FILE: E:\ProductPro\M16SD\ICCAVR\MatrixKeyBoard\MatrixKeyBoard\MatrixKey_.c
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 功能目的: 测试"MatrixKeyBoard"模块
(0005)
(0006) 目标系统: 基于任何AVR单片机
(0007)
(0008) 应用软件: ICCAVR
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2005-03-01
(0013)
(0014) 开发人员: SEE
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 接入模块: MatrixKeyBoard
(0027) 接口说明: MatrixKeyBoard M16SmartGuider
(0028) K0 --------- PD0
(0029) K1 --------- PD1
(0030) .
(0031) .
(0032) K7 --------- PD7
(0033) ----------------------------------------------------------------------
(0034) 注意事项:
(0035) *
(0036) ----------------------------------------------------------------------
(0037) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0038)
(0039) #include <iom16v.H>
(0040) #include "E:\ICC_H\CmmICC.H"
(0041)
(0042) #define LED_DDR DDRB
(0043) #define LED_PORT PORTB
(0044)
(0045) #define OUT_K0 sbi(DDRA,0)
(0046) #define OUT_K1 sbi(DDRA,1)
(0047) #define OUT_K2 sbi(DDRA,2)
(0048) #define OUT_K3 sbi(DDRA,3)
(0049) #define IN_K4 cbi(DDRA,4)
(0050) #define IN_K5 cbi(DDRA,5)
(0051) #define IN_K6 cbi(DDRA,6)
(0052) #define IN_K7 cbi(DDRA,7)
(0053)
(0054) #define SET_K0 sbi(PORTA,0)
(0055) #define SET_K1 sbi(PORTA,1)
(0056) #define SET_K2 sbi(PORTA,2)
(0057) #define SET_K3 sbi(PORTA,3)
(0058) #define CLR_K0 cbi(PORTA,0)
(0059) #define CLR_K1 cbi(PORTA,1)
(0060) #define CLR_K2 cbi(PORTA,2)
(0061) #define CLR_K3 cbi(PORTA,3)
(0062)
(0063) #define SET_K4 sbi(PORTA,4)
(0064) #define SET_K5 sbi(PORTA,5)
(0065) #define SET_K6 sbi(PORTA,6)
(0066) #define SET_K7 sbi(PORTA,7)
(0067)
(0068) #define GET_K4 gbi(PINA,4)
(0069) #define GET_K5 gbi(PINA,5)
(0070) #define GET_K6 gbi(PINA,6)
(0071) #define GET_K7 gbi(PINA,7)
(0072)
(0073) void KeyBoard_setSta(uint8 status)
(0074) {
(0075) //SET_K4;
(0076) //SET_K5;
(0077) //SET_K6;
(0078) //SET_K7;
(0079)
(0080) if( status&0x01 )
_KeyBoard_setSta:
status --> R16
00D6 FF00 SBRS R16,0
00D7 C002 RJMP 0x00DA
(0081) SET_K0;
00D8 9AD8 SBI 0x1B,0
00D9 C001 RJMP 0x00DB
(0082) else
(0083) CLR_K0;
00DA 98D8 CBI 0x1B,0
(0084)
(0085) if( status&0x02 )
00DB FF01 SBRS R16,1
00DC C002 RJMP 0x00DF
(0086) SET_K1;
00DD 9AD9 SBI 0x1B,1
00DE C001 RJMP 0x00E0
(0087) else
(0088) CLR_K1;
00DF 98D9 CBI 0x1B,1
(0089)
(0090) if( status&0x04 )
00E0 FF02 SBRS R16,2
00E1 C002 RJMP 0x00E4
(0091) SET_K2;
00E2 9ADA SBI 0x1B,2
00E3 C001 RJMP 0x00E5
(0092) else
(0093) CLR_K2;
00E4 98DA CBI 0x1B,2
(0094)
(0095) if( status&0x08 )
00E5 FF03 SBRS R16,3
00E6 C002 RJMP 0x00E9
(0096) SET_K3;
00E7 9ADB SBI 0x1B,3
00E8 C001 RJMP 0x00EA
(0097) else
(0098) CLR_K3;
00E9 98DB CBI 0x1B,3
(0099) }
00EA 9508 RET
(0100)
(0101) uint8 KeyBoard_getSta()
(0102) {
(0103) uint8 status = 0xF0;
_KeyBoard_getSta:
status --> R16
00EB EF00 LDI R16,0xF0
(0104)
(0105) if( !GET_K4 )
00EC 99CC SBIC 0x19,4
00ED C001 RJMP 0x00EF
(0106) status = 0xe0;
00EE EE00 LDI R16,0xE0
(0107)
(0108) if( !GET_K5 )
00EF 99CD SBIC 0x19,5
00F0 C001 RJMP 0x00F2
(0109) status = 0xd0;
00F1 ED00 LDI R16,0xD0
(0110)
(0111) if( !GET_K6 )
00F2 99CE SBIC 0x19,6
00F3 C001 RJMP 0x00F5
(0112) status = 0xb0;
00F4 EB00 LDI R16,0xB0
(0113)
(0114) if( !GET_K7 )
00F5 99CF SBIC 0x19,7
00F6 C001 RJMP 0x00F8
(0115) status = 0x70;
00F7 E700 LDI R16,0x70
(0116)
(0117) return status;
00F8 9508 RET
_GetKeyVal:
keyVal --> R12
i --> R20
getSta --> R10
j --> R22
00F9 940E0207 CALL push_gset4
(0118) }
(0119)
(0120) /*
(0121) #define KEY_DDR DDRA
(0122) #define KEY_PORT PORTA
(0123) #define KEY_PIN PINA
(0124) */
(0125) /*--------------------------------------------------------------------
(0126) 函数名称:
(0127) 函数功能:查询按键
(0128) 注意事项:
(0129) 提示说明:
(0130) 输 入:
(0131) 返 回:
(0132) --------------------------------------------------------------------*/
(0133) /*
(0134) K4-----K5-----K6-----K7
(0135) | | | |
(0136) 03H----02H----01H----00H -K0
(0137) 07H----06H----05H----04H -K1
(0138) 0BH----0AH----09H----08H -K2
(0139) 0FH----0EH----0DH----0CH -K3
(0140) */
(0141) const uint8 setSta_[4]={0xfe,0xfd,0xfb,0xf7};
(0142) const uint8 getSta_[4]={0x70,0xb0,0xd0,0xe0};
(0143) uint8 GetKeyVal()
(0144) {
(0145) uint8 i,j,getSta,keyVal;
(0146)
(0147) for(i=0;i<4;i++)
00FB 2744 CLR R20
00FC C024 RJMP 0x0121
(0148) {
(0149) //KEY_PORT = setSta_[i];
(0150) KeyBoard_setSta(setSta_[i]);
00FD E584 LDI R24,0x54
00FE E090 LDI R25,0
00FF 2FE4 MOV R30,R20
0100 27FF CLR R31
0101 0FE8 ADD R30,R24
0102 1FF9 ADC R31,R25
0103 9104 LPM R16,0(Z)
0104 DFD1 RCALL _KeyBoard_setSta
(0151) delay50us(1);
0105 E001 LDI R16,1
0106 E010 LDI R17,0
0107 DFA6 RCALL _delay50us
(0152) //if(KEY_PIN!=setSta_[i])
(0153) getSta = KeyBoard_getSta();
0108 DFE2 RCALL _KeyBoard_getSta
0109 2EA0 MOV R10,R16
(0154) //if( getSta!=setSta_[i] )
(0155) if( getSta!=0xF0 )
010A 3F00 CPI R16,0xF0
010B F0A1 BEQ 0x0120
(0156) {
(0157) //getSta = KEY_PIN&0xf0;
(0158) //getSta = KeyBoard_getSta();
(0159) for(j=0;j<4;j++)
010C 2766 CLR R22
010D C010 RJMP 0x011E
(0160) if(getSta==getSta_[j])
010E E588 LDI R24,0x58
010F E090 LDI R25,0
0110 2FE6 MOV R30,R22
0111 27FF CLR R31
0112 0FE8 ADD R30,R24
0113 1FF9 ADC R31,R25
0114 91E4 LPM R30,0(Z)
0115 16AE CP R10,R30
0116 F431 BNE 0x011D
(0161) {
(0162) keyVal=j+i*4;
0117 E084 LDI R24,4
0118 9F84 MUL R24,R20
0119 2EC6 MOV R12,R22
011A 0CC0 ADD R12,R0
(0163) return keyVal;
011B 2D0C MOV R16,R12
011C C007 RJMP 0x0124
011D 9563 INC R22
011E 3064 CPI R22,4
011F F370 BCS 0x010E
0120 9543 INC R20
0121 3044 CPI R20,4
0122 F2D0 BCS 0x00FD
(0164) }
(0165) }
(0166) }
(0167) return 0xFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -