首页 > 其他 > 详细

单片机 & 4×4矩阵键盘 & 4位串行595数码管显示

时间:2015-10-16 23:11:54      阅读:801      评论:0      收藏:0      [点我收藏+]

现在贴出我自己写的4×4矩阵键盘代码和注释

  1 **
  2 
  3 * 通过理解行列矩阵键盘,和串行数码管的原理,
  4 
  5 *写出来本代码。下面附键盘的
  6 
  7 * @author windmill
  8 
  9 */?
 10 #include ? <reg52.h>
 11 #define uchar unsigned char
 12 #define uint unsigned int
 13 //Led数码管数
 14 sbit DIO = P2^0;//串行数据输入
 15 sbit LRCLK = P2^1;//时钟脉冲信号——上升沿有效
 16 sbit LSCLK = P2^2;//打入信号————上升沿有效
 17 unsigned char code LED_0F[] =
 18 {// 0 1 2 34 5 6 78 9 A bC d E F -
 19 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
 20 };
 21 uchar scan_keyboard(void); // 扫描键盘
 22 void delay_ms(int n); //毫秒级延时函数
 23 void get_LED(uchar key); //获得LED对应的数组值
 24 void LED_ON(uchar x); //点亮led数码管
 25 void main()
 26 {
 27 while(1){
 28 uchar key = scan_keyboard();
 29 get_LED(key);
 30 }
 31 }
 32 void delay_ms(int n)
 33 {
 34 int i = 0, j = 0;
 35 for(i = 0; i < n; i++)
 36 for(j = 0; j < 100; j++);
 37 }
 38 void LED_ON(uchar lcode)
 39 {
 40 uint i;
 41 for(i = 8;i >= 1; i--)
 42 {
 43 if (lcode & 0x80)
 44 DIO = 1;
 45 else
 46 DIO = 0;
 47 lcode <<= 1;
 48 LSCLK = 0;
 49 LSCLK = 1;
 50 }
 51 }
 52 void LED_code(uchar value)
 53 {
 54 uchar code *led_table; // 查表指针
 55 uchar lcode; //要得到的显示码
 56 //显示第1位
 57 led_table = LED_0F + value;
 58 lcode = *led_table;
 59 LED_ON(lcode);
 60 LED_ON(0x01);
 61 LRCLK = 0;
 62 LRCLK = 1;
 63 //显示第2位
 64 }
 65 void get_LED(uchar key)
 66 {
 67 if(key == 0x00)
 68 return; //如果为0x00,说明没有扫描到值,返回
 69 switch(key)
 70 {
 71 case 0xee: LED_code(0);break;//0按下相应的键显示相对应的码值
 72 case 0xde: LED_code(1);break;//1 按下相应的键显示相对应的码值
 73 case 0xbe: LED_code(2);break;//2
 74 case 0x7e: LED_code(3);break;//3
 75 case 0xed: LED_code(4);break;//4
 76 case 0xdd: LED_code(5);break;//5
 77 case 0xbd: LED_code(6);break;//6
 78 case 0x7d: LED_code(7);break;//7
 79 case 0xeb: LED_code(8);break;//8
 80 case 0xdb: LED_code(9);break;//9
 81 case 0xbb: LED_code(10);break;//a
 82 case 0x7b: LED_code(11);break;//b
 83 case 0xe7: LED_code(12);break;//c
 84 case 0xd7: LED_code(13);break;//d
 85 case 0xb7: LED_code(14);break;//e
 86 case 0x77: LED_code(15);break;//f
 87 }
 88 }
 89 uchar scan_keyboard()
 90 {
 91 uchar row_wire, col_wire; //定义行线和列线,行线0-3,列线4-7
 92 P1 = 0xf0; //行线输出全为0,列线输出全为1
 93 col_wire = P1 & 0xf0; //读入列线值
 94 if(col_wire != 0xf0)
 95 {
 96 delay_ms(1); //去抖延时
 97 if(col_wire != 0xf0)
 98 {
 99 col_wire = P1 & 0xf0; //读入列线值
100 P1 = col_wire | 0x0f; //输出当前列线值
101 row_wire = P1 & 0x0f; //读入行线值
102 return(col_wire + row_wire);//键盘最后组合码值
103 }
104 }
105 return 0x00;
106 }

下面是该矩阵键盘的proteus原理图

技术分享

单片机 & 4×4矩阵键盘 & 4位串行595数码管显示

原文:http://www.cnblogs.com/runhang/p/4886521.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!