我在做一个定时器,想要用lcd显示秒、毫秒、微秒。秒和毫秒都是3位显示,精确到0.1ms,在进行各个显示的时候,在微秒进位到秒的时候,显示到256后就自动清零了并且一直没有进位,如果小于256就没有问题,毫秒就会像秒进位。部分程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
#define RS RB4
#define E RE2
uchar table[]=" 000:000:000 ";
uchar ys,count;
uint sec=0,ms=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--);//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 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)
{
uchar num;
write_command(0x38); // lcd为两行显示8位数据线有效
write_command(0x0c); // 显示字符 关闭光标
write_command(0x06); // 输入方式设置 光标向右移动一位 ac-1
write_command(0x01);
write_command(0x80);//第一行显示
}
void write_sfm(uchar add,uchar date) //*定义变量数字显示位置*/
{
uchar bai,shi,ge;
bai=date/100;
shi=(date%100)/10;
ge=date%10;
write_command(0x80+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void zifu_disp()
{
uchar i;
write_command(0x80);
for(i=0;i<15;i++)
{
write_data(table);
delay_a(5);
}
}
//********中断服务子程序**************
void interrupt time(void)
{
TMR1H=0xfe;
TMR1L=0x70;
TMR1IF=0;
count++;
}
//*************主函数*******************/
void main()
{
init_pic();
init_LCD();
zifu_disp();
while(1)
{
if(count==1)
{ us++;
count=0;
if(us==9)
{
ms++;
us=0;
if(ms==999)//一到256就清零了 ?
{
sec++;
ms=0;
write_sfm(2, sec);
}
write_sfm(6, ms);
}
write_sfm(10,us);
}
}
}