硬 件PIC16F883 芯 片 , 10 个 按 键 , 4 位 数 码 管 。 【芯 片 引脚】 【数 码 管 连接】PORTC 连接数 码 管 的 8 段 LED, PORTA<3:0>连接数 码 管 的 4 个 共阴极(控制选通位 )。 【按 键 连接】 按 键 扫 描 程 序 在 上 一 篇 博 文 里 面 有 说 明 , 现 在 还 是 使 用 上 面 的 扫 面 方 式 ( 代 码 都 是 一 样 的 ) 。用 记 录 按 键 按 下 和 弹 起 的 时 间 判 断 是 不 是 长 按 和 双 击 。 TMR1 设 置 , 1:4 分 频 、1:8 预分 频 ,计数周期为 8uS。 TMR1 溢出一 次时 间 为 0.524288 S keypress 记 录TMR1 溢出的 次数。keypress 大于等于 2 就跳出检测, 认为他是 长 按 ( 时 间 为 1.048576S) 。 keypress<1 且keyrelease <1 , 再次按 下 的keypress<1 就认为是 双 击 。 如下 图: KP 按 键 按 下 , KR 按 键 弹 起 。 【实现代码】 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __CONFIG _CONFIG2, _WRT_OFF & _BOR21V udata_shr counter res 1 ;计数个位 counter0 res 1 ;计数十位 counter1 res 1 ;扫描按键变量 counter2 res 1 ;延时程序微调参数 key_state res 1 ;按键状态 keynum res 1 ;按键标号 swap res 1 ;确认按键转换值 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 keypress res 1 keypressbak res 1 keyrelease res 1 LED1 res 1 LED2 res 1 LED3 res 1 LED4 res 1 UDATA counter3 res 1 counter4 res 1 sign res 1 reset code 0x0000 pagesel start goto start ;int_vector code 0x0004 code start banksel ANSEL ;设置PORTA 为数字模式 clrf ANSEL banksel ANSELH ;设置PORTB 为数字模式 72 73 74 75 76 77 78 79 ...