久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6328|回復(fù): 4
收起左側(cè)

求助!電子鐘

[復(fù)制鏈接]
ID:17087 發(fā)表于 2009-12-10 15:43 | 顯示全部樓層 |閱讀模式
 求助!~本人是阿蔡~據(jù)以下程序做了一個(gè)電子鐘,但最后有點(diǎn)小問(wèn)題,1602顯示不正確~秒走起來(lái)時(shí)每隔一個(gè)就顯示一個(gè)問(wèn)號(hào)~其余年月日,時(shí)間等也是如此~請(qǐng)問(wèn)有誰(shuí)遇到類(lèi)似問(wèn)題?怎樣解決啊~?原理圖及PCB見(jiàn)附件 pcb.jpg

 

#include "regx51.h"

#include "string.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

typedef unsigned char byte;

typedef unsigned int  word;


//*********** 1602引腳定義引腳

#define LCM_RS   P2_0    // 數(shù)據(jù)/命令選擇信號(hào)

#define LCM_RW   P2_1    // 讀/寫(xiě)選擇信號(hào)

#define LCM_E    P2_2    // 使能信號(hào)


//*********** DS1302 時(shí)間顯示定義部分

sbit T_CLK=P1^0;         //串行時(shí)鐘輸入

sbit T_IO =P1^1;         //串行數(shù)據(jù)端口

sbit T_RST=P1^2;         //復(fù)位端口


//*********** 18B20溫度顯示定義部分

sbit DQ=P3^3; //18B20 接P33口

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;


#define LCM_Data P0      //顯示數(shù)據(jù)端口

#define Busy     0x80    //用于檢測(cè)LCM狀態(tài)字中的Busy標(biāo)識(shí)


uchar id,timecount;      //全局變量

bit  flag,sflag;         //flag是時(shí)鐘冒號(hào)閃爍標(biāo)志,sflag是溫度負(fù)號(hào)顯示標(biāo)志

bit  sec,min,hour,year,mon,day,weekk; //閃爍標(biāo)志位

//*********************函數(shù)申明

void   Disp_line1(void);             // 顯示屏幕第一行

void   Disp_line2(void);             // 顯示屏幕第二行

void   id_case1_key();               // id為1時(shí)的下一級(jí)選擇

void   Set(uchar,uchar);             // 根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目

void   RTInputByte(uchar);           /* 輸入 1Byte */

uchar  RTOutputByte(void);           /* 輸出 1Byte */

void   W1302(uchar, uchar);          // 向DS1302寫(xiě)入一個(gè)字節(jié)

uchar  R1302(uchar);                 // 從DS1302讀出一個(gè)字節(jié)

void   Set1302(uchar * );            // 設(shè)置時(shí)間

//******* 1602LCD驅(qū)動(dòng) **********************************************************

void   WriteDataLCM(uchar WDLCM);           //寫(xiě)數(shù)據(jù)

void   WriteCommandLCM(uchar WCLCM,BuysC);  //寫(xiě)指令

uchar  ReadStatusLCM(void);                 //讀狀態(tài)

void   LCMInit(void);                       //LCM初始化

void   DisplayOneChar(uchar X, uchar Y, uchar DData);        //按指定位置顯示一個(gè)字符

void   DisplayListChar(uchar X, uchar Y, uchar code *DData); //按指定位置顯示一串字符

void   Delay5Ms(void);   //5ms延時(shí)

void   Delay400Ms(void); //400ms延時(shí)

       Read_Temperature(char,char);//溫度顯示

void   mychar(void);          //顯示自定義字符

void   adjust_res(char res);  //res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數(shù)分辨率分別對(duì)應(yīng)

                              //              0.5, 0.25, 0.125  

//初始化后設(shè)置為:07年07月04日 星期3 12點(diǎn)00分00秒

//      12:00:00 XX. C

//      07/07/04 Week.3

unsigned char inittime[7]={0x00,0x00,0x12,0x04,0x07,0x03,0x07};

//                          秒  分鐘 小時(shí)  日   月  星期  年 

uchar code week[]={"Week."};//星期顯示

 

 

 

 //主函數(shù)

