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

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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