本帖最后由 房一鹏 于 2022-1-22 09:12 编辑
经实践证明此程序可用,可以实现加法计算,但每一个数码管都有波动,且其亮度不高,凑合着用吧。
数码管亮度不高的原因:在每一次对按键状态进行检测是重新赋值了P20、P21、P22的值,令其为1、1、1,根据原理图,此时数码管和led小灯都不会亮,导致了单个数码管亮的时间只有数码管刷新程序运行的那一瞬间(时间非常短),而不是1毫秒内一直亮,所以数码管亮度不高。
(这只是我的个人见解,若有其余见解可以回复)
另外可以对程序进行修改,提高数码管的亮度,只需在中断的按键状态检测程序后对P20,P21,P22重新赋值,便可让数码管亮度变得很亮。之后我会再发一遍程序。
注:在此程序中有很多的地方【i】都没有显示,复制粘贴后要加上[i ]注意!!!!!!!
#include<reg52.h>
sbit ENLED=P1^1;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;
unsigned char ledchar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
};
unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
unsigned char ledbuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char keycodeMap[4][4]={
{0x31,0x32,0x33,0x26}, //êy×Ö¼ü1£»êy×Ö¼ü2£»êy×Ö¼ü3£»ÏòéÏ ¼ó
{0x34,0x35,0x36,0x25}, //êy×Ö¼ü4£»êy×Ö¼ü5£»êy×Ö¼ü6£»Ïò×ó ¼õ
{0x37,0x38,0x39,0x28}, //êy×Ö¼ü7£»êy×Ö¼ü8£»êy×Ö¼ü9£»ÏòÏ 3Ë
{0x30,0x1B,0x0D,0x27} //êy×Ö¼ü0£»ESC¼ü£»»Ø3μ¼ü£» Ïòóò 3y
};
void keydrive();
void keyaction(unsigned char keycode);
void shownumber(unsigned long num);
void main ()
{
ENLED=0;
EA=1;
TMOD=0x01;
TH0=0xFE;
TL0=0xEF;
TR0=1; //′ò¿a¶¨ê±Æ÷
ET0=1; //′ò¿aÖD¶Ï
ledbuff[0]=ledchar[0];
while(1)
{
keydrive();
}
}
void shownumber(unsigned long num)
{
unsigned char buf[6];
signed int i;
for(i=0;i<6;i++)
{
buf=num%10;
num=num/10;
}
for(i=5;i>=1;i--)
{
if(buf==0)
{
ledbuff=0xFF;
}
else
break;
}
for(;i>=0;i--)
{
ledbuff=ledchar[buf];
}
}
void keyaction(unsigned char keycode)
{
static unsigned long result=0;
static unsigned long addend=0;
if((keycode>=0x30)&&(keycode<=0x39))
{
addend=(addend*10)+(keycode-0x30);
shownumber(addend);
}
else if(keycode==0x26)
{
result+=addend;
addend=0;
shownumber(result);
}
else if(keycode==0x0D)
{
result+=addend;
addend=0;
shownumber(result);
}
else if(keycode==0x1B)
{
addend=0;
result=0;
shownumber(result);
}
}
void keydrive()
{
unsigned int i,j; //iêÇDD£¬jêÇáD
static unsigned char backup[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keysta[j]!=backup[j])
{
if(backup[j]==0)
{
keyaction(keycodeMap[j]);
}
backup[j]=keysta[j];
}
}
}
}
void ledscan()
{
static unsigned int i=0;
P0=0xFF;
if(i==0)
{P20=121=022=1;i++0=ledbuff[0];}
else if(i==1)
{P20=021=022=1;i++0=ledbuff[1];}
else if(i==2)
{P20=121=122=0;i++0=ledbuff[2];}
else if(i==3)
{P20=021=1;P22=0;i++;P0=ledbuff[3];}
else if(i==4)
{P20=1;P21=0;P22=0;i++;P0=ledbuff[4];}
else if(i==5)
{P20=0;P21=0;P22=0;i=0;P0=ledbuff[5];}
}
void keyscan()
{
static unsigned char keyout=0;
unsigned char i=0;
static unsigned char keybuf[4][4]={
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF
};
P20=1;P21=1;P22=1;P23=1;
keybuf[keyout][0]=(keybuf[keyout][0]<<1)|P20;
keybuf[keyout][1]=(keybuf[keyout][1]<<1)|P21;
keybuf[keyout][2]=(keybuf[keyout][2]<<1)|P22;
keybuf[keyout][3]=(keybuf[keyout][3]<<1)|P23;
for(i=0;i<4;i++)
{
if((keybuf[keyout]&0x0F)==0x00)
{
keysta[keyout]=0;
}
else if((keybuf[keyout]&0x0F)==0x0F)
{
keysta[keyout]=1;
}
else{}
}
keyout++;
if(keyout>=4)
{
keyout=0;
}
// keyout=keyout&0x03;
switch(keyout)
{
case 0:kout1=1;kout2=1;kout3=1;kout4=0;break;
case 1:kout1=1;kout2=1;kout3=0;kout4=1;break;
case 2:kout1=1;kout2=0;kout3=1;kout4=1;break;
case 3:kout1=0;kout2=1;kout3=1;kout4=1;break;
default :break;
}
//P20=0;P21=0;P22=0;
}
void interruptTime() interrupt 1
{
TH0=0xFE;
TL0=0xEF;
ledscan();
keyscan();
}
|