void main(void)

  Delay400Ms();  //啟動(dòng)等待,等LCM講入工作狀態(tài)

  LCMInit();     //LCM初始化

  Delay5Ms();    //延時(shí)片刻(可不要)

  mychar();      //顯示自定義字符


  TMOD=0x01;     //選擇定時(shí)模式

  TH0=(65535-50000)/256;//取定時(shí)初值

  TL0=(65535-50000)%256;

  EA=1;             //開(kāi)中斷

  TR0=1;

  ET0=1; 

  W1302(0x90,0xa5); //打開(kāi)充電二級(jí)管  一個(gè)二級(jí)管串聯(lián)一個(gè)2K電阻

  W1302(0x8e,0x80); //寫(xiě)保護(hù),禁止寫(xiě)操作

  adjust_res(0x5f); //調(diào)整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125


  while(1)

    {             

     if ((P1_4|P1_5)==0)   // 初始化 同時(shí)按下P1_4、P1_5

      {

         Delay5Ms();       // 適當(dāng)延時(shí),消除抖動(dòng)

         if ((P1_4|P1_5)==0) Set1302(inittime); // 顯示初始值

      }

     if (P1_6==0)                               // 設(shè)置和選擇項(xiàng)目鍵

      {

         Delay5Ms();                            // 適當(dāng)延時(shí),消除抖動(dòng)

         if(P1_6==0){id++;if(id>7) id=0;}       // 7個(gè)可調(diào)節(jié)項(xiàng)目循環(huán)調(diào)節(jié)

         while(P1_6==0);   

      }

     switch(id) // 跳轉(zhuǎn)到對(duì)應(yīng)的項(xiàng)目進(jìn)行設(shè)置

      {

         case 0:

                sec=0;

                Disp_line1(); Disp_line2();

                break;

         case 1: //調(diào)節(jié)年

                year=1;//設(shè)置年閃爍標(biāo)志位

                Disp_line1(); Disp_line2();                  

                id_case1_key();

                break;

         case 2: //調(diào)節(jié)月

                year=0;mon=1;//設(shè)置月閃爍標(biāo)志位

                Disp_line1(); Disp_line2();                

                id_case1_key();

                break;

         case 3: //調(diào)節(jié)日

                mon=0;day=1;//設(shè)置日閃爍標(biāo)志位

                Disp_line1(); Disp_line2();

                id_case1_key();

                break;            

         case 4: //調(diào)節(jié)星期

                day=0;weekk=1;//設(shè)置星期閃爍標(biāo)志位

                Disp_line1(); Disp_line2();        

                id_case1_key();

                break;

         case 5: //調(diào)節(jié)小時(shí)

                weekk=0;hour=1;//設(shè)置小時(shí)閃爍標(biāo)志位

                Disp_line1(); Disp_line2();

                id_case1_key();     

                break;      

         case 6: //調(diào)節(jié)分鐘

                hour=0;min=1;//設(shè)置分鐘閃爍標(biāo)志位

                Disp_line1(); Disp_line2();

                id_case1_key();

                break;

         case 7: //調(diào)節(jié)秒

                min=0;sec=1;//設(shè)置秒鐘閃爍標(biāo)志位

                Disp_line1(); Disp_line2();            

                id_case1_key();

                break;      

      }

    }

}

//================================== 定時(shí)中斷

/*****************************************************

// 函 數(shù) 名:void t0()

// 功    能:時(shí)間工作時(shí),冒號(hào)閃爍

 //T0中斷入口,方式1

 

void t0(void) interrupt 1 using 0

{

  TH0=(65535-50000)/256; //取50ms定時(shí)初值

  TL0=(65535-50000)%256; 

  timecount++;

  if(timecount>9)

   {

    timecount=0;    //計(jì)時(shí)到,從先開(kāi)始

    flag=~flag;     //標(biāo)志位取反         

   } 

}

//==================================== 項(xiàng)目設(shè)置

/*****************************************************

 函 數(shù) 名:void id_case1_key()

 功    能:項(xiàng)目設(shè)置加減控制

 說(shuō)    明:P1.5和P1.4 <==> +和-

 *****************************************************/

//id為1時(shí)的下一級(jí)選擇

void id_case1_key()

{

   if (P1_5==0)     //P1_5有按下,則數(shù)值增加(+)

      {

       Delay5Ms(); //適當(dāng)延時(shí),消除抖動(dòng)

       if(P1_5==0) Set(id,0);  //根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目

       if(id!=7)  while(P1_5==0);   

      }

   if (P1_4==0)    //P1_4有按下,則數(shù)值減少(-)

      {

       Delay5Ms(); //適當(dāng)延時(shí),消除抖動(dòng)

       if(P1_4==0) Set(id,1);     //根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目    

       if(id!=7) while(P1_4==0);   

      }

}

/*****************************************************

 函 數(shù) 名:void Set()

 功    能:項(xiàng)目設(shè)置

 說(shuō)    明:sel_1=0時(shí),數(shù)值加;sel_1=1時(shí),數(shù)值減

 入口參數(shù):sel和sel_1

 *****************************************************/

