标题:
51单片机矩阵键盘数码管显示按键值Proteus仿真程序
[打印本页]
作者:
逆风的尘沙
时间:
2020-5-17 17:41
标题:
51单片机矩阵键盘数码管显示按键值Proteus仿真程序
A19VXZ{CWH4_VMIXP$U8AZJ.png
(36.39 KB, 下载次数: 62)
下载附件
仿真
2020-5-17 17:41 上传
单片机源程序如下:
#include "reg51.h"
#include "intrins.h"
#define SEG7 P0
#define Key P3
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void Delayms(unsigned int z);
void Count(void);
void DigtDisplay(void);
void scan_key_f(void);
void Scan_key_b(void);
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char Num;
unsigned char Digt[8];
void main()
{
while(1)
{
scan_key_f();
Count();
DigtDisplay();
}
}
/*计算各位数码管显示段码*/
void Count()
{
Digt[0]=DIG_CODE[Num/10000000];
Digt[1]=DIG_CODE[Num%10000000/1000000];
Digt[2]=DIG_CODE[Num%1000000/100000];
Digt[3]=DIG_CODE[Num%100000/10000];
Digt[4]=DIG_CODE[Num%10000/1000];
Digt[5]=DIG_CODE[Num%1000/100];
Digt[6]=DIG_CODE[Num%100/10];
Digt[7]=DIG_CODE[Num%10];
if(Num<10) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=Digt[6]=0x00; //消隐
if(Num<100) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=Digt[5]=0x00;
if(Num<1000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=Digt[4]=0x00;
if(Num<10000) Digt[0]=Digt[1]=Digt[2]=Digt[3]=0x00;
if(Num<100000) Digt[0]=Digt[1]=Digt[2]=0x00;
if(Num<1000000) Digt[0]=Digt[1]=0x00;
if(Num<10000000) Digt[0]=0x00;
}
void DigtDisplay()
{
unsigned char i;
for(i=0;i<8;i++)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
case(4):
LSA=0;LSB=0;LSC=1; break;
case(5):
LSA=1;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
SEG7=Digt[i];
Delayms(2);
SEG7=0x00; //清显示,消除重影
}
}
////反转法 先列再行
//void scan_key_f()
//{
// Key=0X0F; //0000 1111
// if(Key!=0X0F)
// {
// Delayms(10);
// if(Key!=0X0F)
// {
// Key=0XF0; //判断列
// switch(Key)
// {
// case 0xE0: Num=1;break;
// case 0xD0: Num=2;break;
// case 0xB0: Num=3;break;
// case 0x70: Num=4;break; //0111
// default: Num=0;break;
// }
// Key=0X0F; //判断行
// switch(Key)
// {
// case 0x07: Num=Num;break; //1 2 3 4
// case 0x0B: Num=Num+4;break; //5 6 7 8
// case 0x0D: Num=Num+8;break; //9 10 11 12
// case 0x0E: Num=Num+12;break; //13 14 15 16
// default: Num=0;break;
// }
// }
// while(Key!=0X0F); //要和最后的Key值一样
// }
//}
//
//反转法 先行再列
void scan_key_f()
{
Key=0X0F; //0000 1111
if(Key!=0X0F)
{
Delayms(10);
if(Key!=0X0F)
{
Key=0X0F; //判断行
switch(Key)
{
case 0x07: Num=1;break; //1 2 3 4
case 0x0B: Num=2;break; //5 6 7 8
case 0x0D: Num=3;break; //9 10 11 12
case 0x0E: Num=4;break; //13 14 15 16
default: Num=0;break;
}
}
Key=0XF0; //判断列
switch(Key)
{
case 0xE0: Num=Num*4-3;break;
case 0xD0: Num=Num*4-2;break;
case 0xB0: Num=Num*4-1;break;
case 0x70: Num=Num*4;break; //0111
default: Num=0;break;
}
while(Key!=0XF0);
}
}
//逐列扫描
void Scan_key_b()
{
Key=0x0f; //无论怎么接线,先确定列线 将列线置为0 行线置为1
if(Key!=0x0f)
{
Delayms(10);
if(Key!=0x0f)
{
Key=0xef; //第一列
if(Key!=0xef)
{
switch(Key)
{
case 0xe7:Num=1;while(Key==0xe7);break; //第一列第一行
case 0xeb:Num=5;while(Key==0xeb);break; //第一列第二行
case 0xed:Num=9;while(Key==0xed);break;
case 0xee:Num=13;while(Key==0xee);break;
default:Num=0;break;
}
}
Key=0xdf; //第二列
if(Key!=0xdf)
{
switch(Key)
{
case 0xd7:Num=2;while(Key==0xd7);break;
case 0xdb:Num=6;while(Key==0xdb);break;
case 0xdd:Num=10;while(Key==0xdd);break;
case 0xde:Num=14;while(Key==0xde);break;
default:Num=0;break;
}
}
Key=0xbf; //第三列
if(Key!=0xbf)
{
switch(Key)
{
case 0xb7:Num=3;while(Key==0xb7);break;
case 0xbb:Num=7;while(Key==0xbb);break;
case 0xbd:Num=11;while(Key==0xbd);break;
case 0xbe:Num=15;while(Key==0xbe);break;
default:Num=0;break;
}
}
Key=0x7f; //第四列
if(Key!=0x7f)
{
switch(Key)
{
case 0x77:Num=4;while(Key==0x77);break; //0111 0111
case 0x7b:Num=8;while(Key==0x7b);break; //0111 1011
case 0x7d:Num=12;while(Key==0x7d);break; //0111 1101
case 0x7e:Num=16;while(Key==0x7e);break; //0111 1110
default:Num=0;break;
}
}
}
}
}
void Delayms(unsigned int z) //@11.0592MHz
{
unsigned char i, j;
for(;z>0;z--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
复制代码
所有资料51hei提供下载:
资料.rar
(71.86 KB, 下载次数: 52)
2020-5-17 17:41 上传
点击文件名下载附件
源程序和仿真
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1