
①问,RS,RW,E 的设置为 读状态时序 的过程,读出来的数据(数据口P1) 的最高位 刚好即为 液晶的 忙碌 标志位。
②问,writecontrol(unsigned condata) 函数 是个 写指令 函数;
③问,空 *** 作 是为了让数据稳定后,才使能 液晶接收数据;
④问,写指令有时间 间隔要求,太频繁的读写会丢码,所以要加延时,三条38指令,是因为安全起见,上电后马上初始化会出现液晶电源不稳而丢码;
⑤问,液晶显示 只在 更新数据 的时候刷新一次即可,液晶会维持内容,无需重复刷新。
⑥附送,③和④问,都是驱动太恶心而造成的结果,好的驱动程序不需如此 *** 作。液晶的时序要求为ns级,单片机的指令周期普遍为us级,根本不需过多累赘。
#include"reg52h" //包含52头文件
#include"SMC1602Ah" //包含SMC1602A宏定义文件
#define BusyReadCount 10 //读忙标志等待次数
#define SMC1602_Data P0 //定义 数据接口
//sbit SMC1602_VO=P2^4; //定义 VO对比度接口
sbit SMC1602_RW=P2^5; //定义 R/W接口25
sbit SMC1602_RS=P2^6; //定义 RS接口26
sbit SMC1602_E=P2^7; //定义 E接口27
#define SMC1602_En SMC1602_E=1 //使能
#define SMC1602_Dis SMC1602_E=0 //禁止
uchar SMC1602_Read(bit read_type) //1602液晶屏读函数
{
uchar read_data;
SMC1602_Dis; //禁止使能
SMC1602_RW=ReadOperate; //读 *** 作
SMC1602_RS=read_type; //读类型:0状态,1数据
SMC1602_En; //开启使能
read_data=SMC1602_Data; //存储结果
SMC1602_Dis; //禁止使能
return read_data; //返回结果
}
void SMC1602_WriteByte(bit write_type,uchar write_data) //1602液晶屏读函数
{
uchar i=BusyReadCount;
for(;i;i--); //延时 *** 作,为写 *** 作预留回复时间
while((SMC1602_Read(CommOperate)&BusyState) &&(++i<=BusyReadCount)); //读取忙标志(BusyReadCount次),若均忙中,则不再读取忙标志,直接执行写 *** 作
//while(SMC1602_Read(CommOperate)&BusyState) if(++i>BusyReadCount) return; //读取忙标志,若BusyReadCount次均忙中,则不进行写 *** 作
//while(SMC1602_Read(CommOperate)&BusyState); //等待空闲(死等)
SMC1602_Dis; //禁止使能
SMC1602_RW=WriteOperate; //写 *** 作
SMC1602_RS=write_type; //写类型:0指令,1数据
SMC1602_Data=write_data; //写 *** 作,将 *** 作数送的数据口
SMC1602_En; //开启使能
SMC1602_Dis; //禁止使能
}
void SMC1602_WriteCGRAM(uchar write_buf,uchar start_loca,uchar word_num,uchar start_addr) //SMC1602写CGRAM函数,用于自定义字符
{
uchar i,j;
write_buf+=start_loca; //指向"需写入数据数组"的起始位置
SMC1602_WriteByte(CommOperate,CGRAMAddr|start_addr<<3); //写CGRAM *** 作,并将CGRAM起始地址设为 start_addr
for(j=0;j<word_num;j++) //自定义字符数量
for(i=0;i<8;i++) SMC1602_WriteByte(DataOperate,write_buf++); //写入一个自定义字符8个字节数据
}
void SMC1602_Init() //1602液晶屏初始化函数
{
uint i;
SMC1602_WriteByte(CommOperate,DisplayMode); //显示模式设置:16×2显示,5×7点阵,8位数据接口
SMC1602_WriteByte(CommOperate,ScreenMode|ScreenOn); //光标模式设置:开启整体显示,开启光标显示,开启光标闪烁
SMC1602_WriteByte(CommOperate,InputMode); //输入方式设置:关闭整屏移动,开启光标正移动(+1)
SMC1602_WriteByte(CommOperate,CleanLCD); //清屏,复位光标
SMC1602_WriteByte(CommOperate,FirstCol); //定位第一行
for(i=150;i;i--); //等待电源稳定,否则写CGRAM数据(自定义字符)时容易丢失,uint执行周期长,用uchar将会缩短时间,不足以稳定LCD
}
#include <reg51h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit DS1302_SDA=P1^0;
sbit DS1302_SCK=P1^1;
sbit DS1302_RST=P1^2;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit BEEP=P3^7;
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar Display_Buffer[]={0x00,0x00,0xbf,0x00,0x00,0xbf,0x00,0x00};
uchar Display_Buffer1[]={0x00,0x00,0xbf,0x00,0x00,0xbf,0x00,0x00};
uchar Bit_CODE[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar Current_Time[7];
uchar alarm_clock[7];
char Flag=0;
char T_OR_A=0;
uchar w=0,u=0,v;
void delay_ms(uint x)
{
uchar i;
while(x--)for(i=0;i<120;i++);
}
void WriteAByteToDS1302(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
DS1302_SDA=x&0x01;
DS1302_SCK=1;
DS1302_SCK=0;
x>>=1;
}
}
uchar GetAByteFromDS1302(void)
{
uchar i,b=0X00,t;
for(i=0;i<8;i++)
{
b>>=1;
t=DS1302_SDA;
b|=t<<7;
DS1302_SCK=1;
DS1302_SCK=0;
}
return (b/1610+b%16);
}
void ResetDS1302(void)
{
DS1302_RST=0;
DS1302_SCK=0;
DS1302_RST=1;
}
uchar ReadData(uchar addr)
{
uchar dat;
ResetDS1302();
WriteAByteToDS1302(addr);
dat=GetAByteFromDS1302();
DS1302_SCK=0;
DS1302_RST=0;
return dat;
}
void WriteDS1302(uchar addr,uchar dat)
{
ResetDS1302();
WriteAByteToDS1302(addr);
WriteAByteToDS1302(dat);
DS1302_SCK=0;
DS1302_RST=0;
}
void SetDS1302(void)
{
uchar i;
WriteDS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
WriteDS1302(0x80+i2,(Current_Time[i]/10<<4)|(Current_Time[i]%10));
}
WriteDS1302(0x8e,0x80);
}
void GetTime(void)
{
uchar i,addr=0x81;
for(i=0;i<7;i++)
{
Current_Time[i]=ReadData(addr);
addr+=2;
}
}
void time0Init(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void ScanKey(void)
{
if(KEY1==0)
{
delay_ms(10);
if(KEY1==0);
{
while(!KEY1);
w=w++;
if(w==5)w=1;
switch(w)
{
case 1:Flag=1;break;
case 2:Flag=1; break;
case 3:Flag=1; break;
case 4:SetDS1302();
Flag=0;
break;
}
}
}
if(w!=0)
{
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
while(!KEY2);
switch(w)
{
case 1:Current_Time[0]++;break;
case 2:Current_Time[1]++;break;
case 3:Current_Time[2]++;break;
}
}
}
if(KEY3==0)
{
delay_ms(10);
if(KEY3==0)
{
while(!KEY3);
switch(w)
{
case 1:Current_Time[0]--;break;
case 2:Current_Time[1]--;break;
case 3:Current_Time[2]--;break;
}
}
}
}
if(KEY4==0)
{
delay_ms(10);
if(KEY4==0)
{
while(!KEY4);
u++;
if(u==5)u=1;
switch(u)
{
case 1:T_OR_A=1;
break;
case 2:break;
case 3:break;
case 4:T_OR_A=0;break;
}
}
}
if(u!=0)
{
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
while(!KEY2);
switch(u)
{
case 1:alarm_clock[0]++;break;
case 2:alarm_clock[1]++;break;
case 3:alarm_clock[2]++;break;
}
}
}
if(KEY3==0)
{
delay_ms(10);
if(KEY3==0)
{
while(!KEY3);
switch(u)
{
case 1:alarm_clock[0]--;break;
case 2:alarm_clock[1]--;break;
case 3:alarm_clock[2]--;break;
}
}
}
}
}
void Play(uchar t)
{
uchar i;
for(i=0;i<100;i++)
{
BEEP = ~BEEP;
delay_ms(t);
}
BEEP = 0;
}
void main(void)
{
//uchar i;
SetDS1302();
time0Init();
//GetTime();
while(1)
{
if(Flag==0)
GetTime();
Display_Buffer[0]=DSY_CODE[Current_Time[2]/10];
Display_Buffer[1]=DSY_CODE[Current_Time[2]%10];
Display_Buffer[3]=DSY_CODE[Current_Time[1]/10];
Display_Buffer[4]=DSY_CODE[Current_Time[1]%10];
Display_Buffer[6]=DSY_CODE[Current_Time[0]/10];
Display_Buffer[7]=DSY_CODE[Current_Time[0]%10];
//Display_Buffer[0]=DSY_CODE[Current_Time[2]/10];
ScanKey();
Display_Buffer1[0]=DSY_CODE[alarm_clock[2]/10];
Display_Buffer1[1]=DSY_CODE[alarm_clock[2]%10];
Display_Buffer1[3]=DSY_CODE[alarm_clock[1]/10];
Display_Buffer1[4]=DSY_CODE[alarm_clock[1]%10];
Display_Buffer1[6]=DSY_CODE[alarm_clock[0]/10];
Display_Buffer1[7]=DSY_CODE[alarm_clock[0]%10];
if((Current_Time[2]==alarm_clock[2])&&(Current_Time[1]==alarm_clock[1])&&(Current_Time[0]==alarm_clock[0]))//闹钟
Play(1);
}
}
void tiemr0() interrupt 1
{
//if(flag1) j++;
uchar i,j;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(T_OR_A==0)
{
for(i=0;i<8;i++)
{
P2=Bit_CODE[i];
P0=Display_Buffer[i];
delay_ms(2);
}
}
else
{
for(j=0;j<8;j++)
{
P2=Bit_CODE[j];
P0=Display_Buffer1[j];
delay_ms(2);
}
}
}
上面是基于DS1302和LED数码管的可调闹钟C语言程序!
参考程序,可以调节时间,设置闹钟,音乐闹铃
#include<reg52h>
#include<INTRINSH>
//
#define uchar unsigned char
#define uint unsigned int
#define TIME (0X10000-50000)
#define FLAG 0XEF //闹钟标志
//
//引脚连接图
sbit CLK=P1^2;
sbit RST=P1^4;
sbit DAT=P1^3;
sbit RS=P1^5;
sbit RW=P1^6;
sbit E=P1^7;
sbit P32=P3^2;
sbit KEY1 = P2^7;
sbit KEY2 = P2^6;
sbit KEY3 = P2^5;
sbit KEY4 = P2^4;
sbit 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<time;i++)
{
for(j=0;j<250;j++);
}
}
//
//LCD控制函数
Enable()
{
RS=0;
RW=0;
E=0;
delay1ms(3);
E=1;
}
//
//LCD1602写入字符函数
LCD1602_WriteSChr(uchar i)
{
P0=i;
RS=1;
RW=0;
E=0;
delay1ms(2);
E=1;
}
//
//LCD1602写入字符串函数
//入口函数
//uchar data address : 写入数据首地址
//ucharm:写入字节数
LCD1602_WriteStr(uchar address,uchar m)
{
uchar i,j;
for(i=0;i<m;i++,address++)
{
j=address;
LCD1602_WriteSChr(j);
}
}
//
//LCD显示
void LCDShow(void)
{
P0=0XC; //显示器开、光标关
Enable();
//P0=0x80; //写入显示起始地址
//Enable();
//LCD1602_WriteStr(DataBuf,16); //写入日期显示缓存
P0=0xc1; //写入显示起始地址
Enable();
LCD1602_WriteStr(TimeBuf,16); //写入时间显示缓存
}
//
//DS1302写入子程序
void DS1302_Write(uchar temp)
{
uchar i;
CLK=0; //将DS1320时钟脉冲拉低
_nop_();//延时一指令周期
RST=1; //RST置高电平
_nop_();//延时一指令周期
for(i=0;i<8;i++) //循环8次
{
DAT=temp&0x01; //向DS1302写入一字节数据
_nop_(); //延时一指令周期
CLK=1; //拉高时钟脉冲
temp>>=1; //右移一位
CLK=0; //拉低时钟脉冲
}
}
//
//DS1302读取子程序
uchar DS1302_Read()
{
uchar i,j=0;
for(i=0;i<8;i++)//循环8次
{
j>>=1; //右移一位
_nop_(); //延时一指令周期
CLK=0; //拉低时钟脉冲
_nop_(); //延时一指令周期
if(DAT) //判断接收该位数据是否为1
j|=0x80;//该位置1
_nop_(); //延时一指令周期
CLK=1; //拉高时钟脉冲
}
return(j); //返回数值
}
//
//部分显示数据初始化
TimeStart()
{
TimeBuf[0]=TimeBuf[8]=TimeBuf[9]=TimeBuf[10]=0x20; //不显示字符
TimeBuf[2]=TimeBuf[5]=':'; //时间分隔显示
DS1302_Write(0xc1);
alarm[0]=DS1302_Read();
RST=0;
DS1302_Write(0xc3);
alarm[1]=DS1302_Read();
RST=0;
DS1302_Write(0xc5);
DataBuf[0]=DS1302_Read();
RST=0;
}
//
//读取时间
ReadTime()
{
uchar i,m,n;
for(m=0,i=0,n=0x85;i<7;i+=3,n-=2,m++) //连续读取时,分,秒
{
DS1302_Write(n); //写入读取寄存器指令
time[m]=DS1302_Read(); //读取数据
RST=0; //将RST电平拉低,停止传输
TimeBuf[i]=time[m]/16+0x30; //将两位数据的十位转为字符格式
TimeBuf[i+1]=time[m]%16+0x30;//将两位数据的个位转为字符格式
}
}
//
//功能选择超时定时器
time0() interrupt 1 using 1
{
i--;
if(i==0)
{
if(j!=0)
j--;
i=20;
}
TH0=TIME/256,TL0=TIME%256;
}
//
//产生闹铃音调
intime1() interrupt 3
{
TH1=th1,TL1=tl1;
P32=!P32;
}
//
//闹钟显示
void AlarmShow(void)
{
uchar i,j,a,b,n;
ET1=1;
for(j=0;j<6;j++)
{
i=0;
while(1)
{
a=table2[i];
if(a==0)
break;
b=a&0xf;
a>>=4;
if(a==0)
{
TR1=0;
goto D1;
}
a=((--a)<<1)/2;
TH1=th1=table1[a]/256,TL1=tl1=table1[a]%256;
TR1=1;
D1: do
{
b--;
for(n=0;n<3;n++)
{
ReadTime();
LCDShow();
P2=0xff;
if(KEY4 == 1)
{
delay1ms(100);
if(KEY4 == 1)
{
TR1=0;
ET1=0;
P32 = 1;
return;
}
}
}
}while(b!=0);
i++;
}
TR1=0;
}
ET1=0;
}
//
//设置日期、时间
void SetTime(void)
{
uchar i=0xc2,year,month,day,n;
TimeBuf[6]=TimeBuf[7]=0x30;
DataBuf[14]=DataBuf[15]=0x20;
LCDShow();
while(1)
{
P0=0xe; //显示器开、光标开
Enable();
P0=i; //定光标
Enable();
P2=0xff;
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1)||(KEY4 == 1))
{
delay1ms(100); //延时01s去抖动
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1)||(KEY4 == 1))
{
j=7;
if(KEY1 == 1)
{
i+=3; //更改设置项目
if(i==0x8e)
i=0xc2;
else if(i>0xc5)
i=0xc2;
}
else if(KEY2 == 1)
{
year=(DataBuf[4]&0xf)10+(DataBuf[5]&0xf); //将字符格式的年份转换为数值格式
month=(DataBuf[7]&0xf)10+(DataBuf[8]&0xf); //将字符格式的月份转换为数值格式
day=(DataBuf[10]&0xf)10+(DataBuf[11]&0xf); //将字符格式的日数转换为数值格式
if(i==0x85) //设置年份
{
year++;
if(year>99)
year=0;
if((year%4)!=0)
if(month==2&&day==29)
day=28;
}
else if(i==0x88) //设置月份
{
month++;
if(month>12)
month=1;
if(day>Day[month-1])
{
day=Day[month-1];
if(month==2&&(year%4)==0) //计算是否闰年
day=29;
}
}
else if(i==0x8b) //设置日期
{
day++;
if(day>Day[month-1])
{
if(month==2&&(year%4)==0) //计算是否闰年
{
if(day>29)
day=1;
}
if(month!=2)
day=1;
}
}
else if(i==0xc2) //设置小时
{
n=(TimeBuf[0]&0xf)10+(TimeBuf[1]&0xf);
n++;
if(n>23)
n=0;
TimeBuf[0]=n/10+0x30;
TimeBuf[1]=n%10+0x30;
}
else //设置分钟
{
n=(TimeBuf[3]&0xf)10+(TimeBuf[4]&0xf);
n++;
if(n>59)
n=0;
TimeBuf[3]=n/10+0x30;
TimeBuf[4]=n%10+0x30;
}
DataBuf[4]=year/10+0x30; //将数值格式的日期转换为字符形式
DataBuf[5]=year%10+0x30;
DataBuf[7]=month/10+0x30;
DataBuf[8]=month%10+0x30;
DataBuf[10]=day/10+0x30;
DataBuf[11]=day%10+0x30;
LCDShow();
}
else if(KEY3 == 1) //按保存退出键后,向DS1302写入设置后的日期时间
{
DS1302_Write(0x8c);
DS1302_Write((DataBuf[4]&0xf)16+(DataBuf[5]&0xf));
RST=0;
DS1302_Write(0x8a);
DS1302_Write(SetWeek());
RST=0;
for(i=7,n=0x88;i<11;i+=3,n-=2)
{
DS1302_Write(n);
DS1302_Write((DataBuf[i]&0xf)16+(DataBuf[i+1]&0xf));
RST=0;
}
for(i=0;i<7;i+=3,n-=2)
{
DS1302_Write(n);
DS1302_Write((TimeBuf[i]&0xf)16+(TimeBuf[i+1]&0xf));
RST=0;
}
TR0=0;
return;
}
else
{
TR0=0;
return;
}
}
}
if(j==0)
{
TR0=0;
return;
}
}
}
//
//设置闹钟
void SetAlarm(void)
{
uchar i,n;
for(i=1;i<16;i++)
{
DataBuf[i]=0x20;
}
TimeBuf[0]=alarm[0]/16+0x30;
TimeBuf[1]=(alarm[0]&0xf)+0x30;
TimeBuf[3]=alarm[1]/16+0x30;
TimeBuf[4]=(alarm[1]&0xf)+0x30;
TimeBuf[6]=TimeBuf[7]=0x30;
LCDShow();
i=0xc2;
while(1)
{
P0=0xe; //显示器开、光标开
Enable();
P0=i; //定光标
Enable();
P2=0xff;
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1)||(KEY4 == 1))
{
delay1ms(100); //延时01s去抖动
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1)||(KEY4 == 1))
{
j=7;
if(KEY1 == 1)
{
i+=3;
if(i>0xc5)
i=0xc2;
}
else if(KEY2 == 1)
{
if(i==0xc2)
{
n=(TimeBuf[0]&0xf)10+(TimeBuf[1]&0xf);
n++;
if(n>23)
n=0;
TimeBuf[0]=n/10+0x30;
TimeBuf[1]=n%10+0x30;
}
else
{
n=(TimeBuf[3]&0xf)10+(TimeBuf[4]&0xf);
n++;
if(n>59)
n=0;
TimeBuf[3]=n/10+0x30;
TimeBuf[4]=n%10+0x30;
}
LCDShow();
}
else if(KEY3 == 1)
{
DS1302_Write(0xc0);
DS1302_Write((TimeBuf[0]&0xf)16+(TimeBuf[1]&0xf));
RST=0;
DS1302_Write(0xc2);
DS1302_Write((TimeBuf[3]&0xf)16+(TimeBuf[4]&0xf));
RST=0;
DataBuf[0]=FLAG;
DS1302_Write(0xc4);
DS1302_Write(DataBuf[0]);
RST=0;
TR0=0;
TimeStart();
return;
}
else
{
TR0=0;
TimeStart();
return;
}
}
}
if(j==0)
{
TR0=0;
TimeStart();
return;
}
}
}
//
//DS1302初始化程序
void DS1302_Init(void)
{
uchar i,n;
DS1302_Write(0x8c);
DS1302_Write((DataBuf[4]&0xf)16+(DataBuf[5]&0xf));
RST=0;
DS1302_Write(0x8a);
DS1302_Write(SetWeek());
RST=0;
for(i=7,n=0x88;i<11;i+=3,n-=2)
{
DS1302_Write(n);
DS1302_Write((DataBuf[i]&0xf)16+(DataBuf[i+1]&0xf));
RST=0;
}
for(i=0;i<7;i+=3,n-=2)
{
DS1302_Write(n);
DS1302_Write((TimeBuf[i]&0xf)16+(TimeBuf[i+1]&0xf));
RST=0;
}
}
//
//主函数
main()
{
IE=0x82;
TMOD=0x11;
DS1302_Write(0x8E); //禁止写保护
DS1302_Write(0);
RST=0;
P0=1; //清屏并光标复位
Enable();
P0=0x38; //设置显示模式:8位2行5x7点阵
Enable();
P0=6; //文字不动,光标自动右移
Enable();
DS1302_Init();
TimeStart();
while(1)
{
ReadTime(); //读取时间
LCDShow(); //显示时间
if(DataBuf[0]!=0x20)
if(time[0]==alarm[0])
if(time[1]==alarm[1])
if(time[2]==0)
AlarmShow();
P2=0xff;
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1))
{
delay1ms(100); //延时01s去抖动
if((KEY1 == 1)||(KEY2 == 1)||(KEY3 == 1))
{
j=7;
TH0=TIME/256,TL0=TIME%256;
TR0=1;
if(KEY1 == 1)
{
SetTime();
}
else if(KEY2 == 1)
{
SetAlarm();
}
else if(KEY3 == 1)
{
TR0=0;
if(DataBuf[0]==FLAG)
DataBuf[0]=0x20;
else
DataBuf[0]=FLAG;
DS1302_Write(0xc4);
DS1302_Write(DataBuf[0]);
RST=0;
}
}
}
delay1ms(100);
}
}
苹果 7手机日历设在桌面,需要在手机空白处常按手机屏幕,选择“窗口小部件”,然后在里面就可以找到日历,再把它添加在桌面上即可。
步骤如下:
1、首先在手机桌面空白处长按片刻,等跳出浮动窗口位置。
2、然后在底部选择添加小工具,点击打开。
3、向右排查找,找到日历后选中进入。
4、然后继续选择日历中的小项,点击打开进行设置。
5、然后继续选择日历中的小项,点击打开进行设置。
6、这样就大功告成啦,桌面就有日历了。
扩展资料
手机屏幕也称显示屏,用于显示图像及色彩。荧幕尺寸依荧幕对角线计算,通常以英寸作单位,指荧幕对角的长度。屏幕材质引随着手机彩屏的逐渐普遍,手机屏幕的材质也越来越显得重要。
手机的彩色屏幕因为LCD品质和研发技术不同而有所差异,其种类大致有TFT 、TFD、UFB、STN和OLED几种。一般来说能显示的颜色越多越能显示复杂的图象,画面的层次也更丰富。
参考资料来源:百度百科:手机屏幕
以上就是关于lcd1602液晶显示的程序全部的内容,包括:lcd1602液晶显示的程序、那要如何在用DS1302与1602LCD设计的可调式电子日历与时钟的程序里加上闹铃的功能啊程序要怎么加进去啊、AT89C52+DS1302单片机万年历程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)