#include<reg51.h>
#include<intrins.h>
/*******宏定義***********/
#define uint unsigned int
#define uchar unsigned char
/******位定義************/
sbit SH_CP=P3^1; /*移位寄存器時鐘輸入*/
sbit ST_CP=P3^3; /*存儲寄存器時鐘輸入*/
sbit DS=P3^2; /****串行數據輸入****/
/******變量和數組*******/
uint key;
uint timecount;
uchar cnta;
uchar cntb;
uchar code key_num[8][8]={
0,1,2,3,4,5,6,7,
8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,
56,57,58,59,60,61,62,63,
};
uchar code table[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code digit_tab[10][8]={ /***字模 陽碼 逐列式 逆向 ***/
{0xFF,0xC7,0xBB,0xBB,0xBB,0xBB,0xC7,0xFF}, /*"0",0*/
{0xFF,0xB7,0xB7,0x83,0xBF,0xBF,0xFF,0xFF}, /*"1",1*/
{0xFF,0xB7,0x9B,0x9B,0x9B,0xAB,0x93,0xFF}, /*"2",2*/
{0xFF,0xD7,0xBB,0xB3,0xB3,0xAB,0xCB,0xFF}, /*"3",3*/
{0xFF,0xEF,0xD7,0xDB,0x9B,0x81,0xFF,0xFF}, /*"4",4*/
{0xFF,0xC3,0xAB,0xAB,0xAB,0xAB,0xDB,0xFF},/*"5",5*/
{0xFF,0xC7,0xAB,0xAB,0xAB,0xAB,0xDF,0xFF},/*"6",6*/
{0xFF,0xF3,0xFB,0x8B,0xEB,0xF3,0xFB,0xFF}, /*"7",7*/
{0xFF,0xD3,0xAB,0xAB,0xAB,0xAB,0xD3,0xFF},/*"8",8*/
{0xFF,0xF7,0xAB,0xAB,0xAB,0x8B,0xC7,0xFF}, /*"9",9*/
// {0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00},/*"0",0*/
// {0x00,0x48,0x48,0x7C,0x40,0x40,0x00,0x00},/*"1",1*/
// {0x00,0x48,0x64,0x64,0x64,0x54,0x6C,0x00},/*"2",2*/
// {0x00,0x28,0x44,0x4C,0x4C,0x54,0x34,0x00},/*"3",3*/
// {0x00,0x10,0x28,0x24,0x64,0x7E,0x00,0x00},/*"4",4*/
// {0x00,0x3C,0x54,0x54,0x54,0x54,0x24,0x00},/*"5",5*/
// {0x00,0x38,0x54,0x54,0x54,0x54,0x20,0x00},/*"6",6*/
// {0x00,0x0C,0x04,0x74,0x14,0x0C,0x04,0x00},/*"7",7*/
// {0x00,0x2C,0x54,0x54,0x54,0x54,0x2C,0x00},/*"8",8*/
// {0x00,0x08,0x54,0x54,0x54,0x74,0x38,0x00},/*"9",9*/
};
/**************函數定義***********************/
/*********************************************/
/*******函數名稱:Ser_IN**********************/
/*******函數描述:串行數據輸入****************/
/*******輸入參數:Data************************/
/*******返回值 : 無**************************/
/*********************************************/
void Ser_IN(uchar Data)
{
uchar i;
for(i=0;i<8;i++)
{
SH_CP=0;
DS=Data&0x08;
Data<<=1;
SH_CP=1;
_nop_();
}
}
/*********************************************/
/*******函數名稱:Par_OUT********************/
/*******函數描述:并行數據輸出****************/
/*******輸入參數:無**************************/
/*******返回值 : 無**************************/
/*********************************************/
void Par_OUT()
{
ST_CP=1;
_nop_( );
_nop_( );
ST_CP=0;
}
/*********************************************/
/*******函數名稱:Timer0**********************/
/*******函數描述:T0中斷函數******************/
/*******輸入參數:無**************************/
/*******返回值 : 無**************************/
/*********************************************/
void Timer0(void) interrupt 1using 0
{
TH0=(65536-1000)/256; //12MHZ晶振定時時間為1ms
TL0=(65536-1000)%256;
Ser_IN(table[cntb]); //列掃描//
Ser_IN(digit_tab[cntb][cnta]); //串行數據輸入//
Par_OUT(); //并行數據輸出
cnta++;
if(cnta==8)
{
cnta=0;
} ;
timecount++;
if(timecount==1000)
{
timecount=0;
cntb ++;
if(cntb==10)
{
cntb=0;
}
}
key=key_scan();
if(key!=-1)
{
switch(key)
case 0:cntb=0;break;
case 1:cntb=1;break;
case 2:cntb=2;break;
case 3:cntb=3;break;
case 4:cntb=4;break;
case 5:cntb=5;break;
case 6:cntb=6;break;
case 7:cntb=7;break;
case 8:cntb=8;break;
case 9:cntb=9;break;
case 10:cntb=10;break;
}
}
/*********************************************/
/*******函數名稱:key_scan*********************/
/*******函數描述:鍵盤掃描********************/
/*******輸入參數:無**************************/
/*******返回值 : 鍵值************************/
/*********************************************/
int key_scan()
{
uint i,j;
for(i=0;i<8;i++)
{
P0=table[i];
if(P2!=0xff)
{
delayms(2);
if(P2!=0xff)
{
for(j=0;j<8;j++)
{
if(P2==table[j])
return key_num[i][j];
}
}
}
else
return -1;
}
}
/*********************************************/
/*******函數名稱:delayms**********************/
/*******函數描述:延時函數********************/
/*******輸入參數:uint m***********************/
/*******返回值 :無***************************/
/*********************************************/
void delayms(uint m);
{
uint i,j;
for(i=0;i<m;i++)
for(j=0;j<125;j++);
}
/*********************************************/
/*******函數名稱:main************************/
/*******函數描述:主函數**********************/
/*******輸入參數:無**************************/
/*******返回值 :無***************************/
/*********************************************/
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
;
}
}
工程文件見附件。
|