数码管显示和闪烁
要用到数码管显示的代码和定时器代码。
数码管显示
#include <REGX52.H>
#include "Delay.h"
#include "DS1302.h"
unsigned char num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x40,0x00};
void a(unsigned char LOCATE,number)
{
switch(LOCATE)
{
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;
case 9:
P2_4=1;P2_3=1;P2_2=1;
break;
}
P0=num[LCD_Time[number]];
Delay(1);
P0=0x00;
}
void c(unsigned char LOCATE,number)
{
switch(LOCATE)
{
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;
case 9:
P2_4=1;P2_3=1;P2_2=1;
break;
}
P0=num[number];
Delay(1);
P0=0x00;
}
这里用到两个代码,下面的是用来显示‘-’的。
定时器
要用到两个定时器,因为要在调置时间和‘-’闪烁。所以先对两个定时器初始化。初始化使得定时器每溢出一次刚好过1ms。
#include <REGX52.H>
void Timer0_Init(void)
{
TMOD&=0xF0;
TMOD|=0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
PT0=0;
}
void Timer1_Init(void)
{
TMOD&=0x0F;
TMOD|=0x10;
TL1 = 0x66;
TH1 = 0xFC;
TF1 = 0;
TR1 = 1;
ET1=1;
EA=1;
PT0=0;
}
void Timer0_Routine() interrupt 1 //‘--’的闪烁
{
static unsigned int T0Count;
TH0=0xFC;
TL0=0x66;
T0Count++;
if(T0Count>=500) //亮占0.5s,暗占0.5s
{
T0Count=0;
b=!b;
}
}
void Timer1_Routine() interrupt 3 //时间设置时的闪烁
{
static unsigned int T1Count;
TH1=0xFC;
TL1=0x66;
T1Count++;
if(T1Count>=250)
{
T1Count=0;
TimeSetFlashFlag=!TimeSetFlashFlag;
}
}
矩阵键盘的控制
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=1;}
if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=5;}
if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=9;}
if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=2;}
if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=6;}
if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=10;}
if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=3;}
if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=7;}
if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=11;}
if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=4;}
if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=8;}
if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=12;}
if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=16;}
return KeyNumber;
}
用到学长上次讲的代码,这样按下去后就不会熄灭。
时间设置代码
void TimeSet()
{
if(KeyNum_Last==0&&KeyNum==1)
{
n=1;
DS1302_Time[0]++;
if(DS1302_Time[0]>23){DS1302_Time[0]=0;}
Key=1;
DS1302_SetTime();
DS1302_ReadTime();
}
if(KeyNum_Last==0&&KeyNum==5)
{
n=1;
DS1302_Time[0]--;
if(DS1302_Time[0]<0){DS1302_Time[0]=23;}
Key=2;
DS1302_SetTime();
DS1302_ReadTime();
}
if(KeyNum_Last==0&&KeyNum==2)
{
n=1;
DS1302_Time[1]++;
if(DS1302_Time[1]>59){DS1302_Time[1]=0;}
Key=3;
DS1302_SetTime();
DS1302_ReadTime();
}
if(KeyNum_Last==0&&KeyNum==6)
{
n=1;
DS1302_Time[1]--;
if(DS1302_Time[1]<0){DS1302_Time[1]=59;}
Key=4;
DS1302_SetTime();
DS1302_ReadTime();
}
if(KeyNum_Last==0&&KeyNum==3)
{
n=1;
DS1302_Time[2]++;
if(DS1302_Time[2]>59){DS1302_Time[2]=0;}
Key=5;
DS1302_SetTime();
DS1302_ReadTime();
}
if(KeyNum_Last==0&&KeyNum==7)
{
n=1;
DS1302_Time[2]--;
if(DS1302_Time[2]<0){DS1302_Time[2]=59;}
Key=6;
DS1302_SetTime();
DS1302_ReadTime();
}
if(n==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==1 &&TimeSetFlashFlag==1)
{
c(1,12);
c(2,12);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
else if(Key==1 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==2 &&TimeSetFlashFlag==1)
{
c(1,12);
c(2,12);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
else if(Key==2 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==3 &&TimeSetFlashFlag==1)
{
a(1,0);
a(2,1);
c(4,12);
c(5,12);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
else if(Key==3 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==4 &&TimeSetFlashFlag==1)
{
a(1,0);
a(2,1);
c(4,12);
c(5,12);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
else if(Key==4 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==5 &&TimeSetFlashFlag==1)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
c(7,12);
c(8,12);
c(3,11);
c(6,11);
}
else if(Key==5 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
if(Key==6 &&TimeSetFlashFlag==1)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
c(7,12);
c(8,12);
c(3,11);
c(6,11);
}
else if(Key==6 &&TimeSetFlashFlag==0)
{
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
c(3,11);
c(6,11);
}
}
思路:
就是在定时器工作的情况下,每一次溢出就轮换亮和暗。TimeSetFlashFlag==0就暗,TimeSetFlashFlag==1就亮。
注意,每次设置完时间都要先将数据给定时器,即定时器先读取,再设置才能在设置时间的界面看到加减后的时间。
主函数
void main()
{
LCD_Init();
DS1302_Init();
Timer0_Init();
Timer1_Init();
DS1302_SetTime();
while(1)
{
KeyNum=MatrixKey();
if(KeyNum==4)
{
MODE=1;
}
if(KeyNum==8)
{
MODE=0;
DS1302_SetTime();
}
switch(MODE)
{
case 0:
DS1302_ReadTime();
if(b==0){c(3,11);c(6,11);}
else if(b==1){c(3,12);c(6,12);}
a(1,0);
a(2,1);
a(4,2);
a(5,3);
a(7,4);
a(8,5);
break;
case 1:TimeSet();break;
}
KeyNum_Last=KeyNum;
}
}