//根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目并寫(xiě)入DS1302

void Set(uchar sel,uchar sel_1)

{

  signed char address,item;

  signed char max,mini;

  //偶數(shù)指令是寫(xiě),奇數(shù)指令是讀

  //最大值與最小值限定

  if(sel==7)  {address=0x80; max=00;mini=0;}    //秒

  if(sel==6)  {address=0x82; max=59;mini=0;}    //分鐘

  if(sel==5)  {address=0x84; max=23;mini=0;}    //小時(shí)

  if(sel==3)  {address=0x86; max=31;mini=1;}    //日

  if(sel==2)  {address=0x88; max=12;mini=1;}    //月

  if(sel==1)  {address=0x8c; max=99;mini=0;}    //年

  if(sel==4)  {address=0x8a; max=07;mini=1;}    //星期

  //先從1302中讀出數(shù)據(jù),把數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制進(jìn)行加減設(shè)置;后從先轉(zhuǎn)換回來(lái)寫(xiě)入1302中

  item=R1302(address+1)/16*10+R1302(address+1)%16;//從1302中讀出1字節(jié),再轉(zhuǎn)換成十進(jìn)制

  if (sel_1==0) item++;  else item--; //sel_1=0則加,sel_1=1則減

  if(item>max) item=mini;   //大于最大值,則賦最小值(循環(huán))

  if(item<mini) item=max;   //小于最小值,則賦最大值(循環(huán))

          

  W1302(0x8e,0x00);   //允許寫(xiě)操作

  W1302(address,item/10*16+item%10);//把調(diào)節(jié)好的十進(jìn)制數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制后寫(xiě)入1302中

  W1302(0x8e,0x80);   //寫(xiě)保護(hù),禁止寫(xiě)操作 

}

//=======================================================================================

/*****************************************************

 函 數(shù) 名:void Disp_line1()

 功    能:顯示時(shí)間和溫度 (XX:XX:XX XX.X C)

 說(shuō)    明:第一行顯示數(shù)據(jù)處理

 入口參數(shù):無(wú)

 返 回 值:無(wú) 

 *****************************************************/

//屏幕顯示第一行: 時(shí)間和溫度顯示

void Disp_line1(void)

  Read_Temperature(10,0); //溫度顯示

  //冒號(hào)閃爍    

  if(flag==0)

    {DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}

  else

    {DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}

  if(sec==1)  //秒閃爍標(biāo)志位

    {

     if(flag==1)

       {   

        DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒十位

        DisplayOneChar(8,0,R1302(0x81)%16+0x30); //顯示秒個(gè)位     

       }

     else

       {

        DisplayOneChar(7,0,0x20); //顯示秒十位

        DisplayOneChar(8,0,0x20); //顯示秒個(gè)位

       }

    }

  else

    {

     DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒十位

     DisplayOneChar(8,0,R1302(0x81)%16+0x30); //顯示秒個(gè)位       

    }   

  

  if(min==1)  //分鐘閃爍標(biāo)志位

    {

     if(flag==1)

       {   

        DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘十位

        DisplayOneChar(5,0,R1302(0x83)%16+0x30); //顯示分鐘個(gè)位      

       }

     else

       {

        DisplayOneChar(4,0,0x20); //顯示分鐘十位

        DisplayOneChar(5,0,0x20); //顯示分鐘個(gè)位  

       }

    }

  else

    {

     DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘十位

     DisplayOneChar(5,0,R1302(0x83)%16+0x30); //顯示分鐘個(gè)位       

    }

  if(hour==1)  //小時(shí)閃爍標(biāo)志位

    {

     if(flag==1)

       {   

        DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時(shí)十位

        DisplayOneChar(2,0,R1302(0x85)%16+0x30);//顯示小時(shí)個(gè)位

       }

     else

       {

        DisplayOneChar(1,0,0x20); //顯示小時(shí)十位

        DisplayOneChar(2,0,0x20); //顯示小時(shí)個(gè)位  

       }

    }

  else

   {

    DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時(shí)十位

    DisplayOneChar(2,0,R1302(0x85)%16+0x30);//顯示小時(shí)個(gè)位

   }

}

/*****************************************************

 函 數(shù) 名:void Disp_line2()

 功    能:顯示日期和星期 (XX/XX/XX Week.X)

 說(shuō)    明:第二行顯示數(shù)據(jù)處理

 *****************************************************/

// 屏幕顯示第二行  日期和星期  

void Disp_line2(void)

