求基于89C51单片机的秒表设计,用LCD1602显示

2025-04-03 14:13:44
推荐回答(1个)
回答1:

#include

#include "INTRINS.H"

#define u8 unsigned char

#define u16 unsigned int

#define LCD_DATE P0

sbit lcd_rs = P1^6;

sbit lcd_en = P1^7 ;

sbit k=P1^0; //按键

u16 js=0; //计时

void delay(u16 i)

{

while(i--);

}

/************************************液晶写命

令************************************/

void lcd_write_com( u8 com )

{

lcd_rs = 0 ;

lcd_en = 0 ;

LCD_DATE = com ;

lcd_en = 1 ;

delay( 20 ) ;

lcd_en = 0 ;

delay( 100 ) ;

}

/************************************液晶写数据************************************/

void lcd_write_dat(u8 dat)

{

lcd_rs = 1 ;

lcd_en = 0 ;

LCD_DATE = dat ;

lcd_en = 1 ;

delay( 20 ) ;

lcd_en = 0 ;

delay( 100 ) ;

}

/************************************液晶初始化************************************/

void LCD1602_Init()

{

lcd_write_com( 0x38 ) ; //显示初始化

lcd_write_com( 0x0c ) ; //关闭光标闪烁

lcd_write_com( 0x06 ) ; //开显示,光标位移

lcd_write_com( 0x01 ) ; //清屏

}

void xs1(u8 add,u16 val){

if(add!=0)lcd_write_com( add ) ;

lcd_write_dat( val>9999? val/10000%10+'0':' ' ) ;

lcd_write_dat( val>999?  val/1000%10+'0':' ' ) ;

lcd_write_dat( val/100%10+'0' ) ;

lcd_write_dat( '.') ;

lcd_write_dat( val/10%10+'0' ) ;

lcd_write_dat( (val%10)!=0 ? val%10+'0':' ' ) ;

}

//初始化函数

void InitTimer0()

{

TMOD = 0x01; //定时器0打开

EA = 1; //打开中断总开关

ET0 = 1; //打开中断允许开关

TR0 = 0; //打开定时器定时开关

}

/***********************************/

/*函数名 : 

/*函数功能: 初始化

/*输入参数: 无

/*输出参数: 无

/**********************************/

void InitAll(){

LCD1602_Init();   //液晶的初始化

//定时器初始化

InitTimer0();

}

u8 t=0xff;

//主函数

void main()

{

//初始化

InitAll();

//循环

while(1)   

{

t<<=1;

if(k==1)t|=0x01;

if((t&0x03)==2){ //按键下降沿

if(TR0==0){ //开始计时

TH0 = (65536-10000)/256;

TL0 = (65536-10000)/256;

js=0;

TR0=1;

}

else { //停止

TR0=0;

}

}

xs1(0x80,js); //显示

}

}

void Timer0Interrupt(void) interrupt 1

{

TH0 = (65536-10000)/256;

TL0 = (65536-10000)/256;

if(js<65535)js++;

}