矩阵键盘扫描程序实例

2017-11-14 10:09:40来源: eefocus 关键字:矩阵键盘  扫描程序

使用芯片STM8S003

所用端口:PD2~PD6, PA1~PA3

其中,PD3~PD6为输出,PA1~PA3 / PD2为输入(默认上拉)

/*
    PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
                  PD6  PD5  PD4  PD3  PD2  PA3  PA2  PA1
  */

程序如下:


  1. /*    添加包含芯片的头文件    */  

  2. #include  

  3.   

  4.   

  5.   

  6. volatile unsigned char CF[4];     //按键触发标志(表示4列,每一列同一行的  

  7.                                   //值是一样的但列标不一样来区分不同列的键)  

  8. volatile unsigned char Cont[4];  

  9. unsigned char KeyVal;     //键值  

  10. //unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f};    //4X4按输出端控制  

  11. //unsigned char KeyOut[4] = {0x7f,0xbf,0xdf,0xef};  

  12. unsigned char KeyOut[4] = {0x3f,0x5f,0x6f,0x77};      //两个端口组合4x4端口输出控制  

  13. unsigned char PortCom;    //两个端口组合的端口  

  14. unsigned char cIn0,cIn1,cIn2,cIn3;  

  15.   

  16.   

  17. /******************************************************************************* 

  18. **函数名称:void delay(unsigned int ms)     Name: void delay(unsigned int ms) 

  19. **功能描述:大概延时 

  20. **入口参数:unsigned int ms   输入大概延时数值 

  21. **输出:无 

  22. *******************************************************************************/  

  23. void delay(unsigned int ms)  

  24. {  

  25.   unsigned int x , y;  

  26.   for(x = ms; x > 0; x--)  

  27.     for(y = 1000 ; y > 0 ; y--);  

  28. }  

  29.   

  30. /* 

  31. **描述:新型4X4按键扫描程序 放在1ms-10ms中断内使用(十分稳定不需要再写消抖程序) 

  32. **备注:按键弹起时 keyVal = 0 单键按下 keyVal 有16个值,你自己程序可以针对不同值 

  33. **进行不同程序操作 keyVal单键值分别为  

  34. **0x01,0x02,0x04,0x08, 

  35. **0x11,0x12,0x14,0x18, 

  36. **0x21,0x22,0x24,0x28, 

  37. **0x31,0x32,0x34,0x38, 

  38. */   

  39. void Key_Head()   

  40. {  

  41.   unsigned char ReadData[4];  

  42.   static unsigned char i;  

  43.   /* 

  44.     PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 

  45.             PD6  PD5  PD4  PD3  PD2  PA3  PA2  PA1 

  46.   */  

  47.   cIn0 = 0;  

  48.   cIn1 = 0;  

  49.   cIn2 = 0;  

  50.   cIn3 = 0;  

  51.   if(++i>=4)i=0;  

  52.   

  53. //  PortCom = KeyOut[i]|0x0f;                     //忽略低4位  

  54.   //输出扫描  

  55.   PD_ODR = KeyOut[i];  

  56.   //输入侦测  

  57.   cIn0 = PA_IDR_bit.IDR1;  

  58.   cIn1 = PA_IDR_bit.IDR2;  

  59.   cIn2 = PA_IDR_bit.IDR3;  

  60.   cIn3 = PD_IDR_bit.IDR2;  

  61.   PortCom = (cIn3<<3) | (cIn2<<2) | (cIn1<<1) | cIn0;   

  62.     

  63.   ReadData[i] = (PortCom|0xf0)^0xff;            //忽略高4位 取反   

  64.   CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);   

  65.   Cont[i] = ReadData[i];   

  66.   //输出键值  

  67.   switch(CF[i])//第i列  

  68.   {  

  69.     case 0x08: KeyVal = ((i<<4)+8);break;  

  70.     case 0x04: KeyVal = ((i<<4)+4);break;  

  71.     case 0x02: KeyVal = ((i<<4)+2);break;  

  72.     case 0x01: KeyVal = ((i<<4)+1);break;  

  73.     default:KeyVal = 0;break;  

  74.   }   

  75.       

  76.   delay(30);  

  77. }  

  78.   

  79.   

  80. /******************************************************************************* 

  81. **函数名称:void ALL_LED_Init()    Name: void ALL_LED_Init() 

  82. **功能描述:初始化LED灯的IO口设为输出 

  83. **入口参数:无 

  84. **输出:无 

  85. *******************************************************************************/  

  86. void ALL_LED_Init()  

  87. {  

  88.   //LED1 Init  

  89. //  PD_DDR_bit.DDR2 = 1;    //设置端口PD->2的输入输出方向寄存器为输出方向  

  90. //  PD_CR1_bit.C12 = 1;     //设置PD2为推挽输出  

  91. //  PD_CR2_bit.C22 = 1;     //设置PD2的输出最大速度为10MHZ  

  92.     

  93.   //LED2 Init  

  94.   PC_DDR_bit.DDR7 = 1;    //设置端口PC->7的输入输出方向寄存器为输出方向  

  95.   PC_CR1_bit.C17 = 1;     //设置PC7为推挽输出  

  96.   PC_CR2_bit.C27 = 1;     //设置PC7的输出最大速度为10MHZ  

  97.     

  98.   //LED3 Init  

  99.   PC_DDR_bit.DDR6 = 1;    //设置端口PC->6的输入输出方向寄存器为输出方向  

  100.   PC_CR1_bit.C16 = 1;     //设置PC6为推挽输出  

  101.   PC_CR2_bit.C26 = 1;     //设置PC6的输出最大速度为10MHZ  

  102.     

  103.   //LED4 Init  

  104.   PC_DDR_bit.DDR3 = 1;    //设置端口PC->3的输入输出方向寄存器为输出方向  

  105.   PC_CR1_bit.C13 = 1;     //设置PC3为推挽输出  

  106.   PC_CR2_bit.C23 = 1;     //设置PC3的输出最大速度为10MHZ  

  107. }  

  108.   

  109.   

  110. /******************************************************************************* 

  111. **函数名称:ALLKeyInit() 

  112. **功能描述:配置Key1 , Key2 , Key3输入按键 

  113. **入口参数:无 

  114. **输出:无 

  115. *******************************************************************************/  

  116. void ALLKeyInit()  

  117. {  

  118.   //PA1_Init  

  119.   PA_DDR_bit.DDR1 = 0;      //GPA->PIN3 设置为输入模式  

  120.   PA_CR1_bit.C11 = 1;       //GPA->PIN3 带上拉电阻输入  

  121.   PA_CR2_bit.C21 = 0;       //GPA->PIN3  禁止外部中断  

  122.     

  123.   //PA2_Init  

  124.   PA_DDR_bit.DDR2 = 0;      //GPA->PIN3 设置为输入模式  

  125.   PA_CR1_bit.C12 = 1;       //GPA->PIN3 带上拉电阻输入  

  126.   PA_CR2_bit.C22 = 0;       //GPA->PIN3  禁止外部中断  

  127.     

  128.   //PA3_Init  

  129.   PA_DDR_bit.DDR3 = 0;      //GPA->PIN3 设置为输入模式  

  130.   PA_CR1_bit.C13 = 1;       //GPA->PIN3 带上拉电阻输入  

  131.   PA_CR2_bit.C23 = 0;       //GPA->PIN3  禁止外部中断  

  132.     

  133.   //PD2_Init  

  134.   PD_DDR_bit.DDR2 = 0;      //GPD->PIN3 设置为输入模式  

  135.   PD_CR1_bit.C12 = 1;       //GPD->PIN3 带上拉电阻输入  

  136.   PD_CR2_bit.C22 = 0;       //GPD->PIN3  禁止外部中断  

  137.     

  138.   //PD3_Init  

[1] [2] [3]

关键字:矩阵键盘  扫描程序

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2017111435937.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8学习经验
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利
推荐阅读
全部
矩阵键盘
扫描程序

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved