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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1950|回復: 1
打印 上一主題 下一主題
收起左側

單片機LCD1602的0顯示不正常是程序哪一部分錯誤,如ds1302.h

[復制鏈接]
跳轉到指定樓層
樓主

#ifndef _DS1302_H_
#define _DS1302_H_
#define uchar unsigned char
sbit SCLK=P2^3;  //ds1302時鐘線定義
sbit IO=P2^4;    //數據線
sbit RST=P2^5;         //復位線
uchar sec,min,hour,day,mon,year,week;
//uchar n_year,n_mon,n_day;//農歷顯示的函數

/*------------------------------------------------
                    DS1302編程部分
------------------------------------------------*/

void write_1302(uchar add,uchar dat) //寫操作 (寫地址+寫數據)
{
        uchar i;
        RST=1;                 //把復位線拉高
        for(i=0;i<8;i++)
        {
                SCLK=0;//時鐘信號為低,開始寫地址
                IO = add & 0x01;            
                add >>= 1;                 //把地址右移一位
                SCLK=1;                         //時鐘線拿高
        }
        for(i=0;i<8;i++)
        {
                SCLK=0;//時鐘信號為低,開始寫數據
                IO = dat & 0x01;            
                dat >>= 1;                 //把地址右移一位
                SCLK=1;                         //時鐘線拿高
        }
        SCLK=0;
        RST=0;//寫操作結束
        IO =0;
}
uchar read_1302(uchar add)        //讀操作(寫地址+讀數據)
{
        uchar i,value;
        RST=0;
        SCLK=0;
        RST=1;                 //把復位線拉高
        for(i=0;i<8;i++)
        {
                SCLK=0;//時鐘信號為低,開始寫地址
                IO = add & 0x01; //讓IO保存add的最低位           
                add >>= 1;                 //把地址右移一位
                SCLK=1;                         //時鐘線拿高
        }
        for(i=0;i<8;i++)
        {
               
                value >>= 1;         //把數據右移一位
                if(IO == 1)  value |= 0x80; // 將數據放在value的最高位,達到保存數據的結果
                SCLK=0;//時鐘信號為低,開始寫數據        
                SCLK=1;                         //時鐘線拿高
        }
        SCLK=0;
        RST=0;//讀操作結束
        IO =0;
        return value;                 //返回讀出來的數據
}
uchar BCD_Decimal(uchar bcd)
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
/*************把要的時間 年月日 都讀出來***************/
void read_time()
{        
    sec = BCD_Decimal(read_1302(0x81));
        min = BCD_Decimal(read_1302(0x83));
        hour  = BCD_Decimal(read_1302(0x85));
        day  = BCD_Decimal(read_1302(0x87));
        mon = BCD_Decimal(read_1302(0x89));
        year=BCD_Decimal(read_1302(0x8d));
        week=BCD_Decimal(read_1302(0x8b));

//        Conversion(0,year,mon,day);        //農歷轉換                                    
//        n_year = year_moon ;
//        n_mon  = month_moon ;
//        n_day  = day_moon ;

}
                                                //秒  分   時   日   月  年   星期         
//uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //寫地址
//uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //讀地址
//uchar code tab1[]={"2020-06-19 FRI"};
//uchar code tab2[]={"10:32:48"};

