查看: 1300|回复: 7
打印 上一主题 下一主题

基于ATmega16 4*4矩阵键盘 单数码管显示 0~F

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-4 16:21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lxe 于 2014-8-4 16:35 编辑

。。码字比较累。。直接上程序。。
  1. #include <iom161v.h>
  2. #include <macros.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x3F};
  6. /*            0     1    2    3    4    5    6    7    8   9    A     B   C     D    E   F    0      */
  7. uchar key = 0;
  8. /*******************************************************
  9. //函数名称:uchar get_key(void)
  10. //函数功能:获取按键值
  11. //输入参数:无
  12. //返回参数:按键值key
  13. ********************************************************/
  14. uchar get_key(void)
  15. {
  16.                                         //PA                7 6 5 4   3 2 1 0
  17.         PORTA = 0xFE;                   //PA0拉低            1 1 1 1   1 1 1 0
  18.         if(PINA==0xFE) {key = 0;}       //没有按键按下        1 1 1 1   1 1 1 0
  19.         if(PINA!=0xFE)                  //有按键按下
  20.         {
  21.             if(PINA==0xEE) {key = 16;}  //K16按下PA4被拉低    1 1 1 0   1 1 1 0
  22.             if(PINA==0xDE) {key = 12;}  //K12按下PA5被拉低    1 1 0 1   1 1 1 0
  23.             if(PINA==0xBE) {key = 8;}   //K8按下PA6被拉低     1 0 1 1   1 1 1 0
  24.             if(PINA==0x7E) {key = 4;}   //K4按下PA7被拉低     0 1 1 1   1 1 1 0
  25.         }
  26.                                         //PA                7 6 5 4   3 2 1 0
  27.         PORTA = 0xFD;                   //PA1拉低            1 1 1 1   1 1 0 1
  28.         if(PINA==0xFD) {key = 0;}       //没有按键按下        1 1 1 1   1 1 0 1
  29.         if(PINA!=0xFD)                  //有按键按下
  30.         {
  31.             if(PINA==0xED) {key = 15;}  //K15按下PA4被拉低    1 1 1 0   1 1 0 1
  32.             if(PINA==0xDD) {key = 11;}  //K11按下 PA5被拉低   1 1 0 1   1 1 0 1
  33.             if(PINA==0xBD) {key = 7;}   //K7按下PA6被拉低     1 0 1 1   1 1 0 1
  34.             if(PINA==0x7D) {key = 3;}   //K3按下PA7被拉低     0 1 1 1   1 1 0 1
  35.         }
  36.                                         //PA                7 6 5 4   3 2 1 0
  37.         PORTA = 0xFB;                   //PA2拉低            1 1 1 1   1 0 1 1
  38.         if(PINA==0xFB) {key = 0;}       //没有按键按下        1 1 1 1   1 0 1 1
  39.         if(PINA!=0xFB)                  //有按键按下
  40.         {
  41.             if(PINA==0xEB) {key = 14;}  //K14按下PA4被拉低    1 1 1 0   1 0 1 1
  42.             if(PINA==0xDB) {key = 10;}  //K10按下PA5被拉低    1 1 0 1   1 0 1 1
  43.             if(PINA==0xBB) {key = 6;}   //K6按下PA6被拉低     1 0 1 1   1 0 1 1
  44.             if(PINA==0x7B) {key = 2;}   //K2按下PA7被拉低     0 1 1 1   1 0 1 1
  45.         }
  46.                                         //PA                7 6 5 4   3 2 1 0
  47.         PORTA = 0xF7;                   //PA3拉低            1 1 1 1   0 1 1 1
  48.         if(PINA==0xF7) {key = 0;}       //没有按键按下        1 1 1 1   0 1 1 1
  49.         if(PINA!=0xF7)                  //有按键按下
  50.         {
  51.             if(PINA==0xE7) {key = 13;}  //K13按下PA4被拉低    1 1 1 0   0 1 1 1
  52.             if(PINA==0xD7) {key = 9;}   //K9按下PA5被拉低     1 1 0 1   0 1 1 1
  53.             if(PINA==0xB7) {key = 5;}   //K5按下PA6被拉低     1 0 1 1   0 1 1 1
  54.             if(PINA==0x77) {key = 1;}   //K1按下PA7被拉低     0 1 1 1   0 1 1 1
  55.         }


  56.         return key;
  57. }
  58. /*******************************************************
  59. //函数名称:int main(void)
  60. //函数功能:主函数
  61. //输入参数:无
  62. //返回参数:0
  63. ********************************************************/
  64. int main(void)
  65. {
  66.     DDRA |= 0x0F;
  67.     PORTA |= 0xFF;
  68.     DDRB |= 0xFF;
  69.     PORTB |= 0xFF;
  70.     while(1)
  71.     {
  72.         PORTB = seg[get_key()];
  73.     }
  74.     return 0;
  75. }
复制代码

回复

使用道具 举报

板凳
发表于 2014-8-4 16:24:53 | 只看该作者
定义数组seg[]的注释行堪称优秀!
回复 支持 反对

使用道具 举报

地板
发表于 2014-8-4 16:25:07 | 只看该作者
定义数组seg[]的注释行堪称优秀!
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-8-4 16:33:05 | 只看该作者
测试板上列已接上拉所以用来作检测输出端对应单片机PA口的高四位。。而行则用于输入对应PA口的低四位。。。即PA0~PA3接R0~R3 L0~L3    PA4~PA7 接 L0~L3
先将R0拉低为0。再读取PINA寄存器值判断按下哪个按键
再将R1拉低为0。再读取PINA寄存器值判断按下哪个按键
再将R2拉低为0。再读取PINA寄存器值判断按下哪个按键
再将R3拉低为0。再读取PINA寄存器值判断按下哪个按键
循环判断。。。收工。
回复 支持 反对

使用道具 举报

5#
发表于 2014-8-4 16:35:08 | 只看该作者
我还是喜欢李老师的数码管的字形表的定义,给出了二进制,让人一看就知道原理
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2014-8-4 16:38:43 | 只看该作者
lucky80204 发表于 2014-8-4 16:35
我还是喜欢李老师的数码管的字形表的定义,给出了二进制,让人一看就知道原理 ...

。。。我可以说那是闲得蛋疼的时候才干的活吗?
回复 支持 反对

使用道具 举报

7#
发表于 2014-8-4 16:40:44 | 只看该作者
lxe 发表于 2014-8-4 16:38
。。。我可以说那是闲得蛋疼的时候才干的活吗?

不可以哦,这样的话,小学生就懂啦啊。。。你要为小孩子考虑
回复 支持 反对

使用道具 举报

8#
发表于 2014-8-5 09:59:13 | 只看该作者
这么规整,赞一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表