当前位置:文档之家› 基于pic16f877a单片机的秒表计时器

基于pic16f877a单片机的秒表计时器

基于pic16f877a单片机的秒表计时器
内蒙古民族大学
草原神鹰工作组
电路组王恒舜2012/12/12
键盘从左至右依次为:开启计时器,一次计时、二次计时,三次计时。

按下左一键开始计时: D 714D 613D 512D 411D 310D 29D 18D 07E 6R W 5R S 4V S S 1V D D 2V E E 3LCD1
LM032L D 714D 613D 512D 411D 310D 29D 18D 07E 6R W 5R S 4V S S 1V D D 2V E E 3LCD1LM032L
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6R W 5R S 4V S S 1V D D 2V E E 3LCD1
LM032L
D 7
14D 613D 512D 411D 310D 29D 18D 07E
6R W 5R S 4V S S 1V D D 2V E E 3LCD1
LM032L
#define RS RC0
#define RW RC1
#define E RC2
uchar const table[]={'0','1','2','3','4','5','6','7','8','9'}; int num,s1,s2,s3,s4,s5,s6,a,b,c,n,i;
void LCD_write_command(uchar dat);
void LCD_write_data(uchar dat);
void LCD_disp_char(uchar x,uchar y,uchar dat); void delay(uint x);
void init();
void main()
{
TRISB=0;
PORTB=0X07;
i=0;
if(RB0==0)
{
init();
delay(10);
while(RB0)
{
if(num>=58)
{
num=0;
n++;
c=n/3600;
s5=c/10;
s6=c%10;
a=n%3600/60;
s1=a/10;
s2=a%10;
b=n%60;
s3=b/10;
s4=b%10;
LCD_disp_char(0,1,'3');
LCD_disp_char(2,1,table[s1]);
LCD_disp_char(3,1,table[s2]);
LCD_disp_char(4,1,':');
LCD_disp_char(5,1,table[s3]);
LCD_disp_char(6,1,table[s4]);
LCD_disp_char(7,1,'s');
}
if(RB1==0&&i==0)
{
i=1;
LCD_disp_char(0,0,'1');
LCD_disp_char(2,0,table[s1]);
LCD_disp_char(3,0,table[s2]);
LCD_disp_char(4,0,':');
LCD_disp_char(5,0,table[s3]);
LCD_disp_char(6,0,table[s4]);
LCD_disp_char(7,0,'s');
}
if(RB1==0&&i==1)
{
i=1;
LCD_disp_char(10,0,'2');
LCD_disp_char(12,0,table[s1]);
LCD_disp_char(13,0,table[s2]);
LCD_disp_char(14,0,':');
LCD_disp_char(15,0,table[s3]);
LCD_disp_char(16,0,table[s4]);
LCD_disp_char(17,0,'s');
}
if(RB2==0) while(RB0);
}
}
}
void init()
{
TRISC=0;
TRISD=0;
PORTD=0;
LCD_write_command(0x38);//设置格式
LCD_write_command(0x0c);//整体显示关光标不闪烁?
LCD_write_command(0x06);//设置输入方式,增量不够移位?
LCD_write_command(0x01);//清屏?
OPTION_REG=0X07;//设置预分为1:256
INTCON=0Xa0;//开启TMR0中断
TMR0=57;//TMR0寄存器预存57
}
void interrupt time0()//中断
{
T0IF=0;
TMR0=57;
num++;
}
void LCD_write_data(uchar dat)
{
RS=1;
RW=0;
PORTD=dat;
E=1;
E=0;
delay(10);
}
void LCD_write_command(uchar dat)
{
RS=0;
RW=0;
PORTD=dat;
E=1;
E=0;
delay(10);
}
void LCD_disp_char(uchar x,uchar y,uchar dat) {
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
void delay(uint x)
{
int a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}。

相关主题