/*************把要寫的時間 年月日 都寫入ds1302里***************/
void write_time()
{
    uchar temp;
    write_1302(0x80,sec|0x00);//允許寫
        write_1302(0x8e,0x00);                        //打開寫保護
        sec= (tab2[6]-0x30)*10+(tab2[7]-0x30);
        temp=(sec)/10*16+(sec)%10;
        write_1302(0x80,0x00|temp);

        min= (tab2[3]-0x30)*10+(tab2[4]-0x30);
        temp=(min)/10*16+(min)%10;
        write_1302(0x82,0x00|temp);

        hour= (tab2[0]-0x30)*10+(tab2[1]-0x30);
        temp=(hour)/10*16+(hour)%10;
        write_1302(0x84,0x00|temp);

        day= (tab1[8]-0x30)*10+(tab1[9]-0x30);
        temp=(day)/10*16+(day)%10;
        write_1302(0x86,0x00|temp);

        mon= (tab1[5]-0x30)*10+(tab1[6]-0x30);
        temp=(mon)/10*16+(mon)%10;
        write_1302(0x88,0x00|temp);

        write_1302(0x8e,0x80);                        //關閉寫保護
}
//*************把數據保存到ds1302 RAM中**0-31*************/
//void write_1302ram(uchar add,uchar dat)
//{
//        add <<= 1;     //地址是從第二位開始的
//        add &= 0xfe;   //把最低位清零  是寫的命令
//        add |= 0xc0;   //地址最高兩位為 1  
//        write_1302(0x8e,0x00);
//        write_1302(add,dat);        
//        write_1302(0x8e,0x80);
//}
//*************把數據從ds1302 RAM讀出來**0-31*************/
//uchar read_1302ram(uchar add)
//{
//        add <<= 1;     //地址是從第二位開始的
//        add |= 0x01;   //把最高位置1  是讀命令
//        add |= 0xc0;   //地址最高兩位為 1  
//        return(read_1302(add));        
//}                                                                                                                 



/*************初始化ds1302時間***************/
void init_ds1302()
{
        RST = 0;        //第一次讀寫數據時要把IO口拿低
        SCLK=0;
        IO= 0;
        write_time();
}

#endif


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:782437 發表于 2020-6-20 17:25 | 只看該作者
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define uchar unsigned char
#define uint unsigned int
uchar sec,min,hour,day,min,year,week;
sbit RS = P2^0;   //寄存器選擇信號 H:數據寄存器          L:指令寄存器
sbit RW = P2^1;          //讀寫選擇信號 H:讀          L:寫
sbit EN = P2^2;          //片選信號   下降沿觸發
#define yh 0x80  //第一行的初始位置
#define er 0x80+0x40 //第二行初始位置
uchar code tab1[]={"2020-06-19 FRI"};
uchar code tab2[]={"10:32:48"};
/***********************延時函數************************/
void delay(uint xms)//延時函數
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}
void delay_uint(uint q)
{
        while(q--);
}
/*------------------------------------------------
              寫入命令函數
------------------------------------------------*/
void LCD_Write_Cmd(uchar cmd)
{  

RS=0; //        選擇指令寄存器
RW=0;//寫操作
EN=0;//正跳變,將命令寫入液晶模塊
P0=cmd; //將命令送入P0
delay_uint(3);
EN=1;
delay_uint(25);
EN=0;
}
/*------------------------------------------------
              寫入數據函數
------------------------------------------------*/
void LCD_Write_Data(uchar Data)
{
RS=1; //選擇數據寄存器
RW=0; //寫操作
EN=0;
P0= Data; //將數據送入P0
delay_uint(3);
EN=1;
delay_uint(25);
EN=0;
}
/*------------------------------------------------
              寫入星期函數
------------------------------------------------*/
void LCD_Write_week(uchar week)
{     
    LCD_Write_Cmd(yh+0x0d);//將星期顯示到LCD的第一行的13位
        switch(week)
        {
                case 1:LCD_Write_Data('M');
                           LCD_Write_Data('O');
                           LCD_Write_Data('N');
                           break;
          
                case 2:LCD_Write_Data('T');
                           LCD_Write_Data('U');
                           LCD_Write_Data('E');
                           break;
               
                case 3:LCD_Write_Data('W');
                           LCD_Write_Data('E');
                           LCD_Write_Data('D');
                           break;
               
                case 4:LCD_Write_Data('T');
                           LCD_Write_Data('H');
                           LCD_Write_Data('U');
                           break;
               
                case 5:LCD_Write_Data('F');
                           LCD_Write_Data('R');
                           LCD_Write_Data('I');
                           break;
               
                case 6:LCD_Write_Data('S');
                           LCD_Write_Data('T');
                           LCD_Write_Data('A');
                           break;
               
                case 7:LCD_Write_Data('S');
                           LCD_Write_Data('U');
                           LCD_Write_Data('N');
                           break;  
         }
}

