找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3342|回复: 0
打印 上一主题 下一主题
收起左侧

单片机动态显示与矩阵键盘实验 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
矩阵式键盘键值分别是0-9,最下面一排键位功能键,左右两个键分别为“清0键”“C,和”“回车键”“8 ”,其它键无效。未按键不显示,每按键一次,键值在最低位显示,原键值向高位移一位。按8个键后,再按键无效。按清0键全显示“0”。按“8 ”后全部熄灭,再按键重新开始。
设计思路:
1、 动态显示
(1)设置8个数据的一维显示数组disp[],设置位选码数组sled_bit[]对应每个数码管;设置2个一维数组,data uchar ar[8]={1,9,4,9,1,0,0,1}data uchar br[8]={2,0,1,4,1,2,1,0};按K1K2键进入外部中断0,在外部中断程序中根据按键将ar[]br[]数据送人disp[]
2T0500us中断1次,在T0中断中点亮一个数码管。在T0中断函数中,① P1.3=1U1U2输出高阻;② P1.4=1P0口输出段码,P1.4=0U1锁存输入的段码;③ P1.5=1P0口输出位选码,P1.5=0U2锁存输入的位选码;④ P1.3=0U1U2同时输出段码和位选码,进行显示。
2、 矩阵式键盘按键识别
1行、列输出后要延时,才读出相应特征值
2进行键值分析前要具备如下条件:
要有键按下,设a是得到的键值,if(a!=0xff)才继续进行;
要等键弹起,若输出P2=0x0f,则P2!=0x0f 要等待,while(P2!=0x0f)
每次进行完键值分析后,要延时。
3、 功能键位
设置功能键位时单独处理,对位选数组disp[]做相应的修改并修改显示标志位。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. sbit out=P1^3;
  5. sbit page=P1^4;
  6. sbit bite=P1^5;
  7. data uchar a,num,i,j=0,y,b;
  8. //char data *px;
  9. uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  10. data uchar disp[]={16,16,16,16,16,16,16,16};
  11. uchar table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  12. //uchar table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
  13. //uchar data b1[]={2,0,1,4,1,2,1,0};
  14. //uchar data b2[]={1,9,4,9,1,0,0,1};
  15. void delay(unsigned int i)
  16. {
  17.         unsigned char j;
  18.         for(;i>0;i--)
  19.         for(j=0;j<125;j++)
  20.         ;                                                                                                                                                                                                                                                                  
  21. }
  22. void main()
  23. {
  24.         TMOD=0x01;           //定时器T0的方式1
  25.         //TMOD=0x50;  定时器T1的方式1
  26.         TH0=65036/256;
  27.         TL0=65036%256;
  28.         ET0=1;
  29.         EA=1;
  30. //        TR0=1;
  31.         EX0=1;        //开关外部中断
  32.         IT0=1;        //外部中断0触发方式为跳变沿触发
  33.         PX0=1;        //设置外部中断0优先于1;
  34. //        out=1;
  35. //        P0=0xff;
  36.         while(1){
  37.         TR0=1;
  38.                 P2=0xf0;
  39.                 a=P2;
  40. //                a=~a;
  41.                 P2=0x0f;
  42.                 b=P2;
  43.                 a=a|b;
  44.                 if(a!=0xff)
  45.                 {
  46.                         while(P2!=0x0f);
  47.                         switch(a)
  48.                         {
  49.                                 case 0xee: num=0;break;
  50.                                 case 0xde: num=1;break;
  51.                                 case 0xbe: num=2;break;
  52.                                 case 0x7e: num=3;break;
  53.                                 case 0xed: num=4;break;
  54.                                 case 0xdd: num=5;break;
  55.                                 case 0xbd: num=6;break;
  56.                                 case 0x7d: num=7;break;
  57.                                 case 0xeb: num=8;break;
  58.                                 case 0xdb: num=9;break;
  59.                                 case 0xe7: num=12;break;
  60.                                 case 0x77: num=15;break;
  61.                         }
  62.                         if(num<10&&disp[0]==16){
  63.                         for(i=0;i<7;i++)
  64.                         disp[i]=disp[i+1];
  65.                         disp[7]=num;
  66.                         }
  67.                         else if(num==12)
  68.                         {
  69.                                 for(i=7;i>0;i--)
  70.                                 disp[i]=disp[i-1];
  71.                                 disp[0]=16;
  72.                         }else if(num==15)
  73.                         {
  74.                                 for(i=0;i<8;i++)
  75.                                 disp[i]=16;
  76.                         }else if(disp[0]!=16){
  77.                         for(i=0;i<7;i++)
  78.                                 disp[i]=16;
  79.                         disp[7]=num;
  80.                        
  81.                         }
  82.                 }
  83.                 delay(50);
  84.         }
  85. }
  86. void EXO_int() interrupt 0
  87. {
  88.                
  89. }
  90. void T0_int() interrupt 1
  91. {
  92.         uchar k;
  93.         TH0=65036/256;
  94.         TL0=65036%256;
  95.         out=1;
  96.         k=disp[j];
  97.         P0=table2[k];//显示的值
  98.         page=1;
  99.         page=0;
  100.         P0=table1[j]; //显示的位
  101.         bite=1;
  102.         bite=0;
  103.         out=0;
  104.         j++;
  105.         if(j>7) j=0;       
  106. }
复制代码

所有资料51hei提供下载:
动态显示与矩阵键盘.zip (22.8 KB, 下载次数: 35)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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