?? 8 ht1380.c
字號:
//ht1380時鐘芯片的應用//
#include <reg51.h>
/*****定義ht1380芯片接口********/
// ht1380 ht1380_sclk --->P1.0
// ht1380 I/O --->P1.1
// ht1380 ht1380_rest --->P1.2
sbit ht1380_sclk=P1^0;
sbit ht1380_data=P1^1;
sbit ht1380_rest=P1^2;
/**********定義兩個全局變量*********/
//定義數(shù)組變量用于存放四個數(shù)碼管的顯示數(shù)據(jù)
//定義number存放動態(tài)顯示是第幾個數(shù)碼管
unsigned char d[4],number;
/*********定義時間變量年月日時分秒***********/
unsigned char year,month,day,hour,minute,second;
/**********定義冒號變量 distime=1 是數(shù)碼管冒號顯示出來************/
bit distime;
/*******與數(shù)碼管相關的兩個表*********/
//一個顯示譯碼表 //注:這里表比前一個多了一個值,最后一個數(shù)代表空顯示
//一個使能譯碼表
unsigned char code tab[11]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0};
unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
/******延時程序***********/
void delay(unsigned char dy)
{
while(--dy);
}
/******按鍵接口描述********/
//左第一 二 三 四 個按鍵分別對應于 P2.7 P2.6 P2.5 P2.4
//左第一個按鍵鍵值為1
//左第二個按鍵鍵值為2
//左第三個按鍵鍵值為3
//左第四個按鍵鍵值為4
/******讀取按鍵子程序 getkey()*************/
unsigned char getkey (void)
{ unsigned char k,tem,keytem;
keytem=0;
tem=P2 & 0xf0; //第一次讀取按鍵值
if(tem!=0xf0) //判斷有無按鍵按下
{
for(k=0;k<20;k++)
delay(250); //延時一段時間
tem=P2 & 0xf0; //再次讀取按鍵值
if(tem!=0xf0)
{ if(tem==0x70) keytem=1; //表示左第一個按鍵按下
else if(tem==0xb0) keytem=2; //表示左第二個按鍵按下
else if(tem==0xd0) keytem=3; //表示左第三個按鍵按下
else if(tem==0xe0) keytem=4; //表示左第四個按鍵按下
}
}
while(tem!=0xf0) tem=P2 & 0xf0; //等待按鍵釋放
return(keytem); //返回按鍵值
}
/******* ht1380 子程序*****************/
//------------- sent_char to ht1380----------
//上升沿寫入
void sent_char(unsigned char sentchar)
{
unsigned char ii;
for(ii=0;ii<8;ii++)
{
ht1380_sclk=0;
if ((sentchar & 1)!=0) ht1380_data=1;
else ht1380_data=0;
ht1380_sclk=1;
sentchar=sentchar>>1;
}
}
//------------- get_char from ht1380---------
unsigned char get_char()
{
unsigned char getchar,ii,temp;
getchar=0;temp=1;
for(ii=0;ii<8;ii++)
{
ht1380_sclk=0;
ht1380_data=1;
if(ht1380_data==1) getchar=getchar |temp;
ht1380_sclk=1;
temp=temp<<1;
}
return(getchar);
}
//-------------set_wp_off------------------
void set_wp_off()
{
ht1380_rest=1;
sent_char(0x8e); //10001110b
sent_char(0); //00000000b
ht1380_sclk=0;
ht1380_rest=0;
}
//-----------set_wp_on--------------------
void set_wp_on()
{
ht1380_rest=1;
sent_char(0x8e); //10001110b
sent_char(0x80); //10000000b
ht1380_sclk=0;
ht1380_rest=0;
}
//----------read_time --------------------
void read_time()
{
unsigned char temp;
ht1380_rest=1;
sent_char(0xbf); //10111111b
second=get_char();
minute=get_char();
hour= get_char();
day= get_char();
month= get_char();
temp= get_char(); /* week day */
year= get_char();
temp= get_char();
ht1380_sclk=0;
ht1380_rest=0;
}
//--------------set time-----------------
void set_time()
{
set_wp_off();
ht1380_rest=1;
sent_char(0xbe); //10111110b
sent_char(second);
sent_char(minute);
sent_char(hour);
sent_char(day);
sent_char(month);
sent_char(1); /* week day */
sent_char(year);
sent_char(0);
ht1380_sclk=0;
ht1380_rest=0;
set_wp_on();
}
/*****定時器初始化程序*******/
void Init_Timer (void)
{
TMOD=0x21;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
EA=1;
}
/*****定時器0中斷服務程序******/
//顯示處理,具體可以參考前面的實驗
void timer0() interrupt 1 using 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
number=number++;
if(number>3) number=0;
P2=digit[number];
P0=tab[d[number]];
//在第二個數(shù)碼管顯示時,將最高位的小數(shù)點顯示出來,這里為冒號
if(distime==1 && number==1)
P0=tab[d[number]]+0x80;
}
/*******主函數(shù)***********/
//效果:
//顯示時分
//可用按鍵調整時間-時分
//在較時狀態(tài)時,相應的數(shù)字閃爍
//第一個按鍵用于調整到較時狀態(tài)并且可以切換要修改的位,第二個按鍵用于加1..
//..第三個按鍵用于減,第四個按鍵用于確認回到正常顯示狀態(tài)。
//這里就不調整年月日了.大家可以考慮一下如何調整
void main (void)
{
unsigned char keyboard; //鍵值變量
unsigned char state=0; //狀態(tài)指示 =1較時狀態(tài) =0正常顯示狀態(tài)
unsigned char i,distem,w=3; //變量
year=07;month=03;day=0x05;hour=0x07;minute=0x16;second=13; //軟件預設時間參數(shù)
ht1380_rest=0;ht1380_sclk=0; //選中時鐘芯片
set_time(); //設置時間
Init_Timer(); //初始化定時器及全局變量
number=0;
distime=1; //冒號顯示
while(1)
{
distime=~distime; // 閃動冒號
read_time(); //讀時間
if(state==0) //state=0 正常顯示狀態(tài)
{
read_time();
d[0]=hour/16;
d[1]=hour %16;
d[2]=minute/16;
d[3]=minute %16;
}
else //較時狀態(tài)。讓需要較時的位閃動
{
distem=d[w];
d[w]=10;
for(i=0;i<250;i++)
delay(250);
d[w]=distem;
for(i=0;i<250;i++)
delay(250);
}
keyboard=getkey(); //讀按鍵
if(keyboard==1) // keyboard=1時,切換轉態(tài)到較時并且多次..
{ state=1; // ..按鍵后會同時向后退到下一位
w++;
if(w>3) w=0;
}
else if(keyboard==2)
{ d[w]++;
if(d[w]>9) d[w]=0;
}
else if(keyboard==3)
{ if(d[w]>0) d[w]--; }
else if(keyboard==4)
{ hour=d[0]*16+d[1];
minute=d[2]*16+d[3];
second=0;
set_time();
state=0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -