找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3866|回复: 1
收起左侧

单片机矩阵键盘控制LED数码管的proteus仿真和源码

[复制链接]
ID:354488 发表于 2018-6-19 17:09 | 显示全部楼层 |阅读模式
键盘行列扫描所按按键,显示到显示屏上,循环左移位
UG3SJXD5J$NR]M8`QV6PPLP.png }PL[OKF(E}T7T7I$(MO$$`P.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define keyport P2
  4. unsigned char code ledmap[] = {        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5.                                                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  6. unsigned char led[] = {0,0,0,0,0,0};
  7. unsigned char select = 0xfe;
  8. unsigned char index = 0;
  9. unsigned char keyvalue = 0;
  10. bit flag = 0;
  11. void delay1ms(unsigned char c)  
  12. {
  13.     unsigned char a,b;
  14.     for(c;c>0;c--)
  15.         for(b=142;b>0;b--)
  16.             for(a=2;a>0;a--);
  17. }

  18. void keyscan(){
  19.         keyport = 0xf0;
  20.         if(keyport != 0xf0){
  21. //                delay1ms(10);
  22.                 if(keyport != 0xf0){
  23.                         switch(keyport){//扫描列判断列
  24.                                 case(0xe0):keyvalue = 0;break;//1110 0000
  25.                                 case(0xd0):keyvalue = 1;break;//1101 0000
  26.                                 case(0xb0):keyvalue = 2;break;//1011 0000
  27.                                 case(0x70):keyvalue = 3;break;//0111 0000
  28.                         }
  29.                         keyport = 0x0f;
  30.                         switch(keyport){//扫描行判断行
  31.                                 case(0x0e):keyvalue = keyvalue + 0 ; flag = 1 ; break;//0000 1110
  32.                                 case(0x0d):keyvalue = keyvalue + 4 ; flag = 1 ; break;//0000 1101
  33.                                 case(0x0b):keyvalue = keyvalue + 8 ; flag = 1 ; break;//0000 1011
  34.                                 case(0x07):keyvalue = keyvalue + 12; flag = 1 ; break;//0000 0111
  35.                         }
  36.                         while((keyport&0x0f) != 0x0f){
  37.                
  38.                         }
  39.                 }
  40.         }       

  41. }
  42. void ledbuffer(){// 循环左移
  43.         if(flag){
  44.                 unsigned char i = 0;
  45.                 unsigned char index;
  46.                 for(index = 5 ; index > 0 ; index--){
  47.                         led[index] = led[index-1];
  48.                 }
  49.                 led[index] = keyvalue;
  50.                 flag = 0;

  51.         }
  52. }

  53. void ledfresh()interrupt 1{// 刷新动态数码管
  54.         P0 = 0xff;//初始为0
  55.         P1 = ledmap[led[index]];
  56.         P0 = select;
  57.         select = _crol_(select,1);//左移
  58.         index++;
  59.         if(index == 6){
  60.                 index = 0;
  61.                 select = 0xfe;
  62.         }
  63.         TH0  = (65536-4000)>>8;
  64.         TL0  = (65536-4000)&0xff;
  65. }
  66. void main(){
  67.         SP = 0x50;
  68.         TMOD = 0x21;//定时器1,方式0,定时器2,方式1
  69.         TH0  = (65536-4000)>>8;//延时4ms
  70.         TL0  = (65536-4000)&0xff;
  71.         ET0  = 1;
  72.         TR0  = 1;
  73.         EA   = 1;
  74.         SCON = 0x40;
  75.         TH1  = 0xfd;
  76. ……………………

  77. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
矩阵键盘.zip (139.92 KB, 下载次数: 45)

评分

参与人数 2黑币 +55 收起 理由
zhag + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:411657 发表于 2018-10-18 16:52 | 显示全部楼层
厉害厉害 给力
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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