按鍵數(shù)碼管數(shù)值前移
#include
typedef unsigned char uchar;
typedef unsigned int uint;
void delay(unsigned int i); //函數(shù)聲名
char DelayCNT;//定義變量
sbit P10=P1^0;
uint Count=0;
uchar n=0;
uchar Key_Value;//獲取鍵盤(pán)碼
uint i=0;
uint flag=0;
//此表為 LED 的字模, 共陰數(shù)碼管 0-f
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //段碼控制
//此表為8個(gè)數(shù)碼管位選控制, 共陰數(shù)碼管 1-8個(gè) -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位選控制 查表的方法控制 從左邊開(kāi)始
//顯示緩沖區(qū)
uchar led_buf[8]={8,1,2,3,4,5,6,7}; //存放八個(gè)數(shù)
//計(jì)算每一位
void ADcal()
{
led_buf[0]=Count/100;//百位
led_buf[1]=Count/10%10;//十位
led_buf[2]=Count%10;//個(gè)位
}
//開(kāi)時(shí)間中斷
void initTime(){
IE=0x83;
TR0=1;
}
//開(kāi)外部中斷
void initOut(){
IE=0x83;
IT0=1;
}
//時(shí)間中斷0
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
n++;
if(n==2)
{
P10=1;
delay(20);
P10=0;
delay(20);
Count++;
if(Count>=999)
{
Count=0;
}
}
}
//外部中斷0
void out0() interrupt 0
{
Count++;
if(Count>=999)
{
Count=0;
}
}
/**********鍵盤(pán)**************************/
//返回0-15
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};//讓矩陣鍵盤(pán)的每行分別為低電平
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp))//判斷P1口高4位某一行為低電平
{
return (i+j*4);//返回鍵碼
}
temp <<= 1;
}
}
}
uint Key()
{
P1 = 0xf0;
if(P1 != 0xf0)//判斷有無(wú)按鍵按下
{
delay(10);//按鍵消抖
if(P1 != 0xf0)//第二次判斷有無(wú)按鍵按下
{
delay(10); //按鍵消抖
if(P1 != 0xf0)//第三次判斷有無(wú)按鍵按下
{
Key_Value = Keyscan();
if(flag == 1)
return 0;
else
return 1;
}
}
}
flag = 0;
return 0;
}
/****************************************/
//將數(shù)組中的數(shù)右移
void Mov()
{
uint j=7;
for(j;j>0;j--)
{
led_buf[j]=led_buf[j-1];
}
}
/************主函數(shù)**********************/
main()
{
/*
unsigned int i,LedNumVal=1 ; //變量定義
unsigned int LedOut[10]; //變量定義
DelayCNT=0;
*/
/*
unsigned int i=0;
initOut(); //打開(kāi)外部中斷'
initTime();
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
*/
delay(10);
while(1)
{/*
if(++DelayCNT>=20)//控制數(shù)字變化速度
{
DelayCNT=0;//20個(gè)掃描周期清零一次
++LedNumVal;//每隔20個(gè)掃描周期加一次
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位帶小數(shù)點(diǎn)
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //個(gè)位
for( i=0; i<8; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法進(jìn)行位選
delay(150);//掃描間隔時(shí)間太長(zhǎng)會(huì)數(shù)碼管會(huì)有閃爍感
}
*/
//ADcal();
/*
if(i==2)//百位
{
P0=Disp_Tab[led_buf[i]];
}
if(i==1)//十位
{
P0=Disp_Tab[led_buf[i]];
}
if(i==0)//個(gè)位
{
P0=Disp_Tab[led_buf[i]];
}
P2=dispbit[i];//將P2連接位選
i++;
i=i%3;
*/
if(Key())
{
Mov();//數(shù)組值右移
flag = 1;
led_buf[0]=Key_Value;//將當(dāng)前值存到數(shù)組第一位
}
//P0=Disp_Tab[Key_Value];
P0=Disp_Tab[led_buf[i]]; //數(shù)碼管段選
P2=dispbit[i];//將P2連接位選
i++;
i=i%8;
if(i==64)
{
i=0;
}
delay(150);
}
}
/*******************延時(shí)函數(shù)**********************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}