本帖最后由 wangzk 于 2010-6-26 14:44 编辑
修改后的秒表程序 用中断法实现的 这个应该精确了
原来的是用查询法 ,也改过来了:) 欢迎大家查错!
//OCM4x8B参考程序
#include <reg52.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define data_ora P2
#define uchar unsigned char
#define uint unsigned int
sbit req =P0^1; //请求信号,H有效
sbit busy=P0^0; //H:已收到数据并在处理中,L:空闲可接收数据
bit flag;
uint t02s, i=0,j=0,m=0,n=0,t=0;
void send (uchar dat);
uchar code taba[]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39};
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++)
;
}
/*------------写命令或数据到LCD--------------*/
void wr_zb (uchar comm,uchar addr_x,uchar addr_y)
{
send(comm);
send(addr_x);
send(addr_y);
}
void send (uchar dat) //写命令或数据
{
while(busy==1)
;
data_ora=dat;
req=1;
while(busy==0)
;
req=0;
}
/*--------------显示字符------------------*/
void disp_eng (uchar fng,uchar gmg,uchar dng,uchar cng,uchar ang)
{
wr_zb(0xf9,9,0);
send(fng);
wr_zb(0xf9,7,0);
send(gmg);
wr_zb(0xf9,6,0);
send(dng);
wr_zb(0xf9,5,0);
send (cng);
wr_zb(0xf9,4,0);
send(ang);
}
/*------------------主程序--------------------*/
void main ()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
EA=1;
SP=0x5f;
req=0;
busy=1;
disp_eng(taba,taba[j],taba[m],taba[n],taba[t]);
while(1) ;
}
void t0(void) interrupt 1 using 0
{
TH0=0x3c;
TL0=0xb0;
t02s++;
if(t02s==2)
{
t02s=0;
flag=~flag;
}
if(flag==1)
{
i++;
if(i==10)
{
i =0;
j++;
if (j==10)
{
j=0;
m++;
if (m==10)
{
m=0;
n++;
if(n==10)
{
n=0;
t++;
if (t==9)
{
TR0=0;///////计时到9000.0s
}
}
}
}
}
disp_eng(taba,taba[j],taba[m],taba[n],taba[t]);
}
} |