|
楼主 |
发表于 2017-9-23 22:08:26
|
显示全部楼层
本帖最后由 xzf586 于 2017-9-23 22:09 编辑
再来一个,从左往右显示!与前面的思想相反,中断执行显示,主函数扫描!那么多重复扫描语句,感觉实在有点呆板
#include<reg52.h>
#define DataPort P0
#define WeiPort P1
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^4;
sbit KEY6=P3^5;
sbit KEY7=P3^6;
sbit KEY8=P3^7;
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[10]; //显示数据缓存
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)//大致延时1mS
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
if(!KEY1)
{
DelayMs(10);
if(!KEY1)
{
while(!KEY1);
return 1;
}
}
else if(!KEY2)
{
DelayMs(10);
if(!KEY2)
{
while(!KEY2);
return 2;
}
}
else if(!KEY3)
{
DelayMs(10);
if(!KEY3)
{
while(!KEY3);
return 3;
}
}
else if(!KEY4)
{
DelayMs(10);
if(!KEY4)
{
while(!KEY4);
return 4;
}
}
else if(!KEY5)
{
DelayMs(10);
if(!KEY5)
{
while(!KEY5);
return 5;
}
}
else if(!KEY6)
{
DelayMs(10);
if(!KEY6)
{
while(!KEY6);
return 6;
}
}
else if(!KEY7)
{
DelayMs(10);
if(!KEY7)
{
while(!KEY7);
return 7;
}
}
else if(!KEY8)
{
DelayMs(10);
if(!KEY8)
{
while(!KEY8);
return 8;
}
}
else
return 0;
}
/*------------------------------------------------
显示函数,用于动态扫描数码管
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
P0=0x00;
P1=WeiMa[i+FirstBit];
P0=TempData;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
unsigned char num,i,j;
TMOD |= 0x01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
while (1)
{
num=KeyScan();
if(num)
{
if(i<8)
TempData=DuanMa[num];
i++;
if(i==9)//多出一个按键输入为了清屏
{
i=0;
for(j=0;j<8;j++)//清屏
TempData[j]=0;
}
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
Display(0,8); // 调用数码管扫描
}
|
|