当前位置:首页 > 单片机 > 单片机
[导读] 这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。具体的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. **********************************

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

随着电脑科技的飞速发展,作为电脑输入设备的重要组成部分,键盘的种类和功能也在不断演变。其中,机械键盘以其出色的手感、长久的使用寿命和高度个性化的特点,深受众多电脑用户的喜爱。而机械键盘的核心——键盘轴,更是决定键盘使用体...

关键字: 电脑 键盘 机械

键盘包括编码键盘和非编码键盘两种。编码键盘带有能够自动识别按键的硬件电路,当按键被按下闭合时,硬件可以提供按键的编号(也被称“键值”),这种键盘使用方便,但是硬件复杂,价格相对较高。非编码键盘不附带按键识别电路,需要利用...

关键字: 键盘 人机交互 编码键盘 非编码键盘

自俄乌冲突爆发之后,以苹果、戴尔、三星等为代表的科技企业,纷纷暂停了自己在俄罗斯当地的相关业务。在被这些企业断供之后,俄罗斯当地遇到了“以键盘为代表的PC外设出现缺货”的困扰。

关键字: PC 键盘

英国里士满2022年7月11日 /美通社/ -- 2022年7月11日,高性能电子产品压力传感触控用户界面的领先创新者Peratech公司宣布,其全系列压力传感技术将应用于最新的联想Legion 7i和7(16...

关键字: 联想 键盘 TE IO

上海2022年6月9日 /美通社/ -- 近期,雪碧视觉形象更新换代,以更加简洁清爽的白绿配色酷爽再出发,旋即发起了一场具有里程碑意义的全球营销活动"Heat Happens"(燥不可挡 酷爽以对)。...

关键字: BSP APP 大屏 键盘

数码管里面相当于有8个段码管(或叫发光二极管)。 数码管分阳极管(CA),阴极管(CC)。阳极管是接高电平然后通过每个段选为来控制数码管亮灭(高电平灭,低电平亮)。阴极管则是接低电平,通过段选来控制亮灭(高电平亮,低电...

关键字: 数码管 使用

数码管引脚图

关键字: 数码管 编程

共阳极、共阴极数码管编码表(0~9、A~P……全亮)

关键字: 数码管 段码

【单片机自学】3.数码管静态及动态显示

关键字: 数码管 数字

LED数码管驱动芯片选型指南

关键字: 数码管 芯片
关闭
关闭