{

  DisplayOneChar(3,1,0x2f);  //顯示固定字符

  DisplayOneChar(6,1,0x2f);

  DisplayListChar(10,1,week);

   

  if(year==1)  //年閃爍標(biāo)志位

    {

     if(flag==1)

       {   

        DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年十位

        DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//顯示年個(gè)位

       }

     else

       {

        DisplayOneChar(1,1,0x20); //顯示年十位

        DisplayOneChar(2,1,0x20); //顯示年個(gè)位  

       }

    }

  else

    {

      DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年十位

      DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//顯示年個(gè)位

    }

    

  if(mon==1)  //月閃爍標(biāo)志位

    {

     if(flag==1)

       {   

        DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月十位

        DisplayOneChar(5,1,R1302(0x89)%16+0x30);//顯示月個(gè)位

       }

     else

       {

        DisplayOneChar(4,1,0x20); //顯示月十位

        DisplayOneChar(5,1,0x20); //顯示月個(gè)位  

       }

    }

  else

    {

      DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月十位

      DisplayOneChar(5,1,R1302(0x89)%16+0x30);//顯示月個(gè)位

    }  

  if(day==1)  //日閃爍標(biāo)志位

    {

     if(flag==1)

       {   

         DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日十位

         DisplayOneChar(8,1,R1302(0x87)%16+0x30);//顯示日個(gè)位

       }

     else

       {

        DisplayOneChar(7,1,0x20); //顯示日十位

        DisplayOneChar(8,1,0x20); //顯示日個(gè)位  

       }

    }

  else

    {

      DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日十位

      DisplayOneChar(8,1,R1302(0x87)%16+0x30);//顯示日個(gè)位

    }

   if(weekk==1)  //星期閃爍標(biāo)志位

    {

     if(flag==1)

       {   

         DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期

       }

     else

       {

        DisplayOneChar(15,1,0x20); //顯示星期         

       }

    }

  else

    {

      DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期

    }    

}

 

sch.jpg
回復(fù)

使用道具 舉報(bào)

ID:17087 發(fā)表于 2009-12-10 15:44 | 顯示全部樓層

//================================ LCM1602控制部分 =======================================

/*****************************************************

 函 數(shù) 名:void WriteDataLCM()

 功    能:向LCM1602中寫(xiě)入數(shù)據(jù)

 說(shuō)    明:將形參WDLCM中的數(shù)據(jù)寫(xiě)入LCM中

 入口參數(shù):WDLCM

 *****************************************************/

//寫(xiě)數(shù)據(jù)

void WriteDataLCM(uchar WDLCM)

{

  ReadStatusLCM(); //檢測(cè)忙

  LCM_Data = WDLCM;//寫(xiě)入數(shù)據(jù)到LCM

  LCM_RS = 1;

  LCM_RW = 0;

  LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)

  LCM_E = 0; //延時(shí)

  LCM_E = 1;

}

/*****************************************************

 函 數(shù) 名:void WriteCommandLCM()

 功    能:向LCM1602中寫(xiě)入指令

 說(shuō)    明:向LCM中寫(xiě)入指令;如果BuysC=0時(shí),忽略忙檢測(cè),如果BuysC=1時(shí),不忽略忙檢測(cè)

 入口參數(shù):WCLCM,BuysC

 返 回 值:無(wú) 

 *****************************************************/

//寫(xiě)指令

void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測(cè)

{

  if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測(cè)忙

  LCM_Data = WCLCM;   //寫(xiě)入指令

  LCM_RS = 0;

  LCM_RW = 0;

  LCM_E = 0;

  LCM_E = 0;

  LCM_E = 1;

}

/*****************************************************

 函 數(shù) 名:uchar ReadStatusLCM()

 功    能:讀狀態(tài)

 說(shuō)    明:判斷LCM的工作狀態(tài);也可以不用此函數(shù),用一段延時(shí)程序代替

 入口參數(shù):無(wú)

 返 回 值:LCM_Data 

 *****************************************************/

//讀狀態(tài)

uchar ReadStatusLCM(void)

{

  LCM_Data = 0xFF; //LCM數(shù)據(jù)口先置1

  LCM_RS = 0;

  LCM_RW = 1;

  LCM_E = 0;

  LCM_E = 0;

  LCM_E = 1;

  while (LCM_Data & Busy); //檢測(cè)忙信號(hào).如果忙,則不執(zhí)行

  return(LCM_Data);//不忙返回讀取數(shù)據(jù)

}

