×
单片机 > 单片机程序设计 > 详情

1602 时钟

发布时间:2025-09-17 发布时间:
|

//////////////////时钟/////////////////////
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit rs=P2^0; 
sbit rw=P2^1;
sbit e=P2^2;
#define lcd_port P0
#define begin_pos 2
uchar ss,mm,hh,n;
void delayms(uchar ms)
{       // 延时子程序
 uchar i,j;
 for(;ms>0;ms--)
  for(i=6;i>0;i--)
   for(j=82;j>0;j--);
}
bit lcd_bz()
{       // 测试LCD忙碌状态
 bit result;
 rs=0;
 rw=1;
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result=(bit)(P0&0x80);
 e=0;
 return result; 
}

void lcd_w_cmd(uchar cmd)
{       // 写入指令数据到LCD
 while(lcd_bz());
 rs=0;
 rw=0;
 e=0;
 _nop_();
 _nop_(); 
 lcd_port=cmd;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=0;  
}

void lcd_pos(uchar pos)
{       //设定显示位置
 lcd_w_cmd(pos|0x80);
}

void lcd_w_dat(uchar dat) 
{       //写入字符显示数据到LCD
 while(lcd_bz());
 rs=1;
 rw=0;
 e=0;
 lcd_port=dat;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 e=0; 
}
void lcd_init() //LCD初始化设定

   lcd_w_cmd(0x01);   //清屏并光标复位
 delayms(1);     
 lcd_w_cmd(0x38);   //设置式:8位2行5x7点阵显示模
 delayms(1);
 lcd_w_cmd(0x0c);   //显示器开、光标关且光标不允许闪烁
 delayms(1);
 lcd_w_cmd(0x06);   //文字不动,光标自动右移
 delayms(1);
}
void lcd_w_str(uchar *str)
{
 while(*str>0)
 {
  lcd_w_dat(*str);
  str++;
 }
}
void display()
{
 lcd_pos(4+begin_pos);//显示小时
 delayms(1);
 lcd_w_dat(hh/10+0x30);
 delayms(1);
 lcd_w_dat(hh%10+0x30);
 delayms(1);
 lcd_pos(7+begin_pos);//显示分钟
 delayms(1);
 lcd_w_dat(mm/10+0x30);
 delayms(1);
 lcd_w_dat(mm%10+0x30);
 delayms(1);
 lcd_pos(0x0a+begin_pos);//显示秒钟
 delayms(1);
 lcd_w_dat(ss/10+0x30);
 delayms(1);
 lcd_w_dat(ss%10+0x30);
}
void main()
{
 TMOD=0X01;
 IE=0X82;
 TL0=-50000%256;
 TH0=-50000/256;
 TR0=1;
 lcd_init();
 delayms(10);
 lcd_pos(6+begin_pos);//显示:
 delayms(1);
 lcd_w_str(":");
 delayms(1);
 lcd_pos(9+begin_pos);//显示:
 delayms(1);
 lcd_w_str(":");
 display();
 delayms(10);
   lcd_pos(begin_pos-1);        //
 lcd_w_str("TIME");
   while(1)
   {
  display();
  delayms(20);
 }
}
void t0() interrupt 1
{
 TL0=-50000%256;
 TH0=-50000/256;
 n++;
 if(!(n%10))
 {
  lcd_pos(6+begin_pos);//让 :不显示
  delayms(1);
  lcd_w_dat(0X20);
  delayms(1);
  lcd_pos(9+begin_pos);//让 :不显示
  delayms(1);
  lcd_w_dat(0X20);
 }
 if(!(n%20))
 {
  ss++;
  if(ss==60)ss=0,mm++;
  if(mm==60)mm=0,hh++;
  if(hh==24)hh=0;
  lcd_pos(6+begin_pos);//让 :显示
  delayms(1);
  lcd_w_str(":");
  delayms(1);
  lcd_pos(9+begin_pos);//让 :显示
  delayms(2);
  lcd_w_str(":");
 }
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中使用long long 型的数据以及数据的转换