当前位置:首页 > 单片机 > 单片机
[导读] 这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。具体的4*4键盘扫描原理较为基础这里不再赘述,这里我认为比较重要的是要养成一个良好的写程序的习惯,想4*4键盘扫

这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。具体的4*4键盘扫描原理较为基础这里不再赘述,这里我认为比较重要的是要养成一个良好的写程序的习惯,想4*4键盘扫描这样的函数可以写成一个固定的C或者H文件,便于以后调用。先看看主程序:


  1. /***********************************************

  2. 程序功能:扫描4X4键盘并将键值在数码管上显示

  3. ------------------------------------------------

  4. 测试说明:按动K1~K16按键,观察数码管显示

  5. ************************************************/

  6. #include

  7. #include"Keypad.C"

  8. //数码管7位段码:0--f

  9. unsignedcharscandata[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

  10. 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

  11. //记录显示位数的全局变量

  12. unsignedcharcnt=0;

  13. //显示缓存

  14. unsignedcharDispbuf[2];

  15. //引用外部变量的声明

  16. externunsignedcharkey_Pressed;

  17. externunsignedcharkey_val;

  18. externunsignedcharkey_Flag;

  19. /********************主函数********************/

  20. voidmain(void)

  21. {

  22. /*下面六行程序关闭所有的IO口*/

  23. P1DIR=0XFF;P1OUT=0XFF;

  24. P2DIR=0XFF;P2OUT=0XFF;

  25. P3DIR=0XFF;P3OUT=0XFF;

  26. P4DIR=0XFF;P4OUT=0XFF;

  27. P5DIR=0XFF;P5OUT=0XFF;

  28. P6DIR=0XFF;P6OUT=0XFF;

  29. P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换

  30. WDTCTL=WDT_ADLY_1_9;//设置内部看门狗工作在定时器模式,1.9ms中断一次

  31. IE1|=WDTIE;//使能看门狗中断

  32. _EINT();//打开全局中断

  33. Init_Keypad();

  34. while(1)

  35. {

  36. Key_Event();

  37. if(key_Flag==1)

  38. {

  39. key_Flag=0;

  40. Dispbuf[1]=key_val/10;

  41. Dispbuf[0]=key_val%10;

  42. }

  43. }

  44. }

  45. /*******************************************

  46. 函数名称:watchdog_timer

  47. 功能:看门狗中断服务函数,在这里输出数码管的

  48. 段选和位选信号

  49. 参数:无

  50. 返回值:无

  51. ********************************************/

  52. #pragmavector=WDT_VECTOR

  53. __interruptvoidwatchdog_timer(void)

  54. {

  55. P4OUT=0xff;

  56. P5OUT=scandata[Dispbuf[cnt]];//输出段选信号

  57. P4OUT&=~(1<<(cnt+2));//输出位选信号

  58. cnt++;//位计数变量在0~1之间循环

  59. if(cnt==2)cnt=0;

  60. }


主程序较为简单,具体的原理参见上一个笔记,在主程序中与键盘扫描相关的函数被击中在Keypad.C中,需要说明的是在主函数中需要对Keypad.C的部分变量做声明,这样才能使用Keypad.C中的变量。Keypad.C代码如下:




  1. /********************************************************

  2. 4*4键盘扫描函数

  3. 作者:孙浩

  4. 修改时间:2010.8.2

  5. 程序说明:

  6. 此程序以开发板的例程做部分修改,更方便程序调用。

  7. 在调用之前需要注意需要在主函数中对程序中使用的变量做外部变量声明

  8. 需要在主函数中声明的变量如下:

  9. //引用外部变量的声明

  10. externunsignedcharkey_Pressed;//按键是否被按下:1--是,0--否

  11. externunsignedcharkey_val;//存放键值

  12. externunsignedcharkey_Flag;//按键是否已放开:1--是,0--否

  13. 另外对应的键值可以在本文件的全局变量中修改,只需要对应修改

  14. 数组ucharkey_Map[]的对应的值即可。

  15. 调用示例如下:

  16. Init_Keypad();//先进行初始化

  17. while(1)

  18. {

  19. Key_Event();//在死循环中进行键值扫描

  20. if(key_Flag==1)//用来判断有无按键按下,从而读取键值进行操作

  21. {

  22. key_Flag=0;//key_Flag需要手动清零

  23. }

  24. }

  25. **********************************************************/

  26. #include

  27. //相应的函数声明

  28. voidInit_Keypad(void);//键盘初始化

  29. voidCheck_Key(void);

  30. voiddelay();

  31. voidKey_Event(void);//读取键盘函数,在使用时通过此函数进行键盘扫描

  32. //选择对应的端口

  33. #defineKEYOUTP1OUT

  34. #defineKEYINP1IN

  35. #defineKEYDIRP1DIR

  36. typedefunsignedcharuchar;

  37. typedefunsignedintuint;

  38. /***************全局变量***************/

  39. ucharkey_Pressed;//按键是否被按下:1--是,0--否

  40. ucharkey_val;//存放键值

  41. ucharkey_Flag;//按键是否已放开:1--是,0--否

  42. //设置键盘逻辑键值与程序计算键值的映射

  43. ucharkey_Map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

  44. /*******************************************

  45. 函数名称:Init_Keypad

  46. 功能:初始化扫描键盘的IO端口

  47. 参数:无

  48. 返回值:无

  49. ********************************************/

  50. voidInit_Keypad(void)

  51. {

  52. KEYDIR=0xf0;//KEY.0~KEY.3设置为输入状态,KEY.4~KEY.7设置为输出状态

  53. KEYOUT|=0xf0;//KEY.4~KEY.7输出高电平

  54. key_Flag=0;

  55. key_Pressed=0;

  56. key_val=0;

  57. }

  58. /*********************************************

  59. *Check_Key(),检查按键,确认键值

  60. *********************************************/

  61. /*******************************************

  62. 函数名称:Check_Key

  63. 功能:扫描键盘的IO端口,获得键值

  64. 参数:无

  65. 返回值:无

  66. **********************************

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