/*****************************************************

 函 數(shù) 名:void LCMInit()

 功    能:初始化LCM1602

 說(shuō)    明:LCM在工作前先要對(duì)顯示屏初始化,否則模塊無(wú)法正常工作

 入口參數(shù):無(wú)

 返 回 值:五 

 *****************************************************/

//LCM初始化

void LCMInit(void)

{

  LCM_Data = 0;

  WriteCommandLCM(0x38,0); // 三次顯示模式設(shè)置,不檢測(cè)忙信號(hào)

  Delay5Ms();

  WriteCommandLCM(0x38,0); // 0x38指令表示:8位數(shù)據(jù)顯示模式,倆行多顯示

  Delay5Ms();

  WriteCommandLCM(0x38,0);

  Delay5Ms();

  WriteCommandLCM(0x38,1); // 顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)

  WriteCommandLCM(0x08,1); // 關(guān)閉顯示

  WriteCommandLCM(0x01,1); // 顯示清屏

  WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動(dòng)設(shè)置

  WriteCommandLCM(0x0C,1); // 顯示開(kāi)及光標(biāo)設(shè)置

}

/*****************************************************

 函 數(shù) 名:void DisplayOneChar()

 功    能:按指定坐標(biāo)中寫(xiě)入數(shù)據(jù)

 說(shuō)    明:X-橫坐標(biāo),Y-縱坐標(biāo)

 入口參數(shù):X,Y,DData

 返 回 值: 

 *****************************************************/

//按指定位置顯示一個(gè)字符

void DisplayOneChar(uchar X, uchar Y, uchar DData)

{

  Y &= 0x01;

  X &= 0x0F;              //限制X不能大于15,Y不能大于1

  if (Y) X |= 0x40;       //當(dāng)要顯示第二行時(shí)地址碼+0x40;

  X |= 0x80;              //算出指令碼

  WriteCommandLCM(X, 0);  //這里不檢測(cè)忙信號(hào),發(fā)送地址碼

  WriteDataLCM(DData);

}

/*****************************************************

 函 數(shù) 名:void DisplayListChar()

 功    能:向指定坐標(biāo)中寫(xiě)入字符串

 說(shuō)    明:X-橫坐標(biāo),Y-縱坐標(biāo)

 入口參數(shù):X,Y,*DData

 返 回 值: 

 *****************************************************/

//按指定位置顯示一串字符  ***原來(lái)的遇到空格0x20就不顯示***

void DisplayListChar(uchar X, uchar Y, uchar code *DData)

{

  uchar ListLength,j;

  ListLength = strlen(DData);//strlen:讀取字符串的長(zhǎng)度

  Y &= 0x1;

  X &= 0xF; //限制X不能大于15,Y不能大于1

      if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF

        {

      for(j=0;j<ListLength;j++)

        {

             DisplayOneChar(X, Y, DData[j]); //顯示單個(gè)字符

             X++;//橫坐標(biāo)加1,縱坐標(biāo)不變

            }

        }

}

//=================================== 自定義字符 ==========================================

/*****************************************************

 函 數(shù) 名:void mychar()

 功    能:自定義字符--CGRAM

 說(shuō)    明:LCM1602字符庫(kù)中沒(méi)有溫度符號(hào),自定義溫度符號(hào)

 入口參數(shù):無(wú)

 返 回 值:無(wú)

 定義形式:1602中定義CGRAM的形式如下:

 ---------------------------------------------------------------------------

 |          CGRAM地址設(shè)置              |        自定義的代碼               |

 | DB7 DB6 | DB5 DB4 DB3 | DB2 DB1 DB0 | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0   |

 |  0   1  |  0   0   0  |  X   X   X  |  0   0   0   0   *   0   0   0    |

 |  0   1  |  0   0   1  |  X   X   X  |  0   0   0   0   *   0   0   1    |

 |   ...   |     ...     |     ...     |       ...               ...       |

 |  0   1  |  1   1   0  |  X   X   X  |  0   0   0   0   *   1   1   0    |

 |  0   1  |  1   1   1  |  X   X   X  |  0   0   0   0   *   1   1   1    |

 ---------------------------------------------------------------------------

  1. 1602共能定義8個(gè)5x8字符;

  2. CGRAM地址設(shè)置: X X X--DB2 DB1 DB0對(duì)應(yīng)寫(xiě)入地址,1~8行;

  DB5 DB4 DB3對(duì)應(yīng)自定義字符代碼;DB7 DB6為指令碼,不可變.

  3. 自定義的代碼: 高4位DB7 DB6 DB5 DB4為0000時(shí)它的低3位DB2 DB1 DB0對(duì)應(yīng)于第1-8個(gè),DB3為無(wú)關(guān)項(xiàng)。

  4. 自定義的代碼的DB2 DB1 DB0對(duì)應(yīng)于CGRAM地址的DB5 DB4 DB3。

 *****************************************************/

void mychar()

{

//---------自定義字符代碼--01H-------------------

  WriteCommandLCM(0x48,0); //第1行  

  WriteDataLCM(0x02);//              

  WriteCommandLCM(0x49,0); //第2行  

  WriteDataLCM(0x05);//               

  WriteCommandLCM(0x4a,0); //第3行    1------**--

  WriteDataLCM(0x05);//               2----**--**

  WriteCommandLCM(0x4b,0); //第4行    3----**--**

  WriteDataLCM(0x02);//               4------**--

  WriteCommandLCM(0x4c,0); //第5行    5----------

  WriteDataLCM(0x00);//               6----------

  WriteCommandLCM(0x4d,0); //第6行    7----------

  WriteDataLCM(0x00);//               8----------

  WriteCommandLCM(0x4e,0); //第7行  

  WriteDataLCM(0x00);//

  WriteCommandLCM(0x4f,0); //第8行  

  WriteDataLCM(0x00);//

//-----------------------------------------------

}

//======================================= 延時(shí)函數(shù)部分 ====================================

/*****************************************************

 函 數(shù) 名:void Delay5Ms()

 功    能:5ms延時(shí)

 說(shuō)    明:軟件消除按鍵抖動(dòng)和適當(dāng)?shù)难訒r(shí)

 入口參數(shù):無(wú)

 返 回 值:無(wú) 

 *****************************************************/

//5ms延時(shí)

void Delay5Ms(void)

{

  uint TempCyc = 5552; //放入延時(shí)數(shù)據(jù)

  while(TempCyc--);

}

/*****************************************************

 函 數(shù) 名:void Delay400Ms()

 功    能:400ms延時(shí)

 說(shuō)    明:

 入口參數(shù):無(wú)

 返 回 值:無(wú) 

 *****************************************************/

//400ms延時(shí)

void Delay400Ms(void)

{

  uchar TempCycA = 5;

  uint TempCycB;

  while(TempCycA--)

   {

     TempCycB=7269;

     while(TempCycB--);

   };

}

 

