|
只用一個51單片機實現(xiàn)2個屏同時顯示,下面是仿真原理圖:
0.png (30 KB, 下載次數(shù): 89)
下載附件
2016-12-2 01:34 上傳
下面是源程序:
- #include <reg52.h>
- #include <stdio.h>
- sbit beep=P1^6;
- sbit led=P1^5;
- sbit rs=P3^6;
- sbit rw=P3^5;
- sbit e=P3^7;
- unsigned char code screen[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0xbf,0x86,0xaf,0xa3}; //0~9,'-','E','r'
- unsigned char wei[5]={0xbf,0xbf,0xbf,0xbf};
- unsigned char yy,mm,dd,h,m,s,*chp;
- void Flash_Scr(unsigned int times);
- void DS_Init();
- void DS_StartTrans();
- unsigned int DS_GetTemp();
- /****LCDPin assignment*****/
- #define LCD_DATAPORT P0
- #define LCD_Delay 200
- void LCD_Cmd(unsigned char);
- void LCD_Data(unsigned char);
- void LCD_SetCursor(unsigned char,unsigned char);
- void LCD_Init(void);
- void LCD_Printf(const char string[]);
- void UpdateSCR(void);
- void IncTime(void);
- unsigned short MaxDay(void);
- enum
- {
- Cursor_on = 0x0e,
- Cursor_off = 0x0c,
- Cursor_Shake = 0x0f
- }LCDCMD;
- enum{
- Firstline,
- Secondline
- }LCD_Currentline=Firstline;
- void Timer0Init(void) //50ms@12.000MHz
- {
- TMOD = 0x11;
- TL0 = 0xB0;
- TH0 = 0x3C;
- TF0 = 0;
- TR0 = 1;
- TR1 = 1;
- ET0=1;
- ET1=1;
- EA=1;
- }
- unsigned short MaxV,MinV;
- unsigned char Mod=0;
- unsigned char code CsP[2][6]={{0,0,0,1,1,1},{6,9,12,5,8,11}};
-
- void AdjustNum(bit inc)
- {
- if(Mod!=0)
- {
- if(inc==1)
- {
- if(*chp<MaxV)
- {
- (*chp)++;
- }
- else
- {
- *chp=MinV;
- }
- }
- else
- {
- if(*chp>MinV)
- {
- (*chp)--;
- }
- else
- {
- *chp=MaxV;
- }
- }
- }
- if(dd>MaxDay())
- {
- dd=MaxDay();
- }
- UpdateSCR();
- LCD_SetCursor(CsP[0][Mod-1],CsP[1][Mod-1]);
- }
- void ChangeMode(void)
- {
- MinV=0;
- switch(Mod)
- {
- case 0:
- {
- TR0=0;
- LCD_Cmd(Cursor_Shake);
- MaxV=255;
- MinV=0;
- chp=&yy;
- break;
- }
- case 1:MaxV=12;MinV=1;chp=&mm;break;
- case 2:MaxV=MaxDay();MinV=1;chp=ⅆbreak;
- case 3:MaxV=23;chp=&h;break;
- case 4:MaxV=59;chp=&m;break;
- case 5:MaxV=59;chp=&s;break;
- default:Mod=0;TR0=1;LCD_Cmd(Cursor_off);
- }
- if(dd>MaxDay())
- {
- dd=MaxDay();
- UpdateSCR();
- }
- LCD_SetCursor(CsP[0][Mod],CsP[1][Mod]);
- Mod++;
- }
- sbit KM=P1^1;
- sbit KP=P1^0;
- sbit KN=P1^2;
- void main(void)
- {
-
- LCD_Init();
- LCD_SetCursor(0,0);
- LCD_Cmd(Cursor_off);
- yy=46;
- mm=11;
- dd=30;
- h=12;
- m=23;
- s=0;
- DS_Init();
- DS_StartTrans();
- UpdateSCR();
- Timer0Init();
- while(1)
- {
- while((P1&0x07)==0x07)
- {
- Flash_Scr(1);
- }
- if(KM==0)
- {
- ChangeMode();
- }
- if(KP==0)
- {
- AdjustNum(1);
- }
- if(KN==0)
- {
- AdjustNum(0);
- }
- while((P1&0x07)!=0x07)
- {
- Flash_Scr(1);
- }
- }
- }
- void Timer(void) interrupt 1
- {
- static unsigned char div=0;
- TL0 = 0xB0;
- TH0 = 0x3C;
- if(div<19)
- {
- div++;
- }
- else
- {
- div=0;
- IncTime();
- UpdateSCR();
- }
- }
- void DSTimer(void) interrupt 3
- {
- static unsigned char div=0;
- unsigned short temp;
- if(div<19)
- {
- div++;
- }
- else
- {
- temp=DS_GetTemp();
- if(((temp>>4)>35)||((temp>>4)<20))
- {
- beep=0;
- }
- else
- {
- beep=1;
- }
- if((temp&0x1000)!=0)
- {
- wei[3]=screen[10];
- temp=(~temp)+1;
- div=0;
- }
- else
- {
- div=1;
- wei[3]=0xff;
- wei[0]=screen[((int)((temp%0x10)*6.25)%10)];
- }
- wei[div++]=screen[((int)((temp%0x10)*0.625))];
- temp>>=4;
- wei[div++]=screen[temp%10]-0x80;
- if((temp/=10)!=0)
- {
- wei[div++]=screen[temp%10];
- if((temp/=10)!=0)
- wei[div]=screen[temp];
- }
- else
- wei[div]=0xff;
- div=0;
- DS_StartTrans();
- }
- if(div<10)
- {
- led=1;
- }
- else
- {
- led=beep;
- }
- }
- unsigned short MaxDay(void)
- {
- unsigned short ym;
- switch(mm)
- {
- case 4:
- case 6:
- case 9:
- case 11:
- return 30;
- case 2:
- {
- ym=yy+1970;
- if(ym%100==0)
- {
- if(ym%400==0)
- {
- return 29;
- }
- return 28;
- }
- else
- {
- if(ym%4==0)
- {
- return 29;
- }
- return 28;
- }
- }
- default: return 31;
- }
- }
- void IncTime(void)
- {
- if(s<59)
- {
- s++;
- }
- else
- {
- s=0;
- if(m<59)
- {
- m++;
- }
- else
- {
- m=0;
- if(h<23)
- {
- h++;
- }
- else
- {
- h=0;
- if(dd<MaxDay())
- {
- dd++;
- }
- else
- {
- dd=0;
- if(mm<12)
- {
- mm++;
- }
- else
- {
- mm=0;
- yy++;
- }
- }
- }
- }
- }
- }
- void UpdateSCR(void)
- {
- char GRAM[11];
- char *buf=GRAM;
- unsigned short ym=yy+1970;
- buf+=sprintf(buf,"%04d-",ym);
- buf+=sprintf(buf,"%02d-",(unsigned short)mm);
- buf+=sprintf(buf,"%02d",(unsigned short)dd);
- LCD_SetCursor(0,3);
- LCD_Printf(GRAM);
- buf=GRAM;
- buf+=sprintf(buf,"%02d:",(unsigned short)h);
- buf+=sprintf(buf,"%02d:",(unsigned short)m);
- buf+=sprintf(buf,"%02d",(unsigned short)s);
- LCD_SetCursor(1,4);
- LCD_Printf(GRAM);
- }
- void LCD_Data(unsigned char dat)
- {
- unsigned char etime;
- e=0;
- rw=0;
- rs=1;
- LCD_DATAPORT=dat;
- e=1;
- etime=LCD_Delay;
- while(etime--);
- e=0;
- }
- void LCD_Cmd(unsigned char cmd)
- {
- unsigned etime;
- e=0;
- rw=0;
- rs=0;
- LCD_DATAPORT=cmd;
- e=1;
- etime=LCD_Delay;
- while(etime--);
- e=0;
- etime=170;
- while(etime--);
- }
- void LCD_Init()
- {
- LCD_Cmd(0x38);
- LCD_Cmd(0x38);
- LCD_Cmd(0x38);
- LCD_Cmd(0x38);
- LCD_Cmd(0x08);
- LCD_Cmd(0x01);
- LCD_Cmd(0x06);
- LCD_Cmd(0x0f);
- }
- void LCD_SetCursor(unsigned char Line,unsigned char Pos)
- {
- if(Line==0)
- LCD_Cmd(0x80+Pos),LCD_Currentline=Firstline;
- else if(Line==1)
- LCD_Cmd(0xc0+Pos),LCD_Currentline=Secondline;
-
- }
- void LCD_Printf(const char *string)
- {
- int i=0;
- while(string[i]!='\0')
- {
- if(string[i]=='\n')
- {
- if(LCD_Currentline==Firstline)
- LCD_Cmd(0xc0);
- else
- LCD_Cmd(0x80);
- }
- else
- LCD_Data(string[i]);
- i++;
- }
- }
- /**************************DS18B20********************/
- void Flash_Scr(unsigned int times)
- {
- unsigned short i,a;
- while(times--!=0)
- for(i=0;i<4;i++) //???????
- {
- P2=wei[3-i];
- P3|=(0x01<<i);
- a=100;
- while(a--);
- P3&=0xf0;
- }
- }
- void wait_us(unsigned char us)
- {
- us/=7;
- while(us--);
- }
- sbit ds=P1^7;
- void DS_Init()
- {
- unsigned char i;
- ds=0;
- wait_us(250);
- wait_us(250);
- wait_us(250);
- ds=1;
- i=100;
- while(!ds);
- wait_us(480);
- }
- unsigned char DS_ReadByte()
- {
- unsigned char i;
- unsigned char dat=0;
- ds=1;
- wait_us(2);
- for(i=0;i<8;i++)
- {
- ds=0;
- wait_us(1);
- ds=1;
- wait_us(3);
- if(ds==1)
- dat=0x80|(dat>>1);
- else
- dat=0x7f&(dat>>1);
- wait_us(30);
- }
- return dat;
- }
- void DS_WriteByte(unsigned char dat)
- {
- unsigned char i;
- ds=1;
- for(i=0;i<8;i++)
- {
- ds=0;
- wait_us(5);
- ds=dat&0x01;
- wait_us(10);
- ds=1;
- dat>>=1;
- wait_us(5);
- }
- }
- void DS_StartTrans()
- {
- DS_Init();
- DS_WriteByte(0xcc);
- DS_WriteByte(0x44);
- }
- unsigned int DS_GetTemp()
- {
- unsigned int val=0;
- DS_Init();
- DS_WriteByte(0xcc);
- DS_WriteByte(0xbe);
- val=DS_ReadByte();
- val|=DS_ReadByte()*0x100;
- return val;
- }
復(fù)制代碼
0.png (57.72 KB, 下載次數(shù): 78)
下載附件
2016-12-2 01:36 上傳
|
-
-
萬年歷 溫度.rar
2016-12-2 01:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
72.87 KB, 下載次數(shù): 29, 下載積分: 黑幣 -5
|