rt1602的相关资料
for(y=110;y>0;y--);引脚说明:
1602引脚图 161的引脚图
1602引脚图 161的引脚图
第1脚:GND 为地电源;
第2脚:VDD 接5V 正电源;
第3脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度,对比度过高时会产生“影”,使用时可以通一个10K 的电位器调整对比度;
第4脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;
第5脚:RW 为读写信号线,高电平时进行读作,低电平时进行写作。当RS和RW 共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据;
第6脚:EN 端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令;
第7~14脚:D0~D7 为8位双向数据线;
第15~16脚:空脚。
字符表:
基本控制:
指令1:清显示,指令码01H,光标复位到地址00H位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符
指令7:字符发生器RAM地址设置
指令8case 2:write_1602dat('T');//星期数据为二时显示:DDRAM地址设置
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据
RT-1602的内部显示地址:
RT-1602液晶显示模块和单片机AT89C51交互
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是RT-1602的内部显示地址.
比如第二行个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行个字符的位置呢?这样不行,因为写入显示地址时要求位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
以下是在液晶模块的第二行个字符的位置显示字母“A”的程序:
ORG 0000H
RS EQU P3.7;确定具体硬件的连接方式
RW EQU P3.6 ;确定具体硬件的连接方式
E EQU P3.5 ;确定具体硬件的连接方式
MOV P1,#00000001B ;清屏并光标复位
ACALL ENABLE;调用写入命令子程序
MOV P1,#00111000B ;设置显示模式:8位2行5x7点阵
AC{uchar i,j=0;ALL ENABLE ;调用写入命令子程序
MOV P1,#00001111B ;显示器开、光标开、光标允许闪烁
ACALL ENABLE ;调用写入命令子程序
MOV P1,#00000110B ;文字不动,光标自动右移
ACALL ENABLE ;调用写入命令子程序
MOV P1,#0C0H ;写入显示起始地址(第二行个位置)
ACALL ENABLE ;调用写入命令子程序
MOV P1,#01000001B ;字母A的代码
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
AJMP $
ENABLE:
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
DELAY:
MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,DELAY ;如果P1.7为高电平表示忙就循环等待
END
程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,输入要显示的字符A的代码41H。
基于单片机的热水器温度控制系统
EN=0;东华理工大学毕业设计(论文)
摘 要rw=0; //读写选择 置为写
温度是日常生活中不可缺少的物理量,温度在各个领域都有积极的意义。很多行业中以及日常生活中都有大量的用电加热设备,如用于加热处理的加热热水器,用于洗浴的电热水器及各种不同用途的温度箱等,采用单片机对它们进行控制具有控制方便、简单、灵活性大等特点,而且还可以大幅提高被控系统的性能,从而能被大大提高产品的质量。因此,智能化温度控制技术正被广泛地应用。
本温度设计采用现在流行的AT89C51单片机为,用PID控制方法,再配以其他电路对热水器的水温进行控制。
:89C51; PID; 温度控制
I1/41页
东华理工大学毕业设计(论文)
ABSTRACT
Temperature is essential physical in daily life ,and in various fields has itive implications.A lot of businesses and daily lives he a lot of electric heating equipment.Such as electric water heater for bathing and variety of different uses of the temperature boxes. MCU to control them with easy to control,,flexibility and other characteristics,als外部引脚发生负跳变,捕获的数值会存入RCAP2L和RCAP2H中,并向CPU申请中断。o can significantly improve the performance of the controlled ,which can be greatly improved product quality. Therefore,int temperature control technology is being widely used.
The temperature control design uses the now popular AT89C51 MCU controller,with PID control mod, which toger with
求教一个51单片机程序。。(LCD电子时钟)
write_1302(0x8e,0x00);//允许写,禁止写保护#include
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的与 C51 之间的引脚连接定义
it rs=P2^5;
it en=P2^7;
it rw=P2^6;//如果硬件上 rw 接地,就不用写这句和后面的 rw=0
//DS1302 时钟芯片与 C51 之间的引脚连接定义
it IO=P3^6;
it SCLK=P3^5;
it RST=P3^7;
it ACC0=ACC^0;
it ACC7=ACC^7;//校时按键与 C51 的引脚连接定义
it key1=P3^2;//设置键
it key2=P3^3;//加键
it key3=P3^4;//减键
uchar code tab1[]={"20//////////"};//年显示的固定字符
uchar code tab2[]={"LOVE ::::::"};//时间显示的固定字符
//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
for(x=xms;x>0;x--)
}/液晶写入指令函数与写入数据函数,以后可调用/
write_1602com(uchar com) //液晶写入指令函数
{rs=0; //数据/指令选择置为指令
P0=com; //送入数据
delay(1);
en=1; //拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;
//en 由高变低,产生下降沿,液晶执行命令
}write_1602dat(uchar dat) //液晶写入数据函数
{rs=1; //数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat; //送入数据
delay(1);
delay(1);
en=0; //en 由高变低,产生下降沿,液晶执行命令
}lcd_init() //液晶初始化函数//
{write_1602com(0x38); //设置液晶工作模式,意思:162 行显示,57 点阵,8 位数据
write_1602com(0x0c); //开显示不显示光标
write_1602com(0x06); //整屏不移动,光标自动右移
write_1602com(0x01); //清显示
write_1602com(yh+1); //日历显示固定符号从行第 1 个位置之后开始显示
for(a=0;a<14;a++)
{write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分
}write_1602com(er+1);//时间显示固定符号写入位置,从第 2 个位置后开始显示
for(a=0;a<12;a++)
{write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
/DS1302 有关子函数/
void write_byte(uchar dat)//写一个字节
{ACC=dat;
RST=1;
for(a=8;a>0;a--)
{IO=ACC0;//相当于汇编中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
uchar read_byte() //读一个字节
{RST=1;
for(a=8;a>0;a--)
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}return (ACC);
}//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 芯片写函数,指定写入地址,数据
{RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}uchar read_1302(uchar add) //从 1302 读数据函数,指定读取数据来源地址
{uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal10+(bcd&=0x0F));
}//--------------------------------------//
void ds1302_init()//1302 芯片初始化子函数(2010-01-07,12:00:00,week4)
{RST=0;
SCLK=0;
write_1302(0x8e,0x80);//打开写保护
}//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向 LCD 写时分秒,有显示位置加、现示数据,两个参数
{uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er 是头文件规定的值 0x80+0x40
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向 LCD 写年月日,有显示位置加数、显示数据,两个参数
{uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为个位置+add
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}void write_week(uchar week)//写星期函数
{write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{case 1:write_1602dat('M');//星期数为一时,显示
write_1602dat('o');
write_1602dat('n');break;
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期数据为三时显示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期数据为四是显示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期数据为五时显示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期数据为六时显示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期数据为日时显示
write_1602dat('u');
write_1602dat('n');break;
//键盘扫描有关函数
void keyscan()
{if(key1==0)//key1 为功能键(设置键)
{delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8 个功能循环
switch(key1n)
{case 1:TR0=0;//关闭定时器
write_1602com(er+0x0E);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/1016+(miao)%10;//秒数据写入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置显示光标
case 3:write_1602com(er+8);//按动 3 次,shi
case 4:write_1602com(yh+0x0e);//按动 4 次,week
case 5:write_1602com(yh+0x0a);//按动 5 次,ri
case 6:write_1602com(yh+0x07);//按动 6 次,yue
case 7:write_1602com(yh+0x04);//按动 7 次,nian
case 8:write_1602com(0x0c);//按动到第 8 次,设置光标不闪烁
TR0=1;//打开定时器
TR0=1;
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 数据写入 DS1302
write_1302(0x8e,0x80);break;
}//------------------------------加键 key2----------------------------//
{if(key2==0)//上调键
{delay(10);
if(key2==0)
{delay(20);
while(!key2);
switch(key1n)
{case 1:miao++;//设置键按动 1 次,调秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
case 2:fen++;
if(fen==60)
write_sfm(0x0A,fen);
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
case 3:shi++;
shi=0;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
}//------------------减键 key3,各句功能参照'加键'注释---------------
if(key3==0)
{delay(10);
if(key3==0)
{delay(20);
while(!key3);
switch(key1n)
{case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
case 4:week--;
if(week==0)
week=7;
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;//十进制转换成 DS1302 要求的 DCB 码
write_1302(0x86,temp);//向 DS1302 内写日期寄存器 86H 写入调整后的日期数据 BCD 码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向 DS1302 内写月份寄存器 88H 写入调整后的月份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+7); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向 DS1302 内写年份寄存器 8cH 写入调整后的年份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+4); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
}void init()
//定时器、计数器设置函数
{TMOD=0x11;
//指定定时/计数器的工作方式为 3
//定时器 T0 的高四位=0
TL0=0;
//定时器 T0 的低四位=0
EA=1;
//系统允许有开放的中断
ET0=1;
//允许 T0 中断
TR0=1;
//开启中断,启动定时器
}//主函数
{lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用 DS1302 时钟的初始化子函数
init(); //调用定时计数器的设置子函数
delay(80);
while(1)
//无限循环下面的语句:
//调用键盘扫描子函数
void timer0() interrupt 1 //取得并显示日历和时间
{ //读取秒时分周日月年七个数据(DS1302 的读寄存器与写寄存器不一样)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//显示秒、时、分数据:
write_sfm(13,miao); //秒,从第二行第 8 个字后开始显示(调用时分秒显示子函数)
write_sfm(10,fen); //分,从第二行第 5 个字符后开始显示
write_sfm(7,shi); //小时,从第二行第 2 个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri); //日期,从第二行第 9 个字符后开始显示
write_nyr(6,yue); //月份,从第二行第 6 个字符后开始显示
write_nyr(3,nian); //年,从第二行第 3 个字符后开始显示
write_week(week);
}
QC1602A可以插在LCD1602口上吗?他们两个液晶屏有什么区别(51单片机)单片机
if(shi==24)这个你看看板子的原理图,看1602模块的预留{uint x,y;接口说明,
和屏幕的引脚对一下(一般DS1302_Write((DataBuf[i]&0xf)16+(DataBuf[i+1]&0xf));液晶模块的PCB板上都写明了每个引脚的名称)。
不同开发板和不同厂家的液晶模块引脚排序都有些区别的。
如果直插能对上就了
使用STC12C5A16S2单片机,1602液晶和GPS接收模块怎么做个系统,要求把经纬度显示在液晶上
哥们,你的1602显示程序,在12系列单片机上显示正常吗?我的90系列单片机显示正常,换一个单片机就不行了。我qq307561694,汗~~u接口,那个是pc用的吧。。一般的嵌入式使用的是串行通信,u总线使用起来比较复杂。协议复杂,还需要专用的u控制芯片的。你这个单片机。我猜也没有u吧。建议退掉模块,换break;一个串行的。那个直接就可以读取坐标了。
}}USB接口的GPS模块是不行的,要TTL接口的。GPS模块的RX/TX接到单片机的TX/RX引脚上,然后再解析GPS输出的NMEA语句,将解析出的坐标发送到液晶上显示。
51单片机如何在1602液晶屏上显示一个字母?
void main()#include
it lcden=P1^0;
it lcdrw=P1^2;
void delay(unsigned int z)
{unsigned int x,y;
}void write_com(unsigned char com)
{lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lTimeBuf[3]=n/10+0x30;cden=0;
}void write_data(unsigned char date)
{lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}void init()
{lcdrw=0;
lcden=0;
n=0;write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
}void main()
{init();
write_data('a');
while(1);
}最简单的了
刚好学到1602,这里有
我用普中的单片机开发板做液晶1602的实验显示不出来,求助各位高手帮帮忙解答。 电路图和代码如下。
//调延时,消抖动你把 while(1);放到主函数开始,DataBuf[0]=DS1302_Read();然后再调试,从你程序上看,就算你前面是对的,等主函数执行完后,关闭液晶显示后,就停留在 while(1);里面,也就不会显示什么内容了。
RET51单片机,1602液晶和矩阵键盘的P口冲突
if(key1n!=0)//当 key1 按下以下。再按以下键才有效(按键次数不等于零{keyscan();)应该不会冲突吧,我记得我作过这样的实验没出现问题
{uchar i,m,n;1602是静态显示器件,不需要反复刷新,.所以大部分时间其接口是不被占用的,并且lcdenWR RD和rs对LCD来说都是输入的,说明LCD不会主动乾扰你的其它工作
按键扫描倒是有可能乾扰LCD工作,但按键扫描也是在你控制下进行的,有时虽会改变LCD这几种功能引脚的状态,但不见得你的作时序就符合LCD的时序,数据可能就无法写入,退一步即使写入了数据,也可能是无效数据
不过我作键盤实验时发现一个问题,就是4个按键可乾扰矩阵键盤的工作,按下按键也可识别成矩阵按键的某个值,也不算什麼大问题,你不去按这几个键就行了,也有解决办法,按键扫描时把P3口的4个输入和4个输出功能对调一下就可以了
单片机中T2EX什么意思 为什么与1602液晶显示屏引脚5连接
break;52单片机的T2扩展口T2EX具有捕获功能,可以准确的测量出脉冲宽度和周期。
望采for(i=0;iAT89C52+DS1302单片机万年历程序
TH0=0;参考程序,可以调节时间,设置闹钟,音乐闹铃
#include
#include
//
#define uchar unsigned char
#define uint unsigned int
#define TIME (0X10000-50000)
#define FLAG 0XEF //闹钟标志
//
//引脚连接图
it CLK=P1^2;
it RST=P1^4;
it DAT=P1^3;
it RS=P1^5;
it RW=P1^6;
it E=P1^7;
it P32=P3^2;
it KEY1 = P2^7;
it KEY2 = P2^6;
it KEY3 = P2^5;
it KEY4 = P2^4;
it ACC_7=ACC^7;
//
//全局变量及常量定义
uchar i=20,j;
uchar DataBuf[16] = {};//日期
uchar TimeBuf[16] = {};//时间
uchar alarm[2],time[3];
uchar code Day[]={31,28,31,30,31,30,31,31,30,31,30,31};//12个月的日期(非闰年)
//闰年月星期表
const unsigned char WeekTab[] = {
(3 << 5) + 31,///1月
(6 << 5) + 29,///2月
(0 << 5) + 31,///3月
(3 << 5) + 30,///4月
(5 << 5) + 31,//5月
(1 << 5) + 30,//6月
(3 << 5) + 31,//7月
(6 << 5) + 31,//8月
(1 << 5) + 30,//9月
(4 << 5) + 31,//10月
(0 << 5) + 30,//11月
(2 << 5) + 31 //12月
};
//音律表
uint code table1[]={64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178,65217};
//发声部分的延时时间
uchar code table2[]={0x82,1,0x81,0xf4,0xd4,0xb4,0xa4,
0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0};
//闹钟中用的全局变量
uchar th1,tl1;
//
//延时1ms函数
delay1ms(uchar time)
{uchar i,j;
for(i=0;i