#include "stc15f2k60s2.h"
#include "iic.h"
#include "ds1302.h"
unsigned char smg_mode = 1;
unsigned char sec = 0;
unsigned char min = 0;
unsigned char hour = 0;
unsigned char flag_min = 0;
unsigned char flag_hour = 0;
unsigned char bit1 = 0;//右
unsigned char bit2 = 0;
unsigned char bit3 = 0;
unsigned char bit4 = 0;
unsigned char keyboard_count = 0;
unsigned char stat_led = 0xff;
unsigned int last_num = 0;
unsigned char flag = 0;
unsigned int num = 0;
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
code unsigned char SegNoDot_Table[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };
code unsigned char SegDot_Table[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char code RTC_READ[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char code RTC_WRITE[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char TIME[7] = {0x48,0x59,0x23,0x10,0x04,0x03,0x24};
void HC573_Choose(unsigned char channel, unsigned char value)
{
P2 = (P2 & 0x1f) | 0x00;
P0 = value;
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void Delay5ms() //@12.000MHz
{
unsigned char i, j;
i = 59;
j = 90;
do
{
while (--j);
} while (--i);
}
void DisplaySMG_bit(unsigned char pos, unsigned char dat)
{
HC573_Choose(6,0x01 << pos);
HC573_Choose(7,dat);
DelaySMG(500);
HC573_Choose(6,0x01 << pos);
HC573_Choose(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
HC573_Choose(6,0xff);
HC573_Choose(7,value);
}
void DisplaySMG_Function()
{
switch(smg_mode)
{
case 1:
DisplaySMG_bit(7, SegNoDot_Table[sec & 0x0f]);
DisplaySMG_bit(6, SegNoDot_Table[(sec >> 4) & 0x7f]);
DisplaySMG_bit(5, 0xbf);
DisplaySMG_bit(4, SegNoDot_Table[min & 0x0f]);
DisplaySMG_bit(3, SegNoDot_Table[min >> 4]);
DisplaySMG_bit(2, 0xbf);
DisplaySMG_bit(1, SegNoDot_Table[hour & 0x0f]);
DisplaySMG_bit(0, SegNoDot_Table[hour >> 4]);
break;
case 2:
if(keyboard_count == 0)
{
DisplaySMG_bit(7, 0xff);
DisplaySMG_bit(6, 0xff);
DisplaySMG_bit(5, 0xff);
DisplaySMG_bit(4, 0xff);
}
else if(keyboard_count == 1)
{
DisplaySMG_bit(7, SegNoDot_Table[bit1]);
DisplaySMG_bit(6, 0xff);
DisplaySMG_bit(5, 0xff);
DisplaySMG_bit(4, 0xff);
}
else if(keyboard_count == 2)
{
DisplaySMG_bit(7, SegNoDot_Table[bit1]);
DisplaySMG_bit(6, SegNoDot_Table[bit2]);
DisplaySMG_bit(5, 0xff);
DisplaySMG_bit(4, 0xff);
}
else if(keyboard_count == 3)
{
DisplaySMG_bit(7, SegNoDot_Table[bit1]);
DisplaySMG_bit(6, SegNoDot_Table[bit2]);
DisplaySMG_bit(5, SegNoDot_Table[bit3]);
DisplaySMG_bit(4, 0xff);
}
else if(keyboard_count == 4)
{
DisplaySMG_bit(7, SegNoDot_Table[bit1]);
DisplaySMG_bit(6, SegNoDot_Table[bit2]);
DisplaySMG_bit(5, SegNoDot_Table[bit3]);
DisplaySMG_bit(4, SegNoDot_Table[bit4]);
}
DisplaySMG_bit(0, 0xc6);
break;
case 3:
DisplaySMG_bit(7, SegNoDot_Table[flag_min & 0x0f]);
DisplaySMG_bit(6, SegNoDot_Table[flag_min >> 4]);
DisplaySMG_bit(5, 0xbf);
DisplaySMG_bit(4, SegNoDot_Table[flag_hour & 0x0f]);
DisplaySMG_bit(3, SegNoDot_Table[flag_hour >> 4]);
DisplaySMG_bit(0, 0x86);
break;
}
}
void DS1302_Init()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i = 0;i<7;i++)
{
Write_Ds1302_Byte(RTC_WRITE[i],TIME[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void DS1302_Read()
{
sec = Read_Ds1302_Byte(RTC_READ[0]);
min = Read_Ds1302_Byte(RTC_READ[1]);
hour = Read_Ds1302_Byte(RTC_READ[2]);
}
void AT24C02_Write(unsigned char pos,unsigned char value)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(pos);
I2CWaitAck();
I2CSendByte(value);
I2CWaitAck();
I2CStop();
}
void Save_Function()
{
num = bit4*1000+bit3*100+bit2*10+bit1;
AT24C02_Write(0x00,((flag_hour >> 4)*10+(flag_hour & 0x0f)));
Delay5ms();
AT24C02_Write(0x01,((flag_min >> 4)*10+(flag_min & 0x0f)));
Delay5ms();
AT24C02_Write(0x02,(num / 256));
Delay5ms();
AT24C02_Write(0x03,(num % 256));
Delay5ms();
}
void num_trans(unsigned char num)
{
if(keyboard_count == 3)
{
flag = 1;
keyboard_count++;
bit4 = bit3;
bit3 = bit2;
bit2 = bit1;
bit1 = num;
}
else if(keyboard_count != 4)
{
keyboard_count++;
bit4 = bit3;
bit3 = bit2;
bit2 = bit1;
bit1 = num;
}
if(keyboard_count == 1)
{
flag_min = min;
flag_hour = hour;
}
}
void LED_Function()
{
unsigned int now_num = 0;
if(smg_mode == 1)
{
stat_led = (stat_led & 0xf8) | 0x06;
}
else if(smg_mode == 2)
{
stat_led = (stat_led & 0xf8) | 0x05;
}
else if(smg_mode == 3)
{
stat_led = (stat_led & 0xf8) | 0x03;
}
//记录指示灯
if(keyboard_count == 4)
{
if(flag == 1)
{
now_num = bit4*1000+bit3*100+bit2*10+bit1;
if(now_num > last_num)
{
stat_led = (stat_led & 0xf7) | 0x00;
}
else
{
stat_led = (stat_led & 0xf7) | 0x08;
}
}
}
HC573_Choose(4,stat_led);
}
void ScanKeys()
{
C1 = 1;C2 = 1;C3 = 1;C4 = 1;
R2 = 0;R3 = 1;R4 = 1;
//S6
if(C1 == 0)
{
DelaySMG(500);
if(C1 == 0)
{
num_trans(0);
while(C1 == 0)
{
DisplaySMG_Function();
}
}
}
//S10
if(C2 == 0)
{
DelaySMG(500);
if(C2 == 0)
{
num_trans(1);
while(C2 == 0)
{
DisplaySMG_Function();
}
}
}
//S14
if(C3 == 0)
{
DelaySMG(500);
if(C3 == 0)
{
num_trans(2);
while(C3 == 0)
{
DisplaySMG_Function();
}
}
}
//S18
if(C4 == 0)
{
DelaySMG(500);
if(C4 == 0)
{
num_trans(3);
while(C4 == 0)
{
DisplaySMG_Function();
}
}
}
R2 = 1;R3 = 0;R4 = 1;
//S5
if(C1 == 0)
{
DelaySMG(500);
if(C1 == 0)
{
if(smg_mode == 2)
{
last_num = bit4*1000+bit3*100+bit2*10+bit1;
bit1 = 0;bit2 = 0;bit3 = 0;bit4 = 0;
keyboard_count = 0;
}
while(C1 == 0)
{
DisplaySMG_Function();
}
}
}
//S9
if(C2 == 0)
{
DelaySMG(500);
if(C2 == 0)
{
num_trans(4);
while(C2 == 0)
{
DisplaySMG_Function();
}
}
}
//S13
if(C3 == 0)
{
DelaySMG(500);
if(C3 == 0)
{
num_trans(5);
while(C3 == 0)
{
DisplaySMG_Function();
}
}
}
//S17
if(C4 == 0)
{
DelaySMG(500);
if(C4 == 0)
{
num_trans(6);
while(C4 == 0)
{
DisplaySMG_Function();
}
}
}
R2 = 1;R3 = 1;R4 = 0;
//S4
if(C1 == 0)
{
DelaySMG(500);
if(C1 == 0)
{
switch(smg_mode)
{
case 1:
smg_mode = 2;
bit1 = 0;bit2 = 0;bit3 = 0;bit4 = 0;
keyboard_count = 0;
break;
case 2:
smg_mode = 3;
Save_Function();
break;
case 3:
smg_mode = 1;
break;
}
while(C1 == 0)
{
DisplaySMG_Function();
}
}
}
//S8
if(C2 == 0)
{
DelaySMG(500);
if(C2 == 0)
{
num_trans(7);
while(C2 == 0)
{
DisplaySMG_Function();
}
}
}
//S12
if(C3 == 0)
{
DelaySMG(500);
if(C3 == 0)
{
num_trans(8);
while(C3 == 0)
{
DisplaySMG_Function();
}
}
}
//S16
if(C4 == 0)
{
DelaySMG(500);
if(C4 == 0)
{
num_trans(9);
while(C4 == 0)
{
DisplaySMG_Function();
}
}
}
}
void Init_sys()
{
HC573_Choose(4,0xff);
HC573_Choose(5,0x00);
DisplaySMG_All(0xff);
DS1302_Init();
}
void main()
{
Init_sys();
while(1)
{
DS1302_Read();
ScanKeys();
LED_Function();
DisplaySMG_Function();
}
}
总结:在做题时要注意划掉已完成的功能,防止漏写。
题中的
输入数据(高字节):E2PROM内部地址2;
输入数据(低字节):E2PROM内部地址3;
指的是/256和%256,而不是说把四位数字两两分开存入。