/*------------------------------------------------
              寫入時分秒函數
------------------------------------------------*/
void LCD_Write_sfm(uchar add,uchar dat)
{
uchar gw,sw;//定義十位 個位
gw=dat%10;
sw=dat/10;
LCD_Write_Cmd(er+add); ///將時分秒顯示到LCD的第二行的add位
LCD_Write_Data(0x30+sw);
LCD_Write_Data(0x30+gw);//0x30=48  十進制數+48=等于其ascll值   lcd1602為字符型  
}
/*------------------------------------------------
              寫入年月日函數
------------------------------------------------*/
void LCD_Write_nyr(uchar add,uchar dat)
{
uchar gw,sw;//定義十位 個位
gw=dat%10;
sw=dat/10;
LCD_Write_Cmd(yh+add); ///將時分秒顯示到LCD的第二行的add位
LCD_Write_Data(0x30+sw);
LCD_Write_Data(0x30+gw);//0x30=48  十進制數+48=等于其ascll值   lcd1602為字符型  
}
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(uchar x,uchar y,uchar *s)
{     
if (x == 0)
        {     
         LCD_Write_Cmd(0x80 + y);     //表示第一行
        }
else
        {      
        LCD_Write_Cmd(0xC0 + y);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}
/*------------------------------------------------
        開機液晶顯示函數
------------------------------------------------*/
void Init_1602()  //初始化液晶
{  
  LCD_Write_String(0,2,"Hello world");
}
/*------------------------------------------------
              初始化函數
------------------------------------------------*/
void LCD_Init(void)
{
   uchar i;
   LCD_Write_Cmd(0x38);//顯示模式設置:16x2顯示,5x7點陣,8位數據接口
   LCD_Write_Cmd(0x0c);    //顯示模式設置:顯示開,有光標
   LCD_Write_Cmd(0x06);   //顯示模式設置:光標右移,字符不移
   LCD_Write_Cmd(0x01);        //清屏
   Init_1602();
   delay(1000);
   LCD_Write_Cmd(yh+2);//字符寫入的位置--第一行第2位
           for(i=0;i<14;i++)
        {
        LCD_Write_Data(tab1[i]);
        }
        LCD_Write_Cmd(er+4);
        for(i=0;i<8;i++)                                                                          
        {
        LCD_Write_Data(tab2[i]);
        }

   }


#endif
這是LCD1602的程序
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人jvid在线播放 | 成人自拍视频 | 日本激情视频在线播放 | 精品久久国产 | 午夜精品久久久久久久99黑人 | 中文字幕精品一区二区三区在线 | 欧美一区二区三区在线观看 | 毛片区| 国产伦精品一区二区三区照片91 | 国偷自产av一区二区三区 | 日韩在线免费视频 | 一区二区三区在线免费观看 | 亚洲在线久久 | 欧美成人h版在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 91影院| 天天干 夜夜操 | av一级久久 | 久久久影院 | 一级二级三级在线观看 | 国产日韩欧美在线观看 | 亚洲国产欧美在线 | 99精品久久 | 欧美日韩在线成人 | 免费看一区二区三区 | 羞羞视频网站免费观看 | 日韩精品成人一区二区三区视频 | 欧美成年黄网站色视频 | 福利片在线 | 欧美日韩中文字幕在线播放 | 男人久久天堂 | 一区二区三区高清在线观看 | 亚洲高清在线播放 | 国产精品免费一区二区三区 | 精品一二三 | 国产精品久久久久久妇女6080 | 天堂亚洲 | 午夜视频一区 | 中文字幕免费视频 | 免费av毛片 | 欧美黄色网 |