主函数
#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"
#include "Nixie.h"
#include "I2C.H"
#include "AT24C02.H"
unsigned char KeyNum;
unsigned char Min,Sec ,MiniSec;
unsigned char RunFlag;
void main()
{
Timer0_Init();
while(1)
{
KeyNum = Key();
if(KeyNum == 1)
{
RunFlag = !RunFlag;
}
if(KeyNum == 2)
{
Min = 0;
Sec = 0;
MiniSec = 0;
}
if(KeyNum == 3)
{
AT24C02_WriteByte(0,Min);
Delay(5);
AT24C02_WriteByte(1,Sec);
Delay(5);
AT24C02_WriteByte(2,MiniSec);
Delay(5);
}
if(KeyNum == 4)
{
Min = AT24C02_ReadByte(0);
Sec = AT24C02_ReadByte(1);
MiniSec = AT24C02_ReadByte(2);
}
Nixie_SetBuf(1,Min/10);
Nixie_SetBuf(2,Min%10);
Nixie_SetBuf(3,11);
Nixie_SetBuf(4,Sec/10);
Nixie_SetBuf(5,Sec%10);
Nixie_SetBuf(6,11);
Nixie_SetBuf(7,MiniSec/10);
Nixie_SetBuf(8,MiniSec%10);
}
}
void Sec_Loop(void)
{
if(RunFlag)
{
MiniSec++;
if(MiniSec >= 100)
{
MiniSec = 0;
Sec++;
if(Sec>=60)
{
Sec = 0;
Min++;
if(Min >= 60)
{
Min = 0;
}
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count1, T0Count2 ,T0Count3;
TL0 = 0x18;
TH0 = 0xFC;
T0Count1++;
if(T0Count1 >= 20)
{
T0Count1 = 0;
Key_Loop();
}
T0Count2++;
if(T0Count2 >= 2)
{
T0Count2 = 0;
Nixie_Loop();
}
T0Count3++;
if(T0Count3>=10)
{
T0Count3=0;
Sec_Loop();
}
}
独立按键(key)
#ifndef __Key_H__
#define __Key_H__
unsigned char Key(void);
void Key_Loop(void);
#endif
#include <REGX52.H>
#include "Delay.H"
unsigned char Key_KeyNumber;
unsigned char Key(void)
{
unsigned char Temp;
Temp = Key_KeyNumber;
Key_KeyNumber = 0;
return Temp;
}
unsigned char Key_GetState()
{
unsigned char KeyNumber = 0;
if(P3_1 == 0){KeyNumber = 1;}
if(P3_0 == 0){KeyNumber = 2;}
if(P3_2 == 0){KeyNumber = 3;}
if(P3_3 == 0){KeyNumber = 4;}
return KeyNumber;
}
void Key_Loop(void)
{
static unsigned char NowState,LastState;
LastState = NowState;
NowState = Key_GetState();
if(LastState == 1 && NowState == 0)
{
Key_KeyNumber = 1;
}
if(LastState == 2 && NowState == 0)
{
Key_KeyNumber = 2;
}
if(LastState == 3 && NowState == 0)
{
Key_KeyNumber = 3;
}
if(LastState == 4 && NowState == 0)
{
Key_KeyNumber = 4;
}
}
I2C
#ifndef __I2C_H__
#define __I2C_H__
void I2C_Start();
void I2C_Stop();
void I2C_SendByte(unsigned char Byte);
unsigned char I2C_ReseveByte();
void I2C_SendAck(unsigned char AckBit);
unsigned char I2C_ReceiveAck();
#endif
#include <REGX52.H>
sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;
void I2C_Start()
{
I2C_SDA = 1;
I2C_SCL = 1;
I2C_SDA = 0;
I2C_SCL = 0;
}
void I2C_Stop()
{
I2C_SDA = 0;
I2C_SCL = 1;
I2C_SDA = 1;
I2C_SCL = 0;
}
void I2C_SendByte(unsigned char Byte)
{
unsigned char i;
for(i = 0;i<8;i++)
{
I2C_SDA = Byte & (0x80 >> i);
I2C_SCL = 1;
I2C_SCL = 0;
}
}
unsigned char I2C_ReseveByte()
{
unsigned char i,Byte = 0x00;
I2C_SDA = 1;
for(i = 0;i<8;i++)
{
I2C_SCL = 1;
if(I2C_SDA){ Byte |= (0x80>>i);}
I2C_SCL = 0;
}
return Byte;
}
void I2C_SendAck(unsigned char AckBit)
{
I2C_SDA = AckBit;
I2C_SCL = 1;
I2C_SCL = 0;
}
unsigned char I2C_ReceiveAck()
{
unsigned char AckBit;
I2C_SDA = 1;
I2C_SCL = 1;
AckBit = I2C_SDA;
I2C_SCL = 0;
return AckBit;
}
存储器(AT24C02)
#ifndef __AT24C02_H__
#define __AT24C02_H__
void AT24C02_WriteByte(unsigned char WordAddress,Data);
unsigned char AT24C02_ReadByte(unsigned char WordAddress);
#endif
#include <REGX52.H>
#include "I2C.H"
#define AT24C02_ADDRESS 0xA0
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
I2C_Start();
I2C_SendByte(AT24C02_ADDRESS);
I2C_ReceiveAck();
I2C_SendByte(WordAddress);
I2C_ReceiveAck();
I2C_SendByte(Data);
I2C_ReceiveAck();
I2C_Stop();
}
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
unsigned char Data;
I2C_Start();
I2C_SendByte(AT24C02_ADDRESS);
I2C_ReceiveAck();
I2C_SendByte(WordAddress);
I2C_ReceiveAck();
I2C_Start();
I2C_SendByte(AT24C02_ADDRESS | 0x01);
I2C_ReceiveAck();
Data = I2C_ReseveByte();
I2C_SendAck(1);
I2C_Stop();
return Data;
}
时钟中断(Timer0)
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0_Init();
#endif
#include <REGX52.H>
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
PT0 = 0;
}
数码管(Nixie)
#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie_Scan(unsigned char Location,Number);
void Nixie_SetBuf(unsigned char Location , Number);
void Nixie_Loop(void);
#endif
#include <REGX52.H>
#include "Delay.h"
unsigned char Nixie_Buf[9] = {0,10,10,10,10,10,10,10,10};
unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};
void Nixie_SetBuf(unsigned char Location , Number)
{
Nixie_Buf[Location] = Number;
}
void Nixie_Scan(unsigned char Location,Number)
{
P0 = 0x00;
switch(Location)
{
case 1:P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
case 2:P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
case 3:P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
case 4:P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
case 5:P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
case 6:P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
case 7:P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
case 8:P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
}
P0 = NixieTable[Number];
}
void Nixie_Loop(void)
{
static unsigned char i = 1;
Nixie_Scan(i,Nixie_Buf[i]);
i++;
if(i>=9) {i=1;}
}