|
PS:需要按一下按鍵加一或者減一,同時(shí)要保證數(shù)字的穩(wěn)定顯示(現(xiàn)在只能在沒有松手檢測(cè)的時(shí)候穩(wěn)定顯示)
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P1^1;
sbit du = P1^2;
sbit lcden = P3^4;
uchar num1 = 1, num3=1;
uint num2=1;
uchar leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
void delay(uint z);
void KeyScan(); //帶返回值的子函數(shù)
void show_num_2bit(); //2位數(shù)碼管顯示程序
void show_num_3bit_1(); //第一個(gè)3位數(shù)碼管顯示程序
void show_num_3bit_2(); //第二個(gè)3位數(shù)碼管顯示程序
void show_num();
/*------------------------------------------------*/
void main()
{
lcden = 0;
TMOD = 0x01;
TH0 = (65536 - 0)/256;
TL0 = (65536 - 0)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
show_num();
}
}
/*------------------------------------------------*/
void Interrupt_T0()interrupt 1
{
TH0 = (65536 - 0)/256;
TL0 = (65536 - 0)%256;
KeyScan();
}
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void KeyScan() //帶返回值的子函數(shù)
{
uchar cord_l,cord_h;//聲明列線和行線的值的儲(chǔ)存變量
P2 = 0xf8;//1111 0000
if( (P2 & 0xf8) != 0xf8)//判斷是否有按鍵按下
{
delay(5);//軟件消抖
if( (P2 & 0xf8) != 0xf8)//判斷是否有按鍵按下
{
cord_l = P2 & 0xf8;// 儲(chǔ)存列線值
P2 = cord_l | 0x07;
cord_h = P2 & 0x7;// 儲(chǔ)存行線值
switch( cord_l + cord_h )
{
//第一行鍵值碼 控制二位數(shù)碼管
case 0xf6: if(num1>=0&&num1<=98) num1++; break; //+1
case 0xee: if(num1>=1&&num1<=99) num1--; break; //-1
case 0xde: break;
case 0xbe: break;
case 0x7e: break;
//第二行鍵值碼 控制第一個(gè)三位數(shù)碼管
case 0xf5: if(num2>=1&&num2<=199) num2++; break; //+1
case 0xed: if(num2>=2&&num2<=200) num2--; break; //-1
case 0xdd: break;
case 0xbd: break;
case 0x7d: break;
//第三行鍵值碼 控制第二個(gè)三位數(shù)碼管
case 0xf3: if(num3>=1&&num3<=199) num3++; break; //+1
case 0xeb: if(num3>=2&&num3<=200) num3--; break; //-1
case 0xdb: break;
case 0xbb: break;
case 0x7b: break;
}
}
}
}
void show_num_2bit() //2位數(shù)碼管顯示程序
{
uchar ge, shi;
shi =num1/10;
ge =num1%10;
P0 = 0x01; //十位顯示
we = 1;
we = 0;
if(shi==0)
{
P0 = 0xFF;
du=1;
du=0;
delay(2);
}
else if(shi!=0)
{
P0 = leddata[shi];
du=1;
du=0;
delay(2);
}
P0 = 0x02; //個(gè)位顯示
we = 1;
we = 0;
P0 = leddata[ge];
du=1;
du=0;
delay(2);
}
void show_num_3bit_1() //第一個(gè)3位數(shù)碼管顯示程序
{
uchar ge, shi, bai;
bai =num2/100;
shi =num2%100/10;
ge =num2%10;
P0 = 0x04; //百位顯示
we = 1;
we = 0;
if(bai==0)
{
P0 = 0xFF;
du=1;
du=0;
delay(2);
}
else if(bai!=0)
{
P0 = leddata[bai];
du=1;
du=0;
delay(2);
}
P0 = 0x08; //十位顯示
we = 1;
we = 0;
if(shi==0&&bai==0)
{
P0 = 0xFF;
du=1;
du=0;
delay(2);
}
else if(shi!=0||bai!=0)
{
P0 = leddata[shi];
du=1;
du=0;
delay(2);
}
P0 = 0x10; //個(gè)位顯示
we = 1;
we = 0;
P0 = leddata[ge];
du=1;
du=0;
delay(2);
}
void show_num_3bit_2() //第二個(gè)3位數(shù)碼管顯示程序
{
uchar ge, shi, bai;
bai =num3/100;
shi =num3%100/10;
ge =num3%10;
P0 = 0x20; //百位顯示
we = 1;
we = 0;
if(bai==0)
{
P0 = 0xFF;
du=1;
du=0;
delay(2);
}
else if(bai!=0)
{
P0 = leddata[bai];
du=1;
du=0;
delay(2);
}
P0 = 0x40; //十位顯示
we = 1;
we = 0;
if(shi==0&&bai==0)
{
P0 = 0xFF;
du=1;
du=0;
delay(2);
}
else if(shi!=0||bai!=0)
{
P0 = leddata[shi];
du=1;
du=0;
delay(2);
}
P0 = 0x80; //個(gè)位顯示
we = 1;
we = 0;
P0 = leddata[ge];
du=1;
du=0;
delay(2);
}
void show_num()
{
show_num_2bit();
show_num_3bit_1();
show_num_3bit_2();
}
|
|