#include <pic.h>
#define uchar unsigned char
#define uint unsigned long int
#define RS RB4
#define E RE2
#define UPKEY RB1
#define DOWNKEY RB2
#define CLRKEY RB5
uchar table[]=" 000:000:000 ";
uchar ys,count,TMR1_H,TMR1_L;
uint ms1=0,ms2=0,sec1=0,sec2=0,us=0;
void init_pic()
{
TRISB=0X00;
TRISD=0X00;
TRISE=0x00;
GIE=1;
PEIE=1;
TMR1IE=1;
TMR1IF=0;
//TMR1H=0Xfe;
//TMR1L=0X70; //0.1ms
//T1CON=0X01;
}
//**********延时函数*************/
void delay_a(uchar z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/********************************************************************
|* 函 数 名: write_command(uchar tempdata) *|
|* 功能描述: 将数据码写入LCD数据寄存器 *|
********************************************************************/
void write_command(uchar tempdata)
{
RS=0; //RS=0/RW=0 时写指令;
for(ys=10;ys>0;ys--);//)
PORTD=tempdata;
for(ys=10;ys>0;ys--);//
E=1;
for(ys=10;ys>0;ys--);//
E=0;
}
/********************************************************************
|* 函 数 名: void write_data(uchar tempdata) *|
|* 功能描述: 写LCD1602使能程序 *|
********************************************************************/
void write_data(uchar tempdata)
{
RS=1; //RS=1/RW=0 时写数据;
for(ys=10;ys>0;ys--);//delay_a(5);
PORTD=tempdata;
for(ys=10;ys>0;ys--);//delay_a(5);
E=1;
for(ys=10;ys>0;ys--);//delay_a(5);
E=0;
}
void init_LCD(void)
{
write_command(0x38); // lcd为两行显示8位数据线有效
write_command(0x0c); // 显示字符 关闭光标
write_command(0x06); // 输入方式设置 光标向右移动一位 ac-1
write_command(0x01);
write_command(0x80);//第一行显示
}
void write_ms(uchar add,uchar date) //*定义ms显示位置*/
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_command(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_us(uchar add,uint data)//us
{ uchar a;
a=(data*100)/100;
write_command(0x80+add);
write_data(0x30+a);
}
void zifu_disp()
{
uchar i;
write_command(0x80);//第1行第1列:(0x00------0x0F)+0x80;
for(i=0;i<15;i++)
{
write_data(table
);
delay_a(5);
}
}
//*************主函数*******************/
void main()
{
init_pic();
init_LCD();
zifu_disp();
while(1)
{ if(UPKEY==1)
{ delay_a(5);
if(UPKEY==1)
{
TMR1_H=0xfe;
TMR1_L=0x70;
T1CON=0x01;
while(UPKEY==1);
}
}
if(DOWNKEY==0)
{ delay_a(5);
if(DOWNKEY==0)
{
TMR1ON=0;
while(DOWNKEY==0);
}
}
write_us(2, sec2);
write_ms(3,sec1);
write_us(6, ms2);
write_ms(7, ms1);
write_us(10,us);
}
}
//********中断服务子程序**************
void interrupt time(void)
{
TMR1H=TMR1_H;
TMR1L=TMR1_L;
TMR1IF=0;
us++;
if(us==9)
{
ms1++;
us=0;
if(ms1==100)
{ ms2++;
ms1=0;
if(ms2==10)
{ sec1++;
ms2=0;
if(sec1==100)
{ sec2++;
sec1=0;
}
}
}
}
}
我在进行调试时,发现按下UPKEY后可以计时,按下DOWNKEY健后计时停止。但是问题也出现了,之后按下那个键都没有反应了?我想做的是重新按下UPKEY键后重新在开始计时,请各位帮帮忙!
此帖出自小平头技术问答
一周热门 更多>