16*64點陣仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
16*64點陣單片機源程序如下:
- #include<reg51.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define light 3 //定義亮度
- uchar code hanzi[]; //漢字字模
- uchar code shengri[]; //生日字模
- uchar code timer[13][16]; //0~9數(shù)字
- uchar code sw[]; //138驅動數(shù)據(jù)
- void Show_word(); //待機顯示按三秒間隔分別顯示年、月日、星期、時分秒。
- void Show_pass(); //不顯示一個字
- void Send_data(unsigned char *d); /*串口發(fā)送一行*/
- /******************************************/
- sbit resget=P0^2; //時鐘復位
- sbit key_moda=P0^3; //模式轉換
- sbit key_up=P0^4; //時鐘加
- sbit key_Down=P0^5; //時鐘減
- sbit T_CLK=P2^1; //DS1302引腳連接
- sbit T_IO =P2^2;
- sbit T_RST=P2^3;
- sbit ACC0=ACC^0; //1bit數(shù)據(jù)存儲位
- sbit ACC7=ACC^7;
- sbit STR=P1^7; //鎖存
- sbit CLK=P3^1; //時鐘
- sbit Data= P3^0; //數(shù)據(jù)
- sbit Data1= P1^6;
- sbit E=P1^4;
- sbit UU=P1^7;
- sbit DQ= P2 ^ 0;//ds1820data(單總線)
- uchar starts_time[7]={0x00,0x10,0x22,0x21,0x10,0x03,0x09}; //初始化后設置
- uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; //時間溫度變量
- uchar a,b,f,h,msec,id,x; //標志計數(shù)器 a為自動轉換顯示時間,b為手動與自動標志
- uint zimuo,tvalue; //字模計數(shù)器
- uchar BUFF[10]; //緩存
- void RTInputByte(uchar); //* 輸入 1Byte */
- uchar RTOutputByte(void); //* 輸出 1Byte */
- void W1302(uchar, uchar); // 向DS1302寫入一個字節(jié)
- uchar R1302(uchar); // 從DS1302讀出一個字節(jié)
- void Set1302(uchar *); // 寫DS1302時間
- void du1302(); // 讀時間
- void DelayMs(void); // 延時
- void Set(uchar,uchar ); // 變量調(diào)整
- void in_data(); // 調(diào)整移動數(shù)據(jù)
- void rxd_data(); // 串口發(fā)送移動數(shù)據(jù)
- read_temp(); //*讀取溫度值并轉換*/
- /*主函數(shù)*/
- void main()
- {
- Data1=1;
- Move=0;
- zimuo=0;
- TMOD=0x01; //16位定時
- TH0=0xC5; //15ms晶振為12M
- TL0=0x68;
- EA=1;
- TR0=1;
- ET0=1;
- SCON=0; //初始化串口為工作方式0(同步通信方式,TxD輸出同步脈沖)
- while(zimuo<512)
- {
- while(Move<16) //數(shù)據(jù)移位。
- {
- for(Speed=0;Speed<4;Speed++) //移動速度
- {
- for(line=0;line<16;line++)
- {
- in_data(); //調(diào)整移動數(shù)據(jù)
- rxd_data();
- P1=sw[line];
-
- STR=1;//鎖存
- STR=0;
- UU=1;
- DelayMs(); //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
-
-
- }
- }
- Move++; //移動一步
- }
- Move=0;
- zimuo=zimuo+32;
- }
- zimuo=0;
- while(1) //重復(無限)循環(huán)顯示
- {
- if(resget==0)
- { DelayMs();
- if(resget==0)
- Set1302(starts_time); //初始化
- W1302(0x8e,0x00); //控制命令,WP=0,寫操作
- W1302(0x90,0xa5); //打開充電二級管 一個二級管串聯(lián)一個2K電阻
- }
- du1302(); //讀取 秒 分 時 日 月 星期 年
- read_temp();//讀取溫度
- zimuo=0;
- if (key_moda==0) //設置和選擇項目鍵
- { DelayMs();
- if(key_moda==0)
- {
- if(id++==10) {id=0;}
- h=0;msec=0; //清閃爍標志
- while(key_moda==0){ Show_word();}
- }
- }
-
- if(id!=0)
- {
- if (key_up==0) //增加
- {
- DelayMs();
- if(key_up==0)
- {
- while(key_up==0)
- {Show_word();} //調(diào)用顯示
- h=0;msec=0; //清閃爍標志
-
- Set(id,0); //調(diào)用時間調(diào)調(diào)整
- }
- }
-
- if (key_Down==0) //減少
- {
- DelayMs();
- if(key_Down==0)
- {
- while(key_Down==0)
- {Show_word();} //調(diào)用顯示
- h=0;msec=0; //清閃爍標志
- Set(id,1); //調(diào)用時間調(diào)調(diào)整
- }
- }
- }
- else
- {
- if (key_up==0) //增加
- {
- DelayMs();
- if(key_up==0)
- {
- while(key_up==0)
- {Show_word();} //調(diào)用顯示
- h=0;msec=0; //清閃爍標志
- if(b!=0) //手動調(diào)整顯示的內(nèi)容
- {
- if(f++==5) //f為顯示轉換標志
- f=0;
- }
- }
- }
- }
- Show_word(); //待機顯示按三秒間隔分別顯示年、月日、星期、時分秒。
- }
- }
- /************************************************/
- void Show_word() //串行輸出顯示
- { uchar h;
- for(h=0;h<16;h++)
- {
- if((id==0)&(f==0)|(id==1)) //f為三秒轉換顯示
- {
- Send_data(&timer[0][0]); //不顯示
- if((Flicker==1)&(id==1)) //閃爍標志為1時不亮,為零時亮
- { Show_pass(); //不顯示一個字
- Show_pass();
- }
- else
- {
- Send_data(&timer[2][h]); //20年
- Send_data(&timer[0][h]);
- Send_data(&timer[Year/16][h]); //年值
- Send_data(&timer[Year%16][h]);
- }
- Send_data(&hanzi[h*2+641]); //年字符
- Send_data(&hanzi[h*2+640]);
- Send_data(&timer[0]); //不顯示
- }
- if((id==0)&(f==1)|(id==2)|(id==3))
- {
- if((Flicker==1)&(id==2)) //閃爍標志為1時不亮,為零時亮
- { Show_pass(); //不顯示一個字
-
- }
- else
- {
- if(Month/16<1)
- Send_data(&timer[0]); //月十位為零時不顯示
- else
- Send_data(&timer[Month/16][h]); //月值
- Send_data(&timer[Month%16][h]);
- }
- Send_data(&hanzi[h*2+673]); //月字符
- Send_data(&hanzi[h*2+672]);
- if((Flicker==1)&(id==3)) //閃爍標志為1時不亮,為零時亮
- { Show_pass(); //不顯示一個字
-
- }
- else
- {
- Send_data(&timer[Day/16][h]); //日值
- Send_data(&timer[Day%16][h]);
- }
- Send_data(&hanzi[h*2+961]); //日字符
- Send_data(&hanzi[h*2+960]);
- }
- if((id==0)&(f==2)|(id==4)) //f為三秒轉換顯示
- {
- Send_data(&timer[0]); //不顯示
- Send_data(&hanzi[h*2+705]); //星字符
- Send_data(&hanzi[h*2+704]);
- Send_data(&hanzi[h*2+737]); //期字符
- Send_data(&hanzi[h*2+736]);
- if((Flicker==1)&(id==4)) //閃爍標志為1時不亮,為零時亮
- { Show_pass(); //不顯示一個字
- }
- else
- {
- Send_data(&hanzi[Week%16*32+h*2+737]); //星期值
- Send_data(&hanzi[Week%16*32+h*2+736]);
- }
- Send_data(&timer[0][0]); //不顯示
- }
- if((id==0)&(f==3)|(id>4)) //f為三秒轉換顯示
- {
- if((Flicker==1)&(id==5)) //閃爍標志為1時不亮,為零時亮
- {
- Show_pass(); //不顯示一個字
- }
- else
- {
- if(Hour/16<1)
- Send_data(&timer[0][0]); //時十位小于1時不顯示
- else
- Send_data(&timer[Hour/16][h]); //時值
- Send_data(&timer[Hour%16][h]);
- }
- Send_data(&timer[10][h]); //兩個點
-
- if((Flicker==1)&(id==6)) //閃爍標志為1時不亮,為零時亮
- {
- Show_pass(); //不顯示一個字
- }
- else
- {
- Send_data(&timer[Cent/16][h]);
- Send_data(&timer[Cent%16][h]); //分值
- }
- Send_data(&timer[10][h]); //兩個點
- if((Flicker==1)&(id==7)) //閃爍標志為1時不亮,為零時亮
- {
- Show_pass(); //不顯示一個字
- }
- else
- {
- Send_data(&timer[Sec/16][h]); //秒
- Send_data(&timer[Sec%16][h]);
- }
- }
- if((id==0)&(f==4)) //f為三秒轉換顯示
- {
-
-
- Send_data(&hanzi[h*2+1185]); //溫字符
- Send_data(&hanzi[h*2+1184]);
- Send_data(&hanzi[h*2+1217]); //度字符
- Send_data(&hanzi[h*2+1216]);
- Send_data(&timer[10][h]); //兩個點
-
-
- if (tvalue/10==0x00)
- Send_data(&timer[0][0]);
- else
- Send_data(&timer[tvalue/10][h]); //溫度值的十位值
- Send_data(&timer[tvalue%10][h]); //溫度值的個位
-
- Send_data(&timer[11][h]); //溫度值的符號
- }
- if((id==0)&(f==5))
- {
- if(Month == 0x04 && Day == 0x19)
- {
- while(zimuo<64)
- {
- while(Move<16) //數(shù)據(jù)移位。
- {
- for(Speed=0;Speed<4;Speed++) //移動速度
- {
- for(line=0;line<16;line++)
- {
- char s;
- for(s=4;s>=0;s--) //i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器
- {
- BUFF[2*s+1]=shengri[zimuo+32*s+2*line]; //把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中
- BUFF[2*s]=shengri[zimuo+1+32*s+2*line];} //把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中 //調(diào)整移動數(shù)據(jù)
- rxd_data();
-
- P1=sw[line];
-
- STR=1;//鎖存
- STR=0;
- UU=1;
- DelayMs(); //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
-
-
- }
- }
- Move++; //移動一步
- }
- Move=0;
- zimuo=zimuo+32;
- }
-
- }
- else if(Month == 0x10 && Day == 0x26)
-
- {
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1249]); //重陽節(jié)字符
- Send_data(&hanzi[h*2+1248]);
- Send_data(&hanzi[h*2+1281]);
- Send_data(&hanzi[h*2+1280]);
- Send_data(&hanzi[h*2+1313]);
- Send_data(&hanzi[h*2+1312]);
- Send_data(&timer[0][0]);
- }
-
-
- else if(Month == 0x11 && Day == 0x26)
-
- {
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1345]); //感恩節(jié)字符
- Send_data(&hanzi[h*2+1344]);
- Send_data(&hanzi[h*2+1377]);
- Send_data(&hanzi[h*2+1376]);
- Send_data(&hanzi[h*2+1313]);
- Send_data(&hanzi[h*2+1312]);
- Send_data(&timer[0][0]);
- }
-
-
- else if(Month == 0x12 && Day == 0x22)
-
- {
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1409]); //冬至節(jié)字符
- Send_data(&hanzi[h*2+1408]);
- Send_data(&hanzi[h*2+1441]);
- Send_data(&hanzi[h*2+1440]);
- Send_data(&hanzi[h*2+1313]);
- Send_data(&hanzi[h*2+1312]);
- Send_data(&timer[0][0]);
- }
-
- else if(Month == 0x12 && Day == 0x25)
-
- {
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1473]); //圣誕節(jié)字符
- Send_data(&hanzi[h*2+1472]);
- Send_data(&hanzi[h*2+1505]);
- Send_data(&hanzi[h*2+1504]);
- Send_data(&hanzi[h*2+1313]);
- Send_data(&hanzi[h*2+1312]);
- Send_data(&timer[0][0]);
- }
-
- else if (Hour>= 0x06 &&Hour< 0x18 )
- {
- Send_data(&timer[0][0]);
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1537]); //白天字符
- Send_data(&hanzi[h*2+1536]);
- Send_data(&hanzi[h*2+1569]);
- Send_data(&hanzi[h*2+1568]);
- Send_data(&timer[0][0]);
- Send_data(&timer[0][0]);
- }
-
- else
- {
- Send_data(&timer[0][0]);
- Send_data(&timer[0][0]);
- Send_data(&hanzi[h*2+1601]); //晚上字符
- Send_data(&hanzi[h*2+1600]);
- Send_data(&hanzi[h*2+1633]);
- Send_data(&hanzi[h*2+1632]);
- Send_data(&timer[0][0]);
- Send_data(&timer[0][0]);
- }
- }
- if(id>7) //id大于7時為對顯示轉換模式設置
- { if((Flicker==1)&(id==8))
- { Show_pass();
- Show_pass();
- Show_pass();
- Show_pass();
- }
- else if(b==0)
- {
- Send_data(&hanzi[h*2+993]); //顯示漢字 “自”
- Send_data(&hanzi[h*2+992]);
- Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
- Send_data(&hanzi[h*2+1056]);
- Send_data(&hanzi[h*2+1089]); //顯示漢字“模”
- Send_data(&hanzi[h*2+1088]);
- Send_data(&hanzi[h*2+1121]); //顯示漢字“式”
- Send_data(&hanzi[h*2+1120]);
- }
- else
- {
- Send_data(&hanzi[h*2+1025]); //顯示漢字“手”
- Send_data(&hanzi[h*2+1024]);
- Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
- Send_data(&hanzi[h*2+1056]);
- Send_data(&hanzi[h*2+1089]); //顯示漢字“模”
- Send_data(&hanzi[h*2+1088]);
- Send_data(&hanzi[h*2+1121]); //顯示漢字“式”
- Send_data(&hanzi[h*2+1120]);
- }
- if(id==9)
- {
- if(b==1) //手動模式
- {
- id=0;f=0;
- }
- else
- {
- Send_data(&hanzi[h*2+993]); //顯示漢字“自”
- Send_data(&hanzi[h*2+992]);
- Send_data(&hanzi[h*2+1057]); //顯示漢字“動”
- Send_data(&hanzi[h*2+1056]);
- if(Flicker==1)
- {
- Show_pass();
- }
- else
- {
- Send_data(&timer[a/16][h]); //轉換時間
- Send_data(&timer[a%16][h]);
- }
- Send_data(&hanzi[h*2+1153]); //顯示漢字“秒”
- Send_data(&hanzi[h*2+1152]);
- }
- }
- }
-
- P1=sw[h]; //輸出行信號
- STR=1;STR=0;
- UU=1; //鎖存為高,595鎖存信號
- DelayMs(); //延時,等待一段時間,讓這列顯示的內(nèi)容在人眼內(nèi)產(chǎn)生“視覺暫留”現(xiàn)象。*/
-
- }
- }
- /************************************************/
- //temp=255-temp;
- //return temp;
- void timer_1(void) interrupt 1 //中斷入口,閃爍
- {
- TH0=0xC5; //15ms定時 晶振12M
- TL0=0x68;
- if(msec++==40) //1000ms
- { msec=0;
- x++;
- if(x>=a)
- { x=0;
- if(b==0) //自動模式
- {
- if(f++==5)
- f=0; //f顯示轉換計數(shù)器 ,d為用戶設置的自動轉換時間的值。
- }
- }
- if(h++==4) //5秒后進入正常走時。
- {id=0;h=0;}
- }
- if(msec<20)
- Flicker=0; //閃爍標志反轉
- else
- Flicker=1;
-
- }
- /***********************輸出一個字的不顯示數(shù)據(jù)。*****************/
- void Show_pass()
- {
- Send_data(&timer[0][0]); //不顯示
- Send_data(&timer[0][0]); //不顯示
- }
- /**********************************************************/
- void in_data(void) //調(diào)整數(shù)據(jù)
- {
- char s;
- for(s=4;s>=0;s--) //i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器
- {
- BUFF[2*s+1]=hanzi[zimuo+32*s+2*line]; //把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中
- BUFF[2*s]=hanzi[zimuo+1+32*s+2*line]; //把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中
- }
- }
- /***********************發(fā)送移動的數(shù)據(jù)****************************/
- void rxd_data(void) //串行發(fā)送數(shù)據(jù)
- {
- uchar s;
- uchar inc,tempyid,temp;
- if(Move<8)
- inc=0;
- else
- inc=1;
- for(s=0+inc;s<8+inc;s++) //發(fā)送8字節(jié)數(shù)據(jù)
- {
- if(Move<8)
- tempyid=Move;
- else
- tempyid=Move-8;
- temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數(shù)據(jù)。
- temp=255-temp;
-
- SBUF=temp; //把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。
- while(TI==0); //等待發(fā)送完畢
- TI=0;
-
- }
- }
- /*******************************************************/
- void Send_data(unsigned char *d) /*從串口發(fā)送數(shù)據(jù)*/
- {
- SBUF=*d;
- while(TI==0); //等待發(fā)送完畢
- TI=0;
- }
- //根據(jù)選擇調(diào)整相應項目
- void Set(uchar sel,uchar sel_1)
- {
- uchar address,time;
- uchar max,min;
- if(sel==9) {address=0xc2; max=20;min=1;} //自動轉換時間時最大為20秒。
- if(sel==8) {address=0xc0; max=1;min=0; } //顯示自動轉換或手動轉換。為零自動,為1手動。
- if(sel==7) {address=0x80; max=59;min=0;} //秒
- if(sel==6) {address=0x82; max=59;min=0;} //分鐘
- if(sel==5) {address=0x84; max=23;min=0;} //小時
- if(sel==4) {address=0x8a; max=7; min=1;} //星期
- if(sel==3) {address=0x86; max=31;min=1;} //日
- if(sel==2) {address=0x88; max=12;min=1;} //月
- if(sel==1) {address=0x8c; max=99;min=0;} //年
-
-
- time=R1302(address+1)/16*10+R1302(address+1)%16;
- if (sel_1==0) time++; else time--;
- if(time>max) time=min;
- if(time<min) time=max;
-
- W1302(0x8e,0x00);
- W1302(address,time/10*16+time%10);
- W1302(0x8e,0x80);
- }
- /**************************延時***********************/
- void DelayMs(void)
- {
- uchar TempCyc;
- for(TempCyc=110;TempCyc>1;TempCyc--)
- {;}
- }
- //********DS1302讀寫程序***************//
- /********************************************************************
- 函 數(shù) 名:RTInputByte()
- 功 能:實時時鐘寫入一字節(jié)
- 說 明:往DS1302寫入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
- 入口參數(shù):d 寫入的數(shù)據(jù)
- 返 回 值:無
- ***********************************************************************/
- void RTInputByte(uchar d)
- {
- uchar h;
- ACC = d;
- for(h=8; h>0; h--)
- {
- T_IO = ACC0; /*相當于匯編中的 RRC */
- T_CLK = 1;
- T_CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- 函 數(shù) 名:RTOutputByte()
- 功 能:實時時鐘讀取一字節(jié)
- 說 明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
- 入口參數(shù):無
- 返 回 值:ACC
- 設 計:zhaojunjie 日 期:2002-03-19
- 修 改: 日 期:
- ***********************************************************************/
- uchar RTOutputByte(void)
- {
- uchar h;
- for(h=8; h>0; h--)
- {
- ACC = ACC >>1; /*相當于匯編中的 RRC */
- ACC7 = T_IO;
- T_CLK = 1;
- T_CLK = 0;
- }
- return(ACC);
- }
- /********************************************************************
- 函 數(shù) 名:W1302()
- 功 能:往DS1302寫入數(shù)據(jù)
- 說 明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù))
- 調(diào) 用:RTInputByte() , RTOutputByte()
- 入口參數(shù):ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
- 返 回 值:無
- ***********************************************************************/
- void W1302(uchar ucAddr, uchar ucDa)
- {
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- RTInputByte(ucDa); /* 寫1Byte數(shù)據(jù)*/
- T_CLK = 1;
- T_RST = 0;
- }
- /********************************************************************
- 函 數(shù) 名:R1302()
- 功 能:讀取DS1302某地址的數(shù)據(jù)
- 說 明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
- 調(diào) 用:RTInputByte() , RTOutputByte()
- 入口參數(shù):ucAddr: DS1302地址
- 返 回 值:ucData :讀取的數(shù)據(jù)
- ***********************************************************************/
- uchar R1302(uchar ucAddr)
- {
- uchar ucData;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); /* 地址,命令 */
- ucData = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
- T_CLK = 1;
- T_RST = 0;
- return(ucData);
- }
- /********************************************************************
- 函 數(shù) 名:Set1302()
- 功 能:設置初始時間
- 說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
- 調(diào) 用:W1302()
- 入口參數(shù):pClock: 設置時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年
- 7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
- 返 回 值:無
- ***********************************************************************/
- void Set1302(uchar *pClock)
- {
- uchar h;
- uchar ucAddr = 0x80;
- W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
- for(h =7; h>0; h--)
- {
- W1302(ucAddr,*pClock); /* 秒 分 時 日 月 星期 年 */
- pClock++;
- ucAddr +=2;
- }
- W1302(0xc0,0x01);
- W1302(0XC2,0X03); //初始自動轉換顯示時間為3秒。
- W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
- }
- /******************讀取DS1302中的時間****************/
- void du1302()
- {
- Sec=R1302(0x81); //對取 秒 分 時 日 月 星期 年
- Cent=R1302(0x83);
- Hour=R1302(0x85);
- Day=R1302(0x87);
- Month=R1302(0x89);
- Week=R1302(0x8b);
- Year=R1302(0x8d);
- b=R1302(0xc1);
- a=R1302(0xc3);
- a=a/16*10+a%16;
-
- }
- /******************************ds1820程序***************************************/
- void delay_18B20(unsigned int i)//延時1微秒
- {
- while(i--);
- }
- void ds1820rst()/*ds1820復位*/
- { unsigned char x=0;
- DQ = 1; //DQ復位
- delay_18B20(4); //延時
- DQ = 0; //DQ拉低
- delay_18B20(100); //精確延時大于480us
- DQ = 1; //拉高
- delay_18B20(40);
- }
- uchar ds1820rd()/*讀數(shù)據(jù)*/
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--)
- { DQ = 0; //給脈沖信號
- dat>>=1;
- DQ = 1; //給脈沖信號
- if(DQ)
- dat|=0x80;
- delay_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
- {unsigned char i=0;
- for (i=8; i>0; i--)
- { DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- read_temp()/*讀取溫度值并轉換*/
- {
- uchar a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- ds1820wr(0x44);//*啟動溫度轉換*/
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- ds1820wr(0xbe);//*讀取溫度*/
- a=ds1820rd();
- b=ds1820rd();
- tvalue=b*16+a/16;
- //tvalue=b;
- //tvalue<<=8;
- //tvalue=tvalue|a;
- //if(tvalue<0x0fff)
- //tflag=0;
- // else
- //{tvalue=~tvalue+1;
- //tflag=1;
- //}
- return(tvalue);
- }
- /*******************************************************************/
- uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*16行段碼*/
-
- const uchar code timer[13][16]={ /*0~9字符*/
- /*-- 文字: 0 --*/
- /*-- Book Antiqua12; 此字體下對應的點陣為:寬x高=8x20 --*/
- 0xFF,0xFF,0xE3,0xDD,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xDD,0xE3,0xFF,0xFF,
- /*-- 文字: 1 --*/
- /*-- Book Antiqua12; 此字體下對應的點陣為:寬x高=8x20 --*/
- 0xFF,0xFF,0xEF,0xE7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,
- /*-- 文字: 2 --*/
- /*-- Book Antiqua12; 此字體下對應的點陣為:寬x高=8x20 --*/
- 0xFF,0xFF,0xC7,0xBB,0x7D,0x7F,0x7F,0xBF,0xCF,0xF7,0xFB,0xFD,0xFD,0x01,0xFF,0xFF,
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
16x64點陣(2).rar
(115.76 KB, 下載次數(shù): 90)
2019-3-8 23:06 上傳
點擊文件名下載附件
|