void display_time() { Write_com(0x80); // 光标移动到第一行第一列 Write_dat('T'); Write_dat('i'); Write_dat('m'); Write_dat('e'); Write_dat(':'); Write_dat(hour / 10 + '0'); Write_dat(hour % 10 + '0'); Write_dat(':'); Write_dat(min / 10 + '0'); Write_dat(min % 10 + '0'); Write_dat(':'); Write_dat(sec / 10 + '0'); Write_dat(sec % 10 + '0');代码解释
时间: 2024-03-29 10:39:20 浏览: 48
这是一段显示时间的函数,使用了LCD显示屏,具体解释如下:
1. `Write_com(0x80);` 光标移动到LCD显示屏的第一行第一列,因为LCD显示屏是以行列的方式显示字符,0x80是显示屏地址的偏移量,0x80表示第一行第一列的地址。
2. `Write_dat('T'); Write_dat('i'); Write_dat('m'); Write_dat('e'); Write_dat(':');` 在LCD显示屏上依次显示 "Time:",这些字符将会显示在第一行第一列之后。
3. `Write_dat(hour / 10 + '0'); Write_dat(hour % 10 + '0');` 显示小时数,先将小时数除以10取整数部分,再加上字符'0',得到十位数的字符表示;然后将小时数对10取余数,再加上字符'0',得到个位数的字符表示。
4. `Write_dat(min / 10 + '0'); Write_dat(min % 10 + '0');` 显示分钟数,同上。
5. `Write_dat(sec / 10 + '0'); Write_dat(sec % 10 + '0');` 显示秒数,同上。
这样,LCD显示屏上就会按照 "Time:HH:MM:SS" 的格式显示当前时间。
相关问题
用52单片机在液晶显示屏上第一行显示“02070123HULIN”的代码
下面是使用51单片机在1602液晶显示屏上第一行显示“02070123HULIN”的代码:
```c
#include <reg52.h>
#define LCD_DB P0
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
void lcd_delay(unsigned int i)
{
while(i--);
}
void lcd_write_cmd(unsigned char cmd)
{
RS = 0;
RW = 0;
LCD_DB = cmd;
EN = 1;
lcd_delay(5);
EN = 0;
}
void lcd_write_data(unsigned char dat)
{
RS = 1;
RW = 0;
LCD_DB = dat;
EN = 1;
lcd_delay(5);
EN = 0;
}
void lcd_init(void)
{
lcd_write_cmd(0x38); // 16x2显示,5x7点阵,8位数据接口
lcd_write_cmd(0x0C); // 显示开,不显示光标,不闪烁
lcd_write_cmd(0x06); // 光标右移,字符不移动
lcd_write_cmd(0x01); // 显示清屏
}
void lcd_display_string(unsigned char x, unsigned char y, unsigned char *s)
{
unsigned char i;
if(x < 16)
{
if(y == 0)
{
lcd_write_cmd(0x80 + x);
}
else
{
lcd_write_cmd(0xC0 + x);
}
}
i = 0;
while(s[i] != '\0')
{
lcd_write_data(s[i]);
i++;
}
}
void main(void)
{
lcd_init();
lcd_display_string(0, 0, "02070123HULIN");
while(1);
}
```
由于液晶显示屏的接口可能会有所不同,以上代码可能需要根据具体情况进行一些修改。
万年历_单片机万年历_LED1602_ds1302的代码
以下是基于单片机、LED1602和DS1302的万年历代码,你可以参考一下:
```c
#include <reg52.h> //头文件,引用51单片机的寄存器定义
sbit SCL=P3^6; //定义DS1302通信引脚
sbit SDA=P3^4;
sbit RST=P3^5;
void delay_us(unsigned char i) //延时函数,i为延时时间
{
while(i--);
}
void delay_ms(unsigned int i)
{
unsigned char j,k;
for(k=0;k<i;k++)
for(j=0;j<120;j++);
}
void ds1302_writebyte(unsigned char dat) //向DS1302写入一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&0x01; //先送最低位
dat>>=1; //右移一位,将次低位变为最低位
SCL=0; //拉低时钟线
delay_us(1); //延时1us
SCL=1; //拉高时钟线
delay_us(1);
}
}
unsigned char ds1302_readbyte() //从DS1302读取一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
SCL=0;
delay_us(1);
if(SDA) //如果数据线为高电平,dat的最高位为1
dat|=0x80;
SCL=1;
delay_us(1);
}
return dat;
}
void ds1302_write(unsigned char addr,unsigned char dat) //向DS1302写入一个字节
{
RST=0;
delay_us(2);
RST=1;
ds1302_writebyte(addr);
ds1302_writebyte(dat);
RST=0;
}
unsigned char ds1302_read(unsigned char addr) //从DS1302读取一个字节
{
unsigned char dat;
RST=0;
delay_us(2);
RST=1;
ds1302_writebyte(addr);
dat=ds1302_readbyte();
RST=0;
return dat;
}
void init_ds1302() //初始化DS1302
{
ds1302_write(0x8e,0x00); //关闭写保护
ds1302_write(0x80,0x01); //控制寄存器,禁止写保护
ds1302_write(0x81,0x00); //秒归零
ds1302_write(0x84,0x00); //日归零
ds1302_write(0x8e,0x80); //打开写保护
}
void lcd_write_cmd(unsigned char cmd) //向LCD发送指令
{
P2=cmd;
P1&=0xf8;
P1|=0x04;
delay_ms(1);
P1&=0xfb;
delay_ms(1);
}
void lcd_write_data(unsigned char dat) //向LCD发送数据
{
P2=dat;
P1&=0xf8;
P1|=0x05;
delay_ms(1);
P1&=0xfb;
delay_ms(1);
}
void lcd_init() //LCD初始化
{
lcd_write_cmd(0x38); //设置8位数据总线,2行显示,5x7点阵字符
lcd_write_cmd(0x0c); //显示器开,光标关,光标移动关
lcd_write_cmd(0x06); //字符输入时,光标右移,整屏不移
lcd_write_cmd(0x01); //清屏
}
void lcd_display(unsigned char *p) //显示字符函数
{
unsigned char i;
lcd_write_cmd(0x80);
for(i=0;i<16;i++)
{
if(*p=='\0')
break;
lcd_write_data(*p++);
}
lcd_write_cmd(0x80+0x40);
for(i=0;i<16;i++)
{
if(*p=='\0')
break;
lcd_write_data(*p++);
}
}
void main()
{
unsigned char date[17];
unsigned char year,month,day,week,hour,minute,second;
lcd_init();
init_ds1302();
while(1)
{
second=ds1302_read(0x81); //读取秒
minute=ds1302_read(0x83); //读取分
hour=ds1302_read(0x85); //读取时
week=ds1302_read(0x86); //读取星期
day=ds1302_read(0x87); //读取日
month=ds1302_read(0x88); //读取月
year=ds1302_read(0x89); //读取年
date[0]=(year/10)+'0'; //转换为字符
date[1]=(year%10)+'0';
date[2]='-';
date[3]=(month/10)+'0';
date[4]=(month%10)+'0';
date[5]='-';
date[6]=(day/10)+'0';
date[7]=(day%10)+'0';
date[8]=' ';
date[9]=(week%10)+'0';
date[10]=' ';
date[11]=(hour/10)+'0';
date[12]=(hour%10)+'0';
date[13]=':';
date[14]=(minute/10)+'0';
date[15]=(minute%10)+'0';
date[16]='\0';
lcd_display(date); //显示日期时间
}
}
```
注意:以上代码只是一个简单的示例,真实的万年历代码要根据需要进行修改和完善。