7273|5

1170

帖子

0

TA的资源

至上芯片

楼主
 

老外的键盘扫描库程序 [复制链接]

/* ******************************************************************************* * PIC ADVANCED UNIVERSAL KEYPAD LIBRARY ******************************************************************************* * * source code for mikroC compiler * feel free to use this code at your own risks * * target : any PIC * * Author : Bruno Gavand, October 2007 * Release : 1.0 * see more details on http://www.micro-examples.com/ * ******************************************************************************* */ #i nclude "keypad_lib.h" char kp_buf[KP_MAX_LENGTH + 1] ; // input buffer unsigned char kp_mask = 0 ; // current scan mask unsigned char kp_old = 0xff ; // previous key unsigned char kp_idx = 0 ; // buffer index unsigned char kp_flags = 0 ; // status flags unsigned char kp_last = 0 ; // last input char unsigned int kp_tmr = 0 ; // timer const char kp_tbl[] = KP_SCAN_CODES ; // scan code to character lookup table #ifdef KEYPAD_MODE unsigned char kp_cnt = 0 ; // row counter unsigned char kp_row = 0 ; // current row mask unsigned char kp_first = 0 ; // first row mask #endif /* * private function : * set bit b to value v in register pointer to by reg */ void kp_bit(unsigned char *reg, unsigned char b, unsigned char v) { unsigned char m ; m = 1 << b ; if(v) { *reg |= m ; } else { *reg &= ~m ; } } /* * public function : * init keypad */ void kp_init() { unsigned int i ; #ifdef KEYPAD_MODE /* * prepare row direction register and port register */ for(i = 0 ; i < KP_ROW_NUMBER ; i++) { kp_bit(&KP_ROW_TRIS, i + KP_ROW_BITNUM, 1) ; kp_bit(&KP_ROW_PORT, i + KP_ROW_BITNUM, 1) ; } /* * prepare row masks */ kp_bit(&kp_first, KP_ROW_BITNUM, 1) ; kp_row = kp_first ; #endif
此帖出自单片机论坛

最新回复

呵呵,不错的,我复制了下来好好研究一下,谢谢楼主!  详情 回复 发表于 2008-2-10 11:18
点赞 关注(1)
 

回复
举报

1170

帖子

0

TA的资源

至上芯片

沙发
 

回复: 老外的键盘扫描库程序

/* * prepare column mask */ for(i = 0 ; i < KP_COL_NUMBER ; i++) { kp_bit(&KP_COL_TRIS, i + KP_COL_BITNUM, 1) ; kp_bit(&kp_mask, i + KP_COL_BITNUM, 1) ; } /* * clear input buffer */ *kp_buf = 0 ; } /* * public function : * interrupt routine, called on each timer0 overflow */ void kp_isr(void) { unsigned char kp_tmp, kp_key ; /* * read input port */ if(kp_tmp = (KP_COL_PORT & kp_mask)) { kp_flags |= KP_FLAG_HIT ; // there is a hit } else { kp_flags &= ~KP_FLAG_HIT ; // no hit } /* * debounce */ if(kp_tmr)
此帖出自单片机论坛
 
 

回复

1170

帖子

0

TA的资源

至上芯片

板凳
 

回复: 老外的键盘扫描库程序

{ if(kp_tmp && (kp_tmp < KP_TMR_DEBOUNCE)) { kp_tmr-- ; } else { kp_tmr = 0 ; } } /* * else if not waiting for buffer flush */ else if(!(kp_flags & KP_FLAG_ENTER)) { /* * if a key is pressed */ if(kp_tmp) { unsigned char ctr ; /* * calculate key index */ #ifdef KEYPAD_MODE kp_key = kp_cnt * KP_COL_NUMBER ; #else kp_key = 0 ; #endif kp_tmp >>= KP_COL_BITNUM ; for(ctr = 0 ; ctr <= KP_COL_NUMBER ; ctr++) { if(kp_tmp & 1) { kp_key += ctr ; } kp_tmp >>= 1 ; } /* * if key has changed */ if((kp_key != kp_old) || (kp_flags & KP_FLAG_TYPEMATIC)) { /* * get char from table */ kp_last = kp_tbl[kp_key] ; /* * erase char */ #ifdef KP_ERASE
此帖出自单片机论坛
 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

4
 

回复: 老外的键盘扫描库程序

if(kp_last == KP_ERASE) { kp_flags |= KP_FLAG_ERASE ; if(kp_idx) { kp_idx-- ; } } else #endif { kp_flags &= ~KP_FLAG_ERASE ; /* * enter char */ #ifdef KP_ENTER if(kp_last == KP_ENTER) { kp_flags |= KP_FLAG_ENTER ; } else #endif { /* * if buffer not full */ if(kp_idx < KP_MAX_LENGTH) { kp_buf[kp_idx] = kp_last ; kp_idx++ ; } else { /* * when buffer full, check for circular mode */ if(kp_flags & KP_FLAG_CIRCULAR) { /* * shift buffer */ for(kp_tmp = 0 ; kp_tmp < KP_MAX_LENGTH - 1 ; kp_tmp++) { kp_buf[kp_tmp] = kp_buf[kp_tmp + 1] ; } kp_buf[kp_tmp] = kp_last ; } } } } /* * string terminator */ kp_buf[kp_idx] = 0 ; kp_old = kp_key ; } /* * reload timer */ kp_tmr = KP_TMR_REPEAT ; } else { /* * no hit : ready for new entry */ kp_old = 255 ; kp_tmr = 0 ; } } /*
此帖出自单片机论坛
 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

5
 

回复: 老外的键盘扫描库程序

* check for buffer full to set/clear flag */ if(kp_idx < KP_MAX_LENGTH) { kp_flags &= ~KP_FLAG_FULL ; } else { kp_flags |= KP_FLAG_FULL ; }#ifdef KEYPAD_MODE /* * keypad row activation */ KP_ROW_TRIS |= kp_row ; // set current row to high Z kp_cnt++ ; /* * check for last row */ if(kp_cnt == KP_ROW_NUMBER) { /* * back to first */ kp_row = kp_first ; kp_cnt = 0 ; } else { kp_row <<= 1 ; } /* * activate new row */ KP_ROW_TRIS &= ~kp_row ; KP_ROW_PORT = kp_row ; #endif }
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复:老外的键盘扫描库程序

呵呵,不错的,我复制了下来好好研究一下,谢谢楼主!
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
电源解决方案和技术 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表