#include <reg52.h>
#define CMD_RESET 0xa4 //復(fù)位(清除)指令
#define CMD_TEST 0xbf //測試指令
#define CMD_READ 0x15 //讀鍵盤數(shù)據(jù)指令
#define BLINKCTL 0x88 //閃爍控制
#define ACTCTL 0x98 //消隱控制
#define DECODE0 0x80 //下載數(shù)據(jù)且按方式0譯碼
#define DECODE1 0xc8 //下載數(shù)據(jù)且按方式1譯碼
#define UNDECODE 0x90 //下載數(shù)據(jù)但不譯碼
#define SEGON 0xe0 //段點亮指令
#define SEGOFF 0xc0 //段關(guān)閉指令
#define RTL_CYCLE 0xa3 //循環(huán)左移指令
#define RTR_CYCLE 0xa2 //循環(huán)右移指令
#define RTL_UNCYL 0xa1 //左移指令
#define RTR_UNCYL 0xa0 //右移指令
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//*******************變量及I/O口定義**********************
sbit cs=P1^0; //7279使能端
sbit clk=P1^1; //7279時鐘脈沖
sbit dat=P1^2; //7279數(shù)據(jù)端
sbit key=P1^3; //7279鍵位
/**************函數(shù)原型說明****************/
void write7279(uchar,uchar); //寫入到HD7279
void send_uchar(uchar); //發(fā)送一個字節(jié)
void Init_Timer0();
void short_delay(void); //延時約8us
void long_delay(void); //延時約50us
uchar ucHMiao=0,ucSec=0,ucMin=0,ucHour=0;
uchar bflag=0; //1秒標記
//uchar ww_led[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70, 0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47,0x00,0x67}; //0--9的數(shù)碼表
uchar ww_led[]={0xdb,0xc0,0xb3,0xf2,0xe8,0x7a,0x6b,0xd0, 0xfb,0xf8};//0--9的數(shù)碼表
uchar Led_buf[6]={0x5b,0x0f,0x77,0x77,0x0f,0x00};//START十六進制代碼
uchar led_buf[];
//*****************************************
//發(fā)送數(shù)據(jù)給7279顯示
//*****************************************
void send_uchar(uchar out_uchar)
{
uchar i;
cs=0;
long_delay();
for(i=0;i<8;i++)
{
if(out_uchar&0x80)
dat=1;
else
dat=0;
clk=1;
short_delay();
clk=0;
short_delay();
out_uchar=out_uchar*2;
}
dat=0;
}
//**********************************
// 函數(shù)功能:接收一個字節(jié)
// 形式參數(shù):無
// 返回值 :接收到的字節(jié)in_uchar
//**********************************
uchar receive_uchar(void)
{
uchar i,in_uchar;
dat=1; //設(shè)為輸入狀態(tài)
long_delay();
for(i=0;i<8;i++)
{
clk=1;
short_delay();
in_uchar=in_uchar*2;
if(dat)
in_uchar=in_uchar|0x01;
clk=0;
short_delay();
}
dat=0;
return(in_uchar);
}
//************************************************ ***********
// 函數(shù)功能:往7279發(fā)送一個不帶數(shù)據(jù)的指令,然后讀出7279的值
// 形式參數(shù):要發(fā)送的指令commond
// 返回值 :無
//************************************************ ***********
uchar read7279(uchar commond)
{
send_uchar(commond);
return(receive_uchar());
}
//*****************************************
// 函數(shù)功能:找出鍵值為value的按鍵的鍵號
// 形式參數(shù):鍵值value
// 返回值 :查到的鍵號i
//*****************************************
uchar get_key_number(uchar value)
{
uchar i;
uchar KEY_CODE[]={ 0x04,0x05,0x06,0x07,
0x0c,0x0d,0x0e,0x0f,
0x14,0x15,0x16,0x17,
0x1c,0x1d,0x1e,0x1f}; //鍵值表
for(i=0;value!=KEY_CODE[i];i++);
return i;
}
uchar Key_Scan(void)
{
uchar key_value,key_number;
if(!key) //如果有鍵按下
{
key_value=http://blog.soso.com/qz.q/read7279(CMD_READ); //讀出鍵值
key_number=get_key_number(key_value); //查出鍵號
while(!key);////////////////////////////////////// /////////////////////////////////////////////////// ////
return key_number;
}
else
{
return (0xff);
}
}
//****************************************
// 函數(shù)功能:往7279發(fā)送一個帶數(shù)據(jù)的指令
// 形式參數(shù):命令commond(數(shù)碼管位子),數(shù)據(jù)Data(顯示的數(shù)據(jù))
// 返回值 :無
//****************************************
void write7279(uchar commond,uchar Data)
{
send_uchar(commond);
send_uchar(Data);
}
//***********************
// 函數(shù)功能:延時約8us
// 形式參數(shù):無
// 返回值 :無
//***********************
void short_delay(void) //延時約8us
{
uchar i;
for(i=0;i<2;i++);
}
//************************
// 函數(shù)功能:延時約50us
// 形式參數(shù):無
// 返回值 :無
//************************
void long_delay(void) //延時約50us
{
uchar i;
for(i=0;i<12;i++);
}
void Disp(uint k) //時間處理函數(shù)
{
uchar i;
led_buf[0]= k%10;
led_buf[1]= k%100/10;
led_buf[2]= k%1000/100;
led_buf[3]= k%10000/1000;
for(i=0;i<4;i++) //顯示6位數(shù)碼管
{
write7279(0x90+i,0); //0X90為最右邊數(shù)碼管
write7279(DECODE1+i,Led_buf[i]); //0X90為最右邊數(shù)碼管
}
}
void int_7279(void)
{
uchar i;
/**********************初始化***********************************/
send_uchar(CMD_RESET);
for(i=0;i<8;i++)
{
write7279(UNDECODE+i,1);
}
}