4*8矩阵键盘显示0-31,使用 一阴一阳数码管,当然有一个疑问本来两位数码管同时可以使用一个位选端口,和同一个P0口的但是发现会出现乱码,而且发现。共阴数码管亮的数据段位,刚好是共阳不亮的段位,怎么用三极管是两者的电压达到平衡呢。不得已把代码改了共阴管使用P0口,共阳管使用P3口,实现功能
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):
单片机源程序如下:
- #include "reg51.h"
- #define uchar unsigned char
- sbit disn2=P3^5;
- sbit disn1=P3^6;
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code dab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar temp,num,n1,n2;
- void display();
- keyscan();
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=100;y>0;y--);
- }
- keyscan() //矩阵键盘扫描程序
- {
- P1=0xfe;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0x7f : num=31;break;
- case 0xbf : num=30;break;
- case 0xdf : num=29;break;
- case 0xef : num=28;break;
- case 0xf7 : num=27;break;
- case 0xfb : num=26;break;
- case 0xfd : num=25;break;
- case 0xfe : num=24;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);
- P1=0xfd;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0x7f : num=23;break;
- case 0xbf : num=22;break;
- case 0xdf : num=21;break;
- case 0xef : num=20;break;
- case 0xf7 : num=19;break;
- case 0xfb : num=18;break;
- case 0xfd : num=17;break;
- case 0xfe : num=16;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);
- P1=0xfb;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0x7f : num=15;break;
- case 0xbf : num=14;break;
- case 0xdf : num=13;break;
- case 0xef : num=12;break;
- case 0xf7 : num=11;break;
- case 0xfb : num=10;break;
- case 0xfd : num=9;break;
- case 0xfe : num=8;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);
- P1=0xf7;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0x7f : num=7;break;
- case 0xbf : num=6;break;
- case 0xdf : num=5;break;
- case 0xef : num=4;break;
- case 0xf7 : num=3;break;
- case 0xfb : num=2;break;
- case 0xfd : num=1;break;
- case 0xfe : num=0;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);
- /*P0=0xde;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0xdf : num=12;break;
- case 0xef : num=11;break;
- case 0xf7 : num=10;break;
- case 0xfb : num=9;break;
- case 0xfd : num=8;break;
- case 0xfe : num=7;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);
- P0=0xbe;
- if(P2!=0xff)
- {
- delay(10);
- if(P2!=0xff)
- {
- temp=P2;
- switch(temp)
- {
- case 0xdf : num=6;break;
- case 0xef : num=5;break;
- case 0xf7 : num=4;break;
- case 0xfb : num=3;break;
- case 0xfd : num=2;break;
- case 0xfe : num=1;break;
- }
- while(temp!=0xff)
- {
- temp=P2;
- display();
- }
- }
- }
- delay(5);*/
- return num;
- }
- void display()
- {
- //if( disn1==1)
- {P0=tab[n1];
- //delay(10);
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1616.rar
(37.11 KB, 下载次数: 42)
|