题目:
用按键或者按键矩阵输入任意4位数(不为0),并在数码管上做显示以输入2761为例,数码管显示:2761-276.1-27.61-2.761-7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761
要求
就是小数点不停循环:由矩阵键盘获取值1-9并生成4位数,分解4位数数码管显示,当数大于0时开始小数点位置无限循环,按其他键清零.
sbit FAN_in1=P3^2;
sbit FAN_in2=P3^3;
sbit FAN_EN=P3^4;
sbit SHUMA1=P2^0;
sbit SHUMA2=P2^1;
sbit SHUMA3=P2^2;
sbit SHUMA4=P2^3;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit S1=P2^5;
sbit S2=P2^6;
sbit S3=P2^7;
sbit S4=P3^2;
sbit S5=P3^3;
unsigned int count=0,fan_count=0,led_en=0,fan_count_h=0,DZ=0,led_num=0,time_count=0,dp_en=0;
unsigned char start=0,num[10]={0,0,0,0},set_num[10]={0,0,0,0};
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9
void tm0_isr() interrupt 1
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
/////倒计时
///////
if(count<4)
count++;
else
{
count=0;
led_en=1;
if(led_en==1)
{
SHUMA1=0;
SHUMA2=0;
SHUMA3=0;
SHUMA4=0;
switch(DZ)
{
case 0:
SHUMA1=1;
if(dp_en==0)
P0=table[num[0]]&0x7f;
else
P0=table[num[0]];
DZ=1;
break;
case 1:
SHUMA2=1;
if(dp_en==1)
P0=table[num[1]]&0x7f;
else
P0=table[num[1]];
DZ=2;
break;
case 2:
SHUMA3=1;
if(dp_en==2)
P0=table[num[2]]&0x7f;
else
P0=table[num[2]];
DZ=3;
break;
case 3:
SHUMA4=1;
if(dp_en==3)
P0=table[num[3]]&0x7f;
else
P0=table[num[3]];
DZ=0;
break;
}
}
}
}
/*
函数功能实现1ms延时
*/
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void delay_ms(unsigned int i)
{
unsigned int j=0;
for(j=0;j<i;j++)
Delay1ms();
}
void scan_key()
{
unsigned char i, j,t[4];
if(S1==0)
{
delay_ms(10);
if(S1==0)
{
while(!S1);
{
num[0]=2;
set_num[0]=2;
}
}
}
else
if(S2==0)
{
delay_ms(10);
if(S2==0)
{
while(!S2);///K1键盘按下
{
num[1]=7;
set_num[1]=7;
}
}
}
else
if(S3==0)
{
delay_ms(10);
if(S3==0)
{
while(!S3);///K1键盘按下
{
num[2]=6;
set_num[2]=6;
}
}
}
else
if(S4==0)
{
delay_ms(10);
if(S4==0)
{
while(!S4);///S4停止工作
{
num[3]=1;
set_num[3]=1;
}
}
}
else
if(S5==0)
{
delay_ms(10);
if(S5==0)
{
while(!S5);///S5切换
{
start=1;
if(dp_en==0)
{
if(led_num<3)
led_num++;
else
led_num=0;
j=0;
for(i=led_num;i<4;i++)
num[j++]=set_num[i];
for(i=0;i<led_num;i++)
{
num[j]=set_num[i];
j++;
}
}
if(dp_en>0)
dp_en--;
else
dp_en=4;
}
}
}
}
void main()
{
char i=3,j=5;
TMOD = 0x01; //set timer0 as mode1 (16-bit)
TL0 = T1MS; //initial timer0 low byte
TH0 = T1MS >> 8; //initial timer0 high byte
TR0 = 1; //timer0 start running
ET0 = 1; //enable timer0 interrupt
EA = 1; //open global interrupt switch
P0=0xff;
start=0;
DZ=0;
dp_en=4;
led_num=0;
while(1)
{
scan_key();
}
}