|
楼主 |
发表于 2020-10-17 15:36:09
|
显示全部楼层
#include"reg52.h"
#include"lcd.h"
#define uchar unsigned char //宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
#define uint unsigned int //宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
uchar count; //count为定时器0中断次数变量
uchar receiveData[6]; //用于存储临时值
uchar shi=13,fen=20,miao=20; //未做时间修改的计时时钟、分钟、秒钟变量
uchar secondge,secondshi; //秒钟个位、十位的变量
uchar minutange,minutanshi; //分钟个位、十位的变量
uchar hourge,hourshi; //时钟个位、十位的变量
uchar table0[]="LBJ"; //LCD1602第一行初始显示
uchar table1[]="13:20:20"; //LCD1602第二行初始显示
void Delay(uint i)
{
while(i--);
}
void Timer0Init() //定时器0初始化函数
{
TMOD=0X01;
TH0=0XFC;
TL0=0X18; //1ms
TR0=1;
ET0=1;
EA=1;
}
void UsartInit()
{
TMOD=0X20; //设置计数器工作方式2
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
PCON=0X80; //波特率加倍
TR1=1; //打开计数器
SCON=0X50; //设置为工作方式1
ES=1; //打开接收中断
EA=1; //打开总中断
}
void LCD1602Display() //LCD1602字符型液晶显示器显示函数
{
uchar j; //用于存储临时值
LcdWriteCom(0x80+0x00); //LCD1602字符型液晶显示器第一行第一个位置显示
for(j=0;j<3;j++) //有3个字符,要循环3次。
{
LcdWriteData(table0[j]); //显示字符串
Delay(100);
}
LcdWriteCom(0x80+0x40); //LCD1602字符型液晶显示器第二行第一个位置显示
for(j=0;j<8;j++) //有8个字符,要循环8次。
{
LcdWriteData(table1[j]); //显示字符串
Delay(100);
}
}
void LCD1602DisplayTime(uchar address,uchar num) //LCD1602显示时间两位数分解函数
{
uchar shi,ge; //十位、个位的变量
shi=num/10; //十位数
ge=num%10; //个位数
LcdWriteCom(0x80+0x40+address); //LCD1602字符型液晶显示器第二行某个显示位
LcdWriteData(0x30+shi); //0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
LcdWriteData(0x30+ge); //0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
}
void LCD1602DisplayGeDigitResolve(uchar address,uchar num) //LCD1602字符型液晶显示器显示修改时间个位数分解函数
{
uchar ge; //个位的变量
ge=num%10; //个位数
LcdWriteCom(0x80+0x40+address); //LCD1602字符型液晶显示器第二行某个显示位
LcdWriteData(0x30+ge); //0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
}
void LCD1602DisplayShiDigitResolve(uchar address,uchar num) //LCD1602字符型液晶显示器修改时间十位数分解函数
{
uchar shi; //十位变量
shi=num%10; //十位数
LcdWriteCom(0x80+0x40+address); //LCD1602字符型液晶显示器第二行某个显示位
LcdWriteData(0x30+shi); //0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
}
void main()//主函数
{
LcdInit(); //Lcd清屏
UsartInit(); //串口初始化
Timer0Init(); //定时器0初始化函数
LCD1602Display(); //LCD1602字符型液晶显示器显示函数
while(1);
// LcdWriteCom(0x80+0x40); //显示在第二行
// LcdWriteData(receiveData); //将获取到的数据显示在lcd上
}
void Timer0() interrupt 1 //定时器0中断函数
{
TH0=(65536-50000)/256; //TH0重新装值
TL0=(65536-50000)%256; //TL0重新装值
count++; //定时器0中断次数先赋值再加
if(count==18) //判断定时器0中断次数是否为18次
{
count=0;//定时器0中断次数归零
miao++;//秒钟先赋值再加
if(miao==60)//判断秒钟是否达到60秒
{
miao=0;//秒钟归零
fen++;//分钟先赋值再加
if(fen==60)//判断分钟是否达到60分
{
fen=0;//分钟归零
shi++;//时钟先赋值再加
if(shi==24)//判断时钟是否达到24时
{
shi=0;//时钟归零
}
LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
}
LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
}
LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数
}
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Usart() interrupt 4
{
receiveData[6]=SBUF; //读取缓冲区数据
RI=0;
SBUF=receiveData[6];
while(!TI);
TI=0;
} |
|