基于51单片机点阵显示左移c程序.docx
《基于51单片机点阵显示左移c程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机点阵显示左移c程序.docx(21页珍藏版)》请在冰点文库上搜索。
基于51单片机点阵显示左移c程序
#include
#include
typedefunsignedintuint;
typedefunsignedcharuchar;
ucharnian,zhou,yue,ri,shi,fen,miao;
ucharn,m;
ucharflagstart;//确定标志位
ucharflagstop;//停止标志位
ucharflagdushi;//读时间标志位
ucharhaoma;
uchartemp;//温度
ucharirtime;//红外高低电平所占时间,由定时器0中断产生
ucharstartflag;//接收红外引导码的标志位
ucharbitnum;
ucharirreseok;//红外接收标志位
ucharirjieshu;
sbitDQ=P1^3;//DS18B20数据管脚
sbitrst=P1^6;//1302接口定义
sbitsck=P1^1;
sbitio=P1^0;
sbitrs=P2^0;//液晶接口定义
sbitrw=P2^1;
sbite=P2^2;
ucharinit_ds18b20(void);
ucharread_ds18b20temp(void);
voidwrite_ds18b20byte(uchardat);
ucharread_ds18b20byte(void);
voiddelay_8us(uintt);
voidset_time1(ucharm);
voidtiaoshi(void);
voidirkongzhi(void);
voidirpd(void);//红外解码判断
voidirchuli(void);//红外接收数据保存
voidwrite_com(com);//液晶的写指令
voidwrite_data(dat);//液晶的写数据
voidinit(void);//定时器,液晶,红外中断的初始化
voiddelay(uintt);
voidtimechuli(void);
voidset_time(void);//设置时间
voidread_time(void);//读书时间
voidyejinchuli(void);
ucharread_ds1302(ucharadd);//读DS1302上的某个地址上的数,如:
读时间
voidwrite_byte(uchardat);//写一个字节到DS1302
voidwrite_ds1302(ucharadd,uchardat);//在DS1302上的某个地址上写数据
//ucharread_1602(ucharadd);
ucharcodetimetable[8];
ucharirtable[33];
ucharircode[4];
uchardisp[16]="";
uchardisp1[16]="";
ucharcodetable[10]="0123456789";
ucharcodetable1[4]="zhou";//液晶数组
ucharcodetable2[5]="-CSD:
";
uchartime[7];//年周月日时分秒
ucharcodewrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写操作的时候DS1302中的对应的时间地址
ucharcoderead_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读操作的时候DS1302中的对应的时间地址
voidmain()
{
init();
//set_time();
while
(1)
{
read_ds18b20temp();
if(irreseok==1)
{
irreseok=0;
irchuli();
delay(5);
irpd();
delay(5);
tiaoshi();
}
if(flagstop)
{
flagdushi=1;
flagstop=0;
}
if(flagstart)
{
flagstart=0;
flagdushi=0;
}
if(!
flagdushi)
{
timechuli();
yejinchuli();
read_time();
}
}
}
voiddelay_8us(uintt)
{
while(t--);
}
ucharinit_ds18b20(void)
{
ucharn;
DQ=1;
delay_8us(8);
DQ=0;
delay_8us(80);
DQ=1;//释放总线
delay_8us(8);
n=DQ;
delay_8us(4);
returnn;
}
voidwrite_ds18b20byte(uchardat)
{
ucharj;
for(j=0;j<8;j++)
{
DQ=0;
DQ=dat&0x01;
delay_8us(4);
DQ=1;
dat>>=1;
}
delay_8us(4);
}
ucharread_ds18b20byte(void)
{
uchari,dat;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_8us(4);
}
returndat;
}
ucharread_ds18b20temp(void)
{
uchara,b;
init_ds18b20();
write_ds18b20byte(0xcc);//跳过ROM
write_ds18b20byte(0x44);//启动温度测量
delay_8us(300);
init_ds18b20();
write_ds18b20byte(0xcc);//跳过ROM
write_ds18b20byte(0xbe);//开始读取温度
a=read_ds18b20byte();
b=read_ds18b20byte();
temp=(b*256+a)*0.0625;
returntemp;
}
voidtime0()interrupt1
{
irtime++;
}
voidint0()interrupt0
{
if(startflag)
{
if(irtime>32)//收到引导码
{
bitnum=0;
}
irtable[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreseok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
voidinit(void)
{
//液晶初始化
P0=0x00;
e=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
delay(15);
write_com(0x38);
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0f);
//定时器0初始化
TH0=0X00;
TL0=0X00;
ET0=1;
TMOD=0X02;
TR0=1;
EA=1;
//外部中断0初始化
IT0=1;
EX0=1;
EA=1;
}
/*ucharread_1602(ucharadd)
{
uchardat;
write_com(add);
rs=0;
rw=0;
rw=1;
delay
(1);
e=0;
e=1;
dat=P0;
delay
(1);
e=0;
rw=0;
return(dat);
}*/
voidtiaoshi(void)
{
if(ircode[1]==0xbf)
{
if(haoma<10)
{
delay
(2);
n++;
if((n>0x0f)&&(n<0x40))
n=0x40;
switch(n)
{
case0x01:
time[0]=time[0]%16+(haoma*16);
set_time1(0);
break;
case0x02:
time[0]=time[0]/16*16+haoma;
set_time1(0);
break;
case0x04:
time[2]=time[2]%16+(haoma*16);
set_time1
(2);
break;
case0x05:
time[2]=time[2]/16*16+haoma;
set_time1
(2);
break;
case0x07:
time[3]=time[3]%16+(haoma*16);
set_time1(3);
break;
case0x08:
time[3]=time[3]/16*16+haoma;
set_time1(3);
break;
case0x40:
time[1]=time[1]/16*16+haoma;
set_time1
(1);
break;
case0x41:
time[4]=time[4]%16+(haoma*16);
set_time1(4);
break;
case0x42:
time[4]=time[4]/16*16+haoma;
set_time1(4);
break;
case0x44:
time[5]=time[5]%16+(haoma*16);
set_time1(5);
break;
case0x45:
time[5]=time[5]/16*16+haoma;
set_time1(5);
break;
case0x47:
time[6]=time[6]%16+(haoma*16);
set_time1(6);
break;
case0x48:
time[6]=time[6]/16*16+haoma;
set_time1(6);
break;
default:
;
}
delay(10);
write_data(table[haoma]);
}
if(haoma==10)
{
if((n>=0x40)&&(n<=0x4f))
n-=0x40;
}
if(haoma==11)
{
if((n>=0x00)&&(n<=0x0f))
n+=0x40;
}
if(haoma==12)
{
n--;
if(n==255)
n=0x47;
if(n==0x3f)
n=0x0f;
if(n==0x0e)
n=7;
if(n==5)
n=4;
if(n==2)
n=1;
if(n==0x45)
n=0x44;
if(n==0x42)
n=0x41;
if(n==0x10)
n=0x40;
}
if(haoma==13)
{
n++;
}
if(haoma==14)
{
flagstart=1;
}
if(haoma==15)
{
flagstop=1;
};
if(n==2)
n=3;
if(n==5)
n=6;
if((n>=8)&&(n<=14))
n=15;
if(n==0x10)
n=0x40;
if(n==0x42)
n=0x43;
if(n==0x45)
n=0x46;
if(n==0x48)
n=0;
write_com(0x80+n);
}
}
voidirkongzhi(void)//红外控制液晶
{
if(ircode[1]==0xbf)
{
}
}
voidirpd(void)//红外解码判断
{
if(ircode[1]==0xbf)
{
switch(ircode[2])
{
case0x0c:
haoma=0;
break;
case0x10:
haoma=1;
break;
case0x11:
haoma=2;
break;
case0x12:
haoma=3;
break;
case0x14:
haoma=4;
break;
case0x15:
haoma=5;
break;
case0x16:
haoma=6;
break;
case0x18:
haoma=7;
break;
case0x19:
haoma=8;
break;
case0x1a:
haoma=9;
break;
case0x05:
haoma=10;
break;
case0x0d:
haoma=11;
break;
case0x08:
haoma=12;
break;
case0x0a:
haoma=13;
break;
case0x09:
haoma=14;
break;
case0x06:
haoma=15;
break;
default:
;
}
}
}
voiddelay(uintt)//长延时
{
uchara,b;
for(a=t;a>0;a--)
for(b=120;b>0;b--);
}
voidwrite_com(ucharcom)//1602液晶写指令
{
e=0;
rs=0;
rw=0;
P0=com;
delay
(1);
e=1;
delay(5);
e=0;
}
voidwrite_data(uchardat)//1602液晶写数据
{
e=0;
rs=1;
rw=0;
P0=dat;
delay
(1);
e=1;
delay(5);
e=0;
}
voidwrite_byte(uchardatt)//向ds1302时钟芯片中写一个字节
{
uchari;
for(i=0;i<8;i++)
{
sck=0;
io=datt&0x01;
datt=datt>>1;
sck=1;
}
}
voidwrite_ds1302(ucharadd,uchardat)//给ds1302中某个地址上写数据
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_byte(add);
write_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
ucharread_ds1302(ucharadd)//读DS1302中某个地址上的数据并返回
{
uchari,value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
value=value|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
sck=1;
io=1;
returnvalue;
}
voidset_time(void)//设置DS1302的时间
{
uchari,j;
for(i=0;i<7;i++)
{
j=time[i]/10;
time[i]=time[i]%10;
time[i]=time[i]+j*16;//把十进制数转为BCD码,如:
15转换成BCD码位00011001
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time[i]);
}
write_ds1302(0x8e,0x80);//加写保护
}
voidset_time1(ucharm)//设置DS1302的时间
{
write_ds1302(0x8e,0x00);//去除写保护
write_ds1302(write_add[m],time[m]);
write_ds1302(0x8e,0x80);//加写保护
}
voidread_time(void)//读DS1302中的年,周,月,日,时,分,秒。
{
uchari;
for(i=7;i>0;i--)
{
time[i]=read_ds1302(read_add[i]);
}
}
voidtimechuli(void)//把从DS1302中读出的年,周,月,日,时,分,秒,进行分离成十进制。
{
//第一行显示
disp[0]=table[time[0]/16];
disp[1]=table[time[0]%16];
disp[2]=table2[0];
disp[3]=table[time[2]/16];
disp[4]=table[time[2]%16];
disp[5]=table2[0];
disp[6]=table[time[3]/16];
disp[7]=table[time[3]%16];
disp[8]=table2[0];
disp[9]=table2[0];
disp[10]=table1[0];
disp[11]=table1[1];
disp[12]=table1[2];
disp[13]=table1[3];
disp[14]=table2[0];
disp[15]=table[time[1]%16];
//第二行显示
disp1[0]=table[time[4]/16];
disp1[1]=table[time[4]%16];
disp1[2]=table2[4];
disp1[3]=table[time[5]/16];
disp1[4]=table[time[5]%16];
disp1[5]=table2[4];
disp1[6]=table[time[6]/16];
disp1[7]=table[time[6]%16];
disp1[8]=table2[0];
disp1[9]=table2[0];
disp1[10]=table[temp/100];
disp1[11]=table[temp%100/10];
disp1[12]=table[temp%10];
disp1[13]=table2[1];
disp1[14]=table2[2];
disp1[15]=table2[3];
}
voidyejinchuli(void)
{
uchari;
write_com(0x80);
delay
(1);
for(i=0;i<16;i++)
{
write_data(disp[i]);
}
write_com(0xc0);
for(i=0;i<16;i++)
{
write_data(disp1[i]);
}
}
voidirchuli(void)
{
uchari,j,k,vaule;
k=1;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
vaule=vaule>>1;
if(irtable[k]>6)
{
vaule=vaule|0x80;
}
k++;
}
ircode[i]=vaule;
}
}