[此貼子已經(jīng)被作者于2009-12-10 15:45:26編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:17087 發(fā)表于 2009-12-10 15:44 | 顯示全部樓層

//================================== 時(shí)鐘芯片控制部分 ======================================

/*****************************************************

 函 數(shù) 名:RTInputByte()

 功    能:實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)

 說(shuō)    明:往DS1302寫(xiě)入1Byte數(shù)據(jù) (內(nèi)部函數(shù))

 入口參數(shù):d 寫(xiě)入的數(shù)據(jù)

 返 回 值:無(wú) 

 *****************************************************/

void RTInputByte(uchar d)

{

    uchar i;

    ACC = d;

    for(i=8; i>0; i--)

    {

        T_IO = ACC0;           /*相當(dāng)于匯編中的 RRC */

        T_CLK = 1;

        T_CLK = 0;

        ACC = ACC >> 1;

    }

}

/*****************************************************

 函 數(shù) 名:RTOutputByte()

 功    能:實(shí)時(shí)時(shí)鐘讀取一字節(jié)

 說(shuō)    明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))

 入口參數(shù):無(wú) 

 返 回 值:ACC

 設(shè)    計(jì):zhaojun              日    期:2007-06-29

 修    改:                     日    期:

*****************************************************/

uchar RTOutputByte(void)

{

    uchar i;

    for(i=8; i>0; i--)

    {

        ACC = ACC >>1;    /*相當(dāng)于匯編中的 RRC */

        ACC7 = T_IO;

        T_CLK = 1;

        T_CLK = 0;

    }

    return(ACC); //返回讀取值

}

/*****************************************************

 函 數(shù) 名:W1302()

 功    能:往DS1302寫(xiě)入數(shù)據(jù)

 說(shuō)    明:先寫(xiě)地址,后寫(xiě)命令/數(shù)據(jù) (內(nèi)部函數(shù))

 調(diào)    用:RTInputByte() , RTOutputByte()

 入口參數(shù):ucAddr: DS1302地址, ucData: 要寫(xiě)的數(shù)據(jù)

 返 回 值:無(wú)

 *****************************************************/

void W1302(uchar ucAddr, uchar ucDa)

{

    T_RST = 0;

    T_CLK = 0;

    T_RST = 1;

    RTInputByte(ucAddr);     /* 地址,命令 */

    RTInputByte(ucDa);       /* 寫(xiě)1Byte數(shù)據(jù)*/

    T_CLK = 1;

    T_RST = 0;

}

/******************************************************

 函 數(shù) 名:R1302()

 功    能:讀取DS1302某地址的數(shù)據(jù)

 說(shuō)    明:先寫(xiě)地址,后讀命令/數(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è)置初始時(shí)間

 說(shuō)    明:先寫(xiě)地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)

 調(diào)    用:W1302()

 入口參數(shù):pClock: 設(shè)置時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年

                               7Byte (BCD碼)1B 1B 1B 1B 1B  1B  1B

 返 回 值:無(wú)

********************************************************/

void Set1302(uchar *pClock)

{

    uchar i;

    uchar ucAddr = 0x80;

    W1302(0x8e,0x00);           /* 控制命令,WP=0,寫(xiě)操作?*/

    for(i =7; i>0; i--)

    {

        W1302(ucAddr,*pClock);  /* 秒 分 時(shí) 日 月 星期 年 */

        pClock++;

        ucAddr +=2;

    }

    W1302(0x8e,0x80);           /* 控制命令,WP=1,寫(xiě)保護(hù)?*/

}

//================================= 溫度顯示控制部分 ===============================================

/*****************************************************

 函 數(shù) 名:void delay()

 功    能:DS18B20延時(shí)

 說(shuō)    明:DS18B20時(shí)序延時(shí)

 入口參數(shù):useconds

 返 回 值:無(wú) 

 *****************************************************/

//*********** 18B20驅(qū)動(dòng) **************************

//延時(shí)

void delay(word useconds)

{

  for(;useconds>0;useconds--);

}

/*****************************************************

 函 數(shù) 名:byte ow_reset()

 功    能:DS18B20復(fù)位

 說(shuō)    明:DS18B20使用時(shí)先要復(fù)位

 入口參數(shù):無(wú)

 返 回 值:presence 

 *****************************************************/

//復(fù)位

byte ow_reset(void)

{

  byte presence;

  DQ = 0;           //拉低總線

  delay(29);        // 保持 480us

  DQ = 1;           // 釋放總線

  delay(3);         // 等待回復(fù)

  presence = DQ;    // 讀取信號(hào)

  delay(25);        // 等待結(jié)束信號(hào)

  return(presence); // 返回   0:正常 1:不存在

}    

/*****************************************************

 函 數(shù) 名:byte read_byte()

 功    能:從 1-wire 總線上讀取一個(gè)字節(jié)

 說(shuō)    明:讀總線上的數(shù)據(jù)有嚴(yán)格的時(shí)序

 入口參數(shù):

 返 回 值:value 

 *****************************************************/

byte read_byte(void)

{

  byte i;

  byte value = 0;

  for (i=8;i>0;i--)

  {

    value>>=1;

    DQ = 0;

    DQ = 1;

    delay(1); 

    if(DQ)value|=0x80;

    delay(6);

  }

  return(value);

}

/*****************************************************

 函 數(shù) 名:void write_byte()

 功    能:向 1-WIRE 總線上寫(xiě)一個(gè)字節(jié)

 說(shuō)    明:寫(xiě)總線上的數(shù)據(jù)有嚴(yán)格的時(shí)序

 入口參數(shù):val

 返 回 值:無(wú) 

 *****************************************************/

void write_byte(char val)

{

  byte i;

  for (i=8; i>0; i--) // 一次寫(xiě)一位

  {

    DQ = 0;          //

    DQ = val&0x01;

    delay(5);        //

    DQ = 1;

    val=val/2;

  }

  delay(5);

}

/*****************************************************

 函 數(shù) 名:Read_Temperature()

 功    能:讀取和顯示溫度

 說(shuō)    明:

 入口參數(shù):xx,yy

 返 回 值:無(wú) 

 *****************************************************/

Read_Temperature(char xx,char yy)

{

  uchar i,tl_temp;

  uint  x;

  uchar ct[8];

  union   //共用體

  {

    byte c[2];

    int x;

  }temp;   

 

  ow_reset();             // DS18B20復(fù)位

  write_byte(0xCC);       // Skip ROM

  write_byte(0x44);       // 轉(zhuǎn)換溫度

  ow_reset();

  write_byte(0xCC);       // Skip ROM

  write_byte(0xbe);       // 讀取寄存器

  temp.c[1]=read_byte();  // 讀出溫度低8位

  temp.c[0]=read_byte();  // 讀出溫度高8位

  // 零下溫度判斷

  sflag=0; //溫度零下標(biāo)志 0:零上,1:零下

  if((temp.c[0]&0xf8)!=0x00)

   {

    sflag=1;                        // 零下標(biāo)志位置1

    temp.c[1]=~temp.c[1];           // 低8位取反

    temp.c[0]=~temp.c[0];           // 高8位取反

    tl_temp=temp.c[1]+1;            // 低8位加1

    temp.c[1]=tl_temp;              // 計(jì)算后重新存入數(shù)組

    if(tl_temp>255) temp.c[0]++;    // 如果低8位大于255,向高8位進(jìn)1

  } 

  x=((temp.c[0]&0x07)*256+temp.c[1])*.625;

  for(i=0;i<8;i++)

       {

         ct=0;

       }

  i=0;

  while(x/10)

   {

    ct=x%10;

    x=x/10;

    i++;

   }

  ct=x;

  if(sflag==1) DisplayOneChar(xx-1,yy,0x2d);

  else         DisplayOneChar(xx-1,yy,0x20);

  DisplayOneChar(xx,  yy,ct[2]+0x30);        // 顯示溫度十位數(shù)

  DisplayOneChar(xx+1,yy,ct[1]+0x30);        // 顯示溫度個(gè)位數(shù)

  DisplayOneChar(xx+2,yy,0x2e);              // 顯示小數(shù)點(diǎn)

  DisplayOneChar(xx+3,yy,ct[0]+0x30);        // 顯示溫度小數(shù)位

  DisplayOneChar(xx+4,yy,0x01);              // 顯示自定義字符

  DisplayOneChar(xx+5,yy,0x43);              // 顯示字符"C"

}

/*****************************************************

 函 數(shù) 名:void adjust_res()

 功    能:溫度分辨率調(diào)整

 說(shuō)    明:此函數(shù)可以對(duì)溫度的顯示進(jìn)行精度調(diào)節(jié).

 入口參數(shù):res

 返 回 值:無(wú) 

 *****************************************************/

void adjust_res(char res)  // res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數(shù)分辨率分別對(duì)應(yīng)

                           //               0.5, 0.25, 0.125  

{

  ow_reset();             // 復(fù)位

  write_byte(0xcc);       // 跳過(guò)Rom

  write_byte(0x4e);       // 寫(xiě)暫存器

  write_byte(0x02);       // 寫(xiě)TH

  write_byte(0x01);       // 寫(xiě)TL

  write_byte(res);        // 溫度轉(zhuǎn)換分辨率設(shè)置

  ow_reset();             // 復(fù)位

  write_byte(0xcc);       // 跳過(guò)Rom

  write_byte(0x48);       // 把暫存器內(nèi)容寫(xiě)到EPRam中

}

//==========================程序結(jié)束======================================================

[此貼子已經(jīng)被作者于2009-12-10 15:47:04編輯過(guò)]
回復(fù)

使用道具 舉報(bào)

ID:17087 發(fā)表于 2009-12-11 20:52 | 顯示全部樓層

咋沒(méi)人鳥(niǎo)一下呢?~~

回復(fù)

使用道具 舉報(bào)

ID:20595 發(fā)表于 2009-12-29 21:52 | 顯示全部樓層
我鳥(niǎo)你一下,可惜我看不懂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲亚洲人成综合网络 | 久久机热这里只有精品 | 久久夜色精品国产欧美乱极品 | 夜间福利视频 | 成人三级在线观看 | 日韩视频一区二区 | 97中文字幕 | 一区二区三区视频在线播放 | 欧美综合久久 | 中文字幕在线观看不卡 | 日本不卡在线 | 日韩亚洲一区二区 | 一区二区三区亚洲 | 日韩欧美小视频 | 亚洲色欧美 | 国产一区精品在线观看 | 中文字幕日韩视频 | 欧美精品日韩少妇 | 国产自产21区 | 婷婷激情五月 | 一级黄色片在线观看 | 欧美在线观看一区 | 成人免费黄色大片 | 国产福利在线播放 | 国产伦精品一区二区三区视频网站 | 国产精品久久久久久久久久辛辛 | 国产一区二区网站 | 欧美综合久久 | 午夜激情福利视频 | 日韩在线播放视频 | 精品久久久久久久久久久久久 | 日本综合久久 | 午夜成人在线视频 | 欧美日韩一区二区三区视频 | 欧美日本在线 | 少妇一级淫片免费观看 | 欧美一级在线观看 | 日韩三级网 | 国产美女av| 国产91清纯白嫩初高中在线观看 | 日日骚av|