|
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit K4 = P1^3;
sbit K5 = P1^4;
sbit K6 = P2^4;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit RL = P2^0;
sbit LCD_RS=P1^6;
sbit LCD_RW=P1^5;
sbit LCD_E=P1^7;
#define LCD_DataPort P0
uint tab1[4]=0;
uint tab2[4]=0;
uint a=0;
uint cnt=0;
uint sec1=0;
uint sec2=0;
uchar k=0;
uchar min=0;
i = 0;
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void LED_init()
{
RL=1;
LED1=1;
LED2=1;
LED3=1;
}
void Timer_Init()
{
TMOD = 0x01;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
TR0=0;
EA=1;
ET0=1;
}
void LCD_WriteCommand(uchar Command)
{
LCD_RS=0;
LCD_RW=0;
LCD_DataPort=Command;
LCD_E=1;
delay(1);
LCD_E=0;
delay(1);
}
void LCD_WriteData(uchar Data)
{
LCD_RS=1;
LCD_RW=0;
LCD_DataPort=Data;
LCD_E=1;
delay(1);
LCD_E=0;
delay(1);
}
void LCD_Init()
{
delay(15);
LCD_WriteCommand(0x38);
delay(15);
LCD_WriteCommand(0x0C);
delay(15);
LCD_WriteCommand(0x06);
delay(15);
LCD_WriteCommand(0x01);
}
void DisplayCount(uint temp3,uint temp4)
{
tab1[0]=temp3/10;
tab1[1]=temp3%10;
tab1[2]=temp4/10;;
tab1[3]=temp4%10;
LCD_WriteCommand(0xC6);
LCD_WriteData(tab1[0]+0x30);
LCD_WriteCommand(0xC7);
LCD_WriteData(tab1[1]+0x30);
LCD_WriteCommand(0xC8);
LCD_WriteData('.');
LCD_WriteCommand(0xC9);
LCD_WriteData(tab1[2]+0x30);
LCD_WriteCommand(0xCA);
LCD_WriteData(tab1[3]+0x30);
}
void DisplaySet(uint temp1,uint temp2)
{
tab2[0]=temp1/10;
tab2[1]=temp1%10;
tab2[2]=temp2/10;;
tab2[3]=temp2%10;
LCD_WriteCommand(0x86);
LCD_WriteData(tab2[0]+0x30);
LCD_WriteCommand(0x87);
LCD_WriteData(tab2[1]+0x30);
LCD_WriteCommand(0x88);
LCD_WriteData('.');
LCD_WriteCommand(0x89);
LCD_WriteData(tab2[2]+0x30);
LCD_WriteCommand(0x8A);
LCD_WriteData(tab2[3]+0x30);
}
void KEY_set()
{
static uchar m=0;
if(K4==0)
{
delay(1);
do{}while(K4==0);
{
TR0=0;
m++;
if(m>4)
m=0;
}
}
if(m==1)
{
if(K5==0)
{
delay(1);
do{}while(K5==0);
sec1++;
}
if(K6==0)
{
delay(1);
{}while(K6==0);
sec1--;
}
}
if(m==2&&K5==0)
{
delay(1);
do{}while(K5==0);
sec1=sec1+10;
}
if(m==2&&K6==0)
{
delay(1);
do{}while(K6==0);
sec1=sec1-10;
}
if(m==3&&K5==0)
{
delay(1);
do{}while(K5==0);
sec2++;
}
if(m==3&&K6==0)
{
delay(1);
do{}while(K6==0);
sec2--;
}
if(m==4&&K5==0)
{
delay(1);
do{}while(K5==0);
sec2=sec2+10;
}
if(m==4&&K6==0)
{
delay(1);
do{}while(K6==0);
sec2=sec2-10;
}
if(K3==0)
{
delay(1);
do{}while(K3==0);
k++;
TR0=0;
if(k>2)
k=0;
}
}
void KEY_scan()
{
if(K1==0)
{
delay(1);
do{}while(K1==0);
i++;
if(i>1)
i=0;
}
if(i==0)
{
LED1=0;
LED2=1;
if(K2==0)
{
delay(1);
do{}while(K2==0);
RL=!RL;
}
}
if(i==1)
{
LED2=0;
LED1=1;
KEY_set();
if(K2==0)
{
delay(1);
do{}while(K2==0);
RL=0;
TR0=1;
}
}
}
void main()
{
LED_init();
LCD_Init();
Timer_Init();
while(1)
{
KEY_scan();
if(i==1&&k==0)
{
if(cnt>=100)
cnt=0;
DisplayCount(cnt,0);
DisplaySet(sec1,0);
LCD_WriteCommand(0x8B);
LCD_WriteData('m');
LCD_WriteCommand(0x8C);
LCD_WriteData('s');
if(cnt>=sec1)
{
TR0 = 0;
cnt=0;
RL=1;
}
}
if(i==1&&k==1)
{
DisplayCount(a,cnt/10);
DisplaySet(sec1,sec2);
LCD_WriteCommand(0x8B);
LCD_WriteData(' ');
LCD_WriteCommand(0x8C);
LCD_WriteData('s');
if(a>=sec1&&cnt>=sec2*10)
{
TR0 = 0;
cnt=0;
a=0;
RL=1;
}
}
if(i==1&&k==2)
{
DisplayCount(min,a);
DisplaySet(sec1,sec2);
LCD_WriteCommand(0x8B);
LCD_WriteData(' ');
LCD_WriteCommand(0x8C);
LCD_WriteData('m');
if(min>=sec1&&a>=sec2)
{
TR0 = 0;
cnt=0;
RL=1;
a=0;
min=0;
}
}
}
}
void Interrupt_0() interrupt 1
{
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
cnt++;
if(cnt>=1000)
{
cnt=0;
a++;
if(a==60)
{
a=0;
min++;
}
}
}
新手,程序?qū)懙挠悬c(diǎn)亂。我這個(gè)計(jì)數(shù)想要精確到ms 級,請問有什么辦法
|
|