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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12C5A60S2單片機和ds1302制作時鐘運行一會就飛了,麻煩大佬們看下我哪里有問題

  [復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:447439 發表于 2022-5-9 20:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
main函數:
void main()
{

        Time0_Init(10);
        Init_LCD1616();
        Clear_Screen(0);
        Write_6x16Font_N(1,0,0,);
        while(1)
        {
                GetKeyValue();        //讀取按鍵數據
                GotoDisplay();        //顯示時鐘芯片的數據
        }
}

顯示模塊函數:
void write(bit flag,uchar dat)
{
        LCD1616_CS=0;
        LCD1616_RS=flag;                                        //flag=1,write command;flag=0,write data
        LCD1616_WR=0;
        LCD1616_RD=1;
        LCDPort=dat;
        LCD1616_WR=1;
}



/**************LCD160160初始化***************************/
void Init_LCD1616()
{
        
        LCD1616_RST = 0;
        LCD_Delay(10);                        //power on reset
        LCD1616_RST = 1;               
        LCD_Delay(800);
        
write(0,0x25); //設置溫度補償系數-0.05%/C
write(0,0x2b); //內部 DC-DC
write(0,0xc4); // LCD 映像 MY=1,MX=0,LC0=0
write(0,0xa1); //設置行掃描頻率 FR=62.5Hz
write(0,0xd1); //彩色數據格式 R-G-B
write(0,0xd5); //設置數據位為 12 位 RRRR-GGGG-BBBB
write(0,0xc8); write(0,0x00); //設置 M 信號為幀翻轉
write(0,0xe9); //設置偏壓比 1/10
write(0,0xa6); //正性顯示
write(0,0xa4); //正常顯示
write(0,0x81); write(0,0xef); //設置對比度 bf
write(0,0xd8); //設置掃描模式
write(0,0xad); //開顯示
LCD_Delay(50);
        
        
}

/****************************清屏or全顯************************
Input :Dat;Dat=0,清屏;Dat =1,全顯.
1 column = 3 pixel;        1 pixel = 4bit;
UC1698的column:0X00-0X7F-->0-127;line: 0X00-0X9F-->0-159
但是160*160單色液晶的column為第37列到90列-->0X25-0X5A
        行地址范圍0-159行-->0X00-0X9F,實際是160*162,160行,54列
由于2 column = 6 pixel =24 bit = 3Byte,所以一行有27組(3Byte)
**************************************************************/
void Clear_Screen(uchar dat1)
{
        uchar i,j;
        write(0,0x60);                        //row address LSB    最低有效位
        write(0,0x70);                        //row address MSB    最高有效位
        write(0,0x05);                        //culomn address LSB 最低有效位
        write(0,0x12);                        //culomn address MSB 最高有效位

         for(j=0;j<160;j++)
        {
                for(i=0;i<27;i++)
               
                {
                        
                                write(1,dat1);        //見手冊中的第21條命令格式  將RGB的每3個字節存到16位寄存器中
                                write(1,dat1);
                                write(1,dat1);        
                }
        
        }
}

/****************寫一個宋體 小四***16*16*******************
16/3=5---1,補充兩,湊齊6列,6列x16行
*******************************************************/
void Write_6x16Font(u8 x,y,u8 *cn)
{
        u8 i=0;
        u8 WordNum=0;        //字符個數
        u8 ZiKuDat,YingSheDat;
        u16 x1,x2,y1,y2,L;
//--設置顯示區域        
        x+=0X25;                //此款LCD160的列是從第0X25列開始
        write(0,0XF4);        //列起始地址
        write(0,x);                //start: 37
        write(0,0XF6);        //列結束地址
        write(0,x+5);        //end: 90        
//因為列開始到結尾共90-37=53個數所以 一個數代表160/53=3個像素
        
        write(0,0XF5);        //行起始地址
        write(0,y);                //start:0
        write(0,0XF7);        // 行結束地址
        write(0,y+15);        //end:159        
        write(0,0XF8);
//--設置起始列,行地址        
        x1=0X00 |(x&0X0F);
        x2=0X10 |(x>>4);
        y1=0X60 |(y&0X0F);
        y2=0X70 |(y>>4);        
        write(0,x1);write(0,x2);
        write(0,y1);write(0,y2);
        write(0,0XA6);        
        
        for(WordNum=0;WordNum<WordNumMax;WordNum++)        //掃描漢字字庫
        {
        //--匹配字庫數據
                if(*cn == HanZi16X16[WordNum].Index[0] && *(cn+1)==HanZi16X16[WordNum].Index[1])
                {
                        for(i=0;i<16;i++)
                        {
                                ZiKuDat=HanZi16X16[WordNum].Msk[2*i];
                        //--完成8bit字庫數據的寫
                                for(L=0;L<4;L++)        
                                {
                                        switch(ZiKuDat&0XC0)        //判斷2bit字庫數據
                                        {
                                        //--將2bit字庫數據轉換成8bit映射數據
                                                case 0X00:YingSheDat=0X00;break;        
                                                case 0X40:YingSheDat=0X0F;break;
                                                case 0X80:YingSheDat=0XF0;break;
                                                case 0XC0:YingSheDat=0XFF;break;
                                        }
                                        write(1,YingSheDat);        //寫映射數據
                                        ZiKuDat<<=2;
                                }
                                ZiKuDat=HanZi16X16[WordNum].Msk[2*i+1];
                                for(L=0;L<4;L++)        
                                {
                                        switch(ZiKuDat&0XC0)        //判斷2bit字庫數據
                                        {
                                        //--將2bit字庫數據轉換成8bit映射數據
                                                case 0X00:YingSheDat=0X00;break;        
                                                case 0X40:YingSheDat=0X0F;break;
                                                case 0X80:YingSheDat=0XF0;break;
                                                case 0XC0:YingSheDat=0XFF;break;
                                        }
                                        write(1,YingSheDat);        //寫映射數據
                                        ZiKuDat<<=2;
                                }
                                write(1,0X00);        //補最后的一字節空白
                        }        
                }
        }
}

/*****************寫N個小四宋體**********
9列10行,x:0-9;y:0-10;
****************************************/
void Write_6x16Font_N(u8 x,y,z,u8 *cn)
{
        u8 Cnnum=0;
        x=x*3;
        y=y*16;
        if(z)        //豎著寫
        {
                while(*cn != '\0')
                {
                        Write_6x16Font(x,y+8*Cnnum,cn);
                        Cnnum++;
                        cn++;
                }               
        }
        else        //橫著寫        //6列16行
        {
                while(*cn != '\0')
                {
                        Write_6x16Font(x+3*Cnnum,y,cn);        //漢字占兩個字符
                        Cnnum++;
                        cn++;
                }
        }        
}

void Write_ASCII3X16(u8 x,y,u8 *p)
{
        u8 i=0;
        u8 WordNum=0;        //字符個數
        u8 ZiKuDat,YingSheDat;
        u16 x1,x2,y1,y2,L;
//--設置顯示區域        
        x+=0X25;        //此款LCD160的列是從第0X25列開始
        write(0,0XF4);        //列起始地址
        write(0,x);                //start: 37
        write(0,0XF6);        //列結束地址
        write(0,x+3);        //end: 90        //橫著寫        //write(0,x+3);        //豎著寫
        //因為列開始到結尾共90-37=53個數所以 一個數代表160/53=3個像素
        
        write(0,0XF5);        //行起始地址
        write(0,y);                //start:0
        write(0,0XF7);        // 行結束地址
        write(0,y+15);        //end:159        //write(0,y+15*WordNum);        //豎著寫
        write(0,0XF8);
//--設置起始列,行地址        
        x1=0X00 |(x&0X0F);
        x2=0X10 |(x>>4);
        y1=0X60 |(y&0X0F);
        y2=0X70 |(y>>4);        
        write(0,x1);write(0,x2);
        write(0,y1);write(0,y2);
        write(0,0XA6);
        
        WordNum = *p-32;
        for(i=0;i<16;i++)
        {
                ZiKuDat=ASCII8X16[WordNum][ i];
        //--完成8bit字庫數據的寫
                for(L=0;L<4;L++)        //寫3(前面2列)+1(補充1列的第一字節)
                {
                        switch(ZiKuDat&0XC0)        //判斷2bit字庫數據
                        {
                        //--將2bit字庫數據轉換成8bit映射數據
                                case 0X00:YingSheDat=0X00;break;        
                                case 0X40:YingSheDat=0X0F;break;
                                case 0X80:YingSheDat=0XF0;break;
                                case 0XC0:YingSheDat=0XFF;break;
                        }
                        write(1,YingSheDat);        //寫映射數據
                        ZiKuDat<<=2;
                }
        //--對補充的1列的最后一字節的寫
                write(1,0X00);
                write(1,0X00);
        }
}

/*******************寫一串字符串***3*16************
10行x18列
Input: x起始列地址,y起始行地址,*P 字符串,
           z:=0,橫著寫,=1豎著寫
**************************************************/
void Write_ASCII3X16_N(u8 x,y,z,u8 *p)
{
        u8 WordNum=0;
        x=x*3;
        y=y*16;
        if(z)
        {
                while(*p != '\0')
                {
                        Write_ASCII3X16(x,y+16*WordNum,p);
                        WordNum++;
                        p++;
                }               
        }
        else
        {
                while(*p != '\0')
                {
                        Write_ASCII3X16(x+3*WordNum,y,p);
                        WordNum++;
                        p++;
                }
        }
}


ds1302時鐘函數:

#include "DS1302.h"

u8 DS1302sec=1,DS1302min=1,DS1302hour=8;
u8 DS1302day=26,DS1302month=4,DS1302week,DS1302year=20;

/**********向1302寫某一地址和數據(指令)**************/
void Write_Byte_1302(u8 add,u8 dat)
{
        u8 i;
        DS1302SCL = 0;
        DS1302RST = 1;
        add = add & 0xfe;                //將控制指令的最低位清零,數據能夠輸入
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL = 1;                        //上升沿輸入數據
                DS1302SCL = 0;
                add >>= 1;
        }
        for(i=0;i<8;i++)
        {
                DS1302SDA = dat &0X01;
                DS1302SCL=1;                        //上升沿輸入數據
                DS1302SCL=0;
                dat>>=1;
        }
        
        DS1302RST = 0;                        //寫完數據后將rst清零,終止數傳輸
}

/*************讀取1302的數據**********/
u8 Read_Byte_1302(u8 add)
{
        u8 i,dat;
        DS1302SCL = 0;
        DS1302RST = 1;                //開啟數據傳輸
        add = add |0x01;                //將最低位置一,保證數據是輸出
        for(i=0;i<8;i++)
        {
                DS1302SDA = add &0X01;
                DS1302SCL=1;
                DS1302SCL=0;
                add >>=1;
        }
        for(i=0;i<8;i++)
        {
                dat >>=1;
                if(DS1302SDA)        dat = dat | 0x80;
                else        dat = dat & 0x7f;
                DS1302SCL=1;
                DS1302SCL=0;
        }
        DS1302RST = 0;                        //終止數據傳輸
        dat=dat/16*10+dat%16;
        return        dat;
}

void Write_1302()
{
        Write_Byte_1302(0x8e,0x00);                //關閉寫保護
        Write_Byte_1302(0x80,0x80);
        Write_Byte_1302(0x80,DS1302sec/10*16+DS1302sec%10);
        Write_Byte_1302(0x82,DS1302min/10*16+DS1302min%10);
        Write_Byte_1302(0x84,DS1302hour/10*16+DS1302hour%10);
        Write_Byte_1302(0x86,DS1302day/10*16+DS1302day%10);
        Write_Byte_1302(0x88,DS1302month/10*16+DS1302month%10);
        Write_Byte_1302(0x8c,DS1302year/10*16+DS1302year%10);
        Write_Byte_1302(0x8e,0x80);                //開啟寫保護
}


/***********************顯示周*********************/
//=====計算2000~2099年任一天星期幾
//                year:00-99
//                month:01-12
//                day:01-31
u8          GetWeekFromDay(u8 y,u8 m,u8 d)
{
        u8 value;
        if(m==1||m==2)
        {
                m+=12;
                if(y>0)        y--;
                else y=4;
        }
        value=(d+2*m+3*(m+1)/5+y+y/4)%7;
        return value;
}

void Read_1302()
{
        DS1302sec =Read_Byte_1302(0x80);
        DS1302min =Read_Byte_1302(0x82);
        DS1302hour =Read_Byte_1302(0x84);
        DS1302day =Read_Byte_1302(0x86);
        DS1302month =Read_Byte_1302(0x88);
        DS1302year =Read_Byte_1302(0x8c);
        
        DS1302week = GetWeekFromDay(DS1302year,DS1302month,DS1302day);
}



按鍵函數:
#include "KEYBord.h"
#include "DisplayTime.h"


void DelayKey(u16 t)
{
        u16 i,j;
        for(i=0;i<t;i++)
                for(j=0;j<250;j++);
}


u8 Menu=0;                //菜單
u8 Flicker=0;        //閃爍位置

char xdata KeyValue[10]={0};        //按鍵操作數組

void DealKeyValue(u8 KeyValu)
{
        switch(KeyValu)
        {
                case 0XA5:        //設置
                                        if(Menu==0)
                                        {
                                                //--年
                                                KeyValue[0]=DS1302year/10;
                                                KeyValue[1]=DS1302year%10;
                                                //--月
                                                KeyValue[2]=DS1302month/10;
                                                KeyValue[3]=DS1302month%10;
                                                //--日
                                                KeyValue[4]=DS1302day/10;
                                                KeyValue[5]=DS1302day%10;
                                                //--時
                                                KeyValue[6]=DS1302hour/10;
                                                KeyValue[7]=DS1302hour%10;
                                                //--分
                                                KeyValue[8]=DS1302min/10;
                                                KeyValue[9]=DS1302min%10;
                                                //--秒
                                                KeyValue[10]=0;
                                                KeyValue[11]=0;
                                                Clear_Screen(0);        //清屏
                                                Write_6x16Font_N(5,0,0,"時間設置");
                                                
                                                Flicker=1;
                                                Menu=1;
                                        }
                                        else if(Menu==1)        //保存時間
                                        {
                                                DS1302year = KeyValue[0]*10 +KeyValue[1];
                                                DS1302month = KeyValue[2]*10 +KeyValue[3];
                                                DS1302day = KeyValue[4]*10 +KeyValue[5];
                                                DS1302hour =  KeyValue[6]*10 +KeyValue[7];
                                                DS1302min =  KeyValue[8]*10 +KeyValue[9];
                                                DS1302sec =  0;        
                                                
                                                
                                                
                                                
                                                Clear_Screen(0);        //清屏
                                                Menu=0;
                                        }
                                        break;
                case 0XA6:        //返回
                                        Menu=0;
                                        Flicker=0;
                                       
                                        break;
                case 0XA1:        //左
                                        if(Menu==1)
                                        {
                                                Flicker--;
                                                if(Flicker<1)        Flicker=10;
                                        }
                                        break;
                case 0XA2:        //上
                                        if(Menu==1)
                                        {
                                                KeyValue[Flicker-1]++;
                                                if(KeyValue[2]>1)                KeyValue[2]=0;
                                                if((KeyValue[3]>2)&&(KeyValue[2]==1))        KeyValue[3]=0;
                                                if(KeyValue[4]>3)                KeyValue[4]=0;
                                                if((KeyValue[5]>1)&&(KeyValue[4]==3))          KeyValue[5]=0;
                                                if(KeyValue[6]>2)                KeyValue[6]=0;
                                                if(KeyValue[8]>5)                KeyValue[8]=0;
                                                if( KeyValue[Flicker-1]>9)        KeyValue[Flicker-1]=0;
                                        }
                                        break;
                case 0XA3:        //下
                                        if(Menu==1)
                                        {
                                                KeyValue[Flicker-1]--;

                                                if(KeyValue[Flicker-1] <0 )
                                                {
                                                        if(Flicker==3)        KeyValue[2]=1;
                                                        else if((Flicker==4) &&(KeyValue[2] == 1) )KeyValue[3]=2;
                                                        else if( Flicker==5) KeyValue[4] =3;
                                                        else if( Flicker==7) KeyValue[6] =2;
                                                        else if( Flicker==9) KeyValue[8] =5;
                                                        else        KeyValue[Flicker-1]        =9;
                                                }
                                        }
                                        break;
                case 0XA4:        //右
                                        if(Menu==1)
                                        {
                                                Flicker++;
                                                if(Flicker>10)        Flicker=1;
                                        }
                                        break;
                default :break;
               
        }
}


void GetKeyValue()
{
        u8 KeyValue=0;
        static bit Keyclok=0;
        if(!K1)
        {
                if(Keyclok==0)
                {
                        DelayKey(10);
                        if(!K1)
                        {
                                KeyValue = 0XA1;
                                Keyclok = 1;
                        }
                }
        }
        else if(!K2)
        {
                if(Keyclok==0)
                {        
                        DelayKey(10);
                        if(!K2)
                        {
                                KeyValue = 0XA2;
                                Keyclok = 1;
                        }
                }
        }
        else if(!K3)
        {
                if(Keyclok==0)
                {
                        DelayKey(10);
                        if(!K3)
                        {
                                KeyValue = 0XA3;
                                Keyclok = 1;
                        }
                }
        }
        else if(!K4)
        {
                if(Keyclok==0)
                {
                        DelayKey(10);
                        if(!K4)
                        {
                                KeyValue = 0XA4;
                                Keyclok = 1;
                        }
                }
        }
        else if(!K5)
        {
                if(Keyclok==0)
                {
                        DelayKey(10);
                        if(!K5)
                        {
                                KeyValue = 0XA5;
                                Keyclok = 1;
                        }
                }
        }
        else if(!K6)
        {
                if(Keyclok==0)
                {
                        DelayKey(10);
                        if(!K6)
                        {
                                KeyValue = 0XA6;
                                Keyclok = 1;
                        }
                }
        }
        else
        {
                Keyclok=0;
                KeyValue=0;
        }
        DealKeyValue(KeyValue);        
}

void GotoDisplay()
{
        switch(Menu)
        {
                case 0:
                                DisplayTime();
                                break;
                case 1:
                                DisplayState1();
                                break;
                case 2:
                                break;
                case 3:
                                break;
                case 4:
                                break;
                case 5:
                                break;
                default:break;
        }
}



顯示函數:
#include "DisplayTime.h"
#include "stdio.h"
#include "string.h"
#include "KEYBord.h"

u8 xdata DS1302YMD[]="2020-04-26";
u8 xdata DS1302HMS[]="07:50:30";
u8 xdata WeekD[]="星期一";



u8 xdata DisplayYMD[]="2020-05-01";
u8 xdata DisplayHMS[]="18:00:00";
u8 xdata DisplayWeek[]="星期五";


void GetWeekDat()
{
        u8 WEEK;
        WEEK = DS1302week;
        switch(WEEK)
        {
                case 0:
                                strcpy (WeekD,"星期一");
                                break;
                case 1:
                                strcpy (WeekD,"星期二");
                                break;
                case 2:
                                strcpy (WeekD,"星期三");
                                break;
                case 3:
                                strcpy (WeekD,"星期四");
                                break;
                case 4:
                                strcpy (WeekD,"星期五");
                                break;
                case 5:
                                strcpy (WeekD,"星期六");
                                break;
                case 6:
                                strcpy (WeekD,"星期日");
                                break;
        }
        
}

void DisplayTime()
{
        Write_6x16Font_N(1,0,0,"實時時鐘精度測試");
//---顯示DS1302的時間
        Read_1302();
        DS1302YMD[2] = DS1302year/10 +0X30;
        DS1302YMD[3] = DS1302year%10 +0X30;
        
        DS1302YMD[5] = DS1302month/10 +0X30;
        DS1302YMD[6] = DS1302month%10 +0X30;
        
        DS1302YMD[8] = DS1302day/10 +0X30;
        DS1302YMD[9] = DS1302day%10 +0X30;
        
        DS1302HMS[0] = DS1302hour/10 +0X30;
        DS1302HMS[1] = DS1302hour%10 +0X30;
        
        DS1302HMS[3] = DS1302min/10 +0X30;
        DS1302HMS[4] = DS1302min%10 +0X30;
        
        DS1302HMS[6] = DS1302sec/10 +0X30;
        DS1302HMS[7] = DS1302sec%10 +0X30;
        
        GetWeekDat();
        Write_ASCII3X16_N(0,1,0,"T1:DS1302");
        Write_ASCII3X16_N(0,2,0,DS1302YMD);        
        Write_ASCII3X16_N(2,3,0,DS1302HMS);        
        Write_6x16Font_N(12,3,0,WeekD);

}

//----設置時間------
void DisplayState1()
{
        DisplayYMD[2] = KeyValue[0] +0X30;
        DisplayYMD[3] = KeyValue[1] +0X30;
        
        DisplayYMD[5] = KeyValue[2] +0X30;
        DisplayYMD[6] = KeyValue[3] +0X30;
        
        DisplayYMD[8] = KeyValue[4] +0X30;
        DisplayYMD[9] = KeyValue[5] +0X30;
        
        DisplayHMS[0] = KeyValue[6] +0X30;
        DisplayHMS[1] = KeyValue[7] +0X30;
        
        DisplayHMS[3] = KeyValue[8] +0X30;
        DisplayHMS[4] = KeyValue[9] +0X30;
        
        if(Flicker<3)
        {
                if(TimeRun<2)        DisplayYMD[Flicker+1] = 32;        //空格
                else                        DisplayYMD[Flicker+1] = KeyValue[Flicker-1] +0X30;
        }
        else if(Flicker<5)
        {
                if(TimeRun<2)        DisplayYMD[Flicker+2] = 32;        //空格
                else                        DisplayYMD[Flicker+2] = KeyValue[Flicker-1] +0X30;               
        }
        else if(Flicker<7)
        {
                if(TimeRun<2)        DisplayYMD[Flicker+3] = 32;        //空格
                else                        DisplayYMD[Flicker+3] = KeyValue[Flicker-1] +0X30;               
        }
        else if(Flicker<9)
        {
                if(TimeRun<2)        DisplayHMS[Flicker-7] = 32;        //空格
                else                        DisplayHMS[Flicker-7] = KeyValue[Flicker-1] +0X30;               
        }
        else if(Flicker<11)
        {
                if(TimeRun<2)        DisplayHMS[Flicker-6] = 32;        //空格
                else                        DisplayHMS[Flicker-6] = KeyValue[Flicker-1] +0X30;               
        }
        Write_ASCII3X16_N(0,2,0,DisplayYMD);        
        Write_ASCII3X16_N(2,3,0,DisplayHMS);
        
}



中斷函數:
#include "STC12_INT.H"
u16 T0_xMS;         //定時器T0的初值變量,現定義10ms 的初值,注意要與FOSC統一單位標準

//u8 RS485LEDTimeMax=10;

/***********定時器0初始化******************
T0XMS : 一個溢出周期的時間,單位 ms
                        1T 時 <=5ms;12T 時 <=71ms
        方式1 16位
*******************************************/
void Time0_Init(u8 T0XMS)
{
        TMOD |= 0x01;                //設置定時器模式1        16位非自動重裝
//=====裝載初值               
#ifdef T0_1T        //1T模式
        T0_xMS =(65536-T0XMS*FOSC/1000);        //FOSC的定義在 STC8.H中
#else                        //12T模式
        T0_xMS =(65536-T0XMS*FOSC/12/1000);
#endif
        TL0 = T0_xMS;
        TH0 = T0_xMS >> 8;
        TR0 = 1;
        ET0 = 1;        //開啟T0中斷
        EA  = 1;        
}





/***********定時器1初始化******************
T0XMS : 一個溢出周期的時間,單位 ms
                        1T 時 <=5ms;12T 時 <=71ms
        方式1 16位
//*******************************************/
/*void Time0_Init(u8 T1XMS)
{
        u16 T1_xMS;         //定時器T0的初值變量,現定義10ms 的初值,注意要與FOSC統一單位標準
        TMOD |= 0x10;                //設置定時器模式1        16位非自動重裝
////=====裝載初值               
#ifdef T1_1T        //1T模式
        T1_xMS =(65536-T1XMS*FOSC/1000);        //FOSC的定義在 STC8.H中
#else                        //12T模式
        T1_xMS =(65536-T1XMS*FOSC/12/1000);
#endif

        TL1 = T1_xMS;
        TH1 = T1_xMS >> 8;
        TR1 = 1;
        //ET1 = 1;        //開啟T1中斷
        EA  = 1;        
}
*/
/*********************外部中斷0程序***************************/
void Int0_Isr() interrupt 0
{}

u8 Timeaa=0;
u8 TimeRun=0;
/*********************定時器0中斷程序*************************/
void Time0() interrupt 1
{
        TL0 = T0_xMS;
        TH0 = T0_xMS >> 8;
        Timeaa++;
        if(Timeaa>10)
        {
                Timeaa=0;
                TimeRun++;
                if(TimeRun>5)TimeRun=0;
        }
}

/*********************外部中斷1程序***************************/
void Int1_Isr() interrupt 2
{}
/*********************定時器1中斷程序*************************/
void Time1() interrupt 3
{
}
/***************UART1中斷程序*********************
         與定時器1配合,組成一個能接收一串數據的串口,
并能計算出接收到的數據的個數。
*************************************************/
void UART1() interrupt 4
{
}

/********************ADC中斷程序*****************************/
void ADC_Isr() interrupt 5
{
}

/********************LVD中斷程序****************************/
void LVD_Isr() interrupt 6
{}

/********************PCA中斷程序****************************/
void PCA_Isr() interrupt 7
{}

/*********************** UART2 中斷程序*********************/
void Uart2() interrupt 8
{}

/**********************SPI中斷程序*************************/
void SPI_Isr() interrupt 9
{}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2022-5-9 22:33 | 只看該作者
http://www.zg4o1577.cn/bbs/dpj-200968-1.html 單片機+DS1302+DS18B20+74HC595的LED16x32點陣溫度萬年歷源代碼
回復

使用道具 舉報

板凳
ID:883242 發表于 2022-5-9 23:07 | 只看該作者
那么你是怎么判斷跑飛了呢?
回復

使用道具 舉報

地板
ID:447439 發表于 2022-5-9 23:12 | 只看該作者
Hephaestus 發表于 2022-5-9 23:07
那么你是怎么判斷跑飛了呢?

下載到實物運行后,有年月日時分秒顯示。走秒大約40秒就白屏了。
回復

使用道具 舉報

5#
ID:1025260 發表于 2022-5-10 06:41 | 只看該作者
注意一下變量,看看中斷程序和主程序。
回復

使用道具 舉報

6#
ID:123289 發表于 2022-5-10 08:58 | 只看該作者
畫出邏輯框圖,走通框圖,再依框圖寫程序。
回復

使用道具 舉報

7#
ID:447439 發表于 2022-5-10 09:21 | 只看該作者
yzwzfyz 發表于 2022-5-10 08:58
畫出邏輯框圖,走通框圖,再依框圖寫程序。

調試了好多遍了,中斷和主程序都附上邊了
回復

使用道具 舉報

8#
ID:447439 發表于 2022-5-10 09:24 | 只看該作者
人人學會單片機 發表于 2022-5-9 22:33
http://www.zg4o1577.cn/bbs/dpj-200968-1.html 單片機+DS1302+DS18B20+74HC595的LED16x32點陣溫度萬年歷源代 ...

我這是UC1698的160屏
回復

使用道具 舉報

9#
ID:121859 發表于 2022-5-10 10:16 | 只看該作者
如果中斷里面調用外部程序,就很容易跑飛。
回復

使用道具 舉報

10#
ID:844772 發表于 2022-5-10 14:24 | 只看該作者
是啥都不動,一開機過幾十秒就白屏,還是按了鍵以后才白屏?白屏是全亮那種,還是跟沒通電一樣的?
程序都是抄的,不該出啥問題啊,
回復

使用道具 舉報

11#
ID:584814 發表于 2022-5-10 14:35 | 只看該作者
斷開1302試試,如果問題依舊就與1302無關。
至于是程序跑飛還是器件暗傷,試試看門狗或靜態顯示就知道了。
回復

使用道具 舉報

12#
ID:447439 發表于 2022-5-10 16:13 | 只看該作者
man1234567 發表于 2022-5-10 14:35
斷開1302試試,如果問題依舊就與1302無關。
至于是程序跑飛還是器件暗傷,試試看門狗或靜態顯示就知道了。

不是ds1302的問題,斷開依舊
回復

使用道具 舉報

13#
ID:447439 發表于 2022-5-10 16:14 | 只看該作者
glinfei 發表于 2022-5-10 14:24
是啥都不動,一開機過幾十秒就白屏,還是按了鍵以后才白屏?白屏是全亮那種,還是跟沒通電一樣的?
程序都 ...

啥都不動也白屏,液晶屏廠家程序就正常
回復

使用道具 舉報

14#
ID:161164 發表于 2022-5-10 17:31 | 只看該作者
小丑only 發表于 2022-5-10 16:14
啥都不動也白屏,液晶屏廠家程序就正常

會不會是寫入太頻繁?
如果不按鍵
while(1)只運行GotoDisplay里的DisplayTime
有沒有測量過多久運行一次DisplayTime?
液晶屏又接受多快的刷新?
會不會刷的太快把它刷傻了?
回復

使用道具 舉報

15#
ID:447439 發表于 2022-5-10 20:34 | 只看該作者
lkc8210 發表于 2022-5-10 17:31
會不會是寫入太頻繁?
如果不按鍵
while(1)只運行GotoDisplay里的DisplayTime

也考慮過,后來只留時間刷寫程序。還是問題依舊。
回復

使用道具 舉報

16#
ID:447439 發表于 2022-5-11 08:06 | 只看該作者
man1234567 發表于 2022-5-10 14:35
斷開1302試試,如果問題依舊就與1302無關。
至于是程序跑飛還是器件暗傷,試試看門狗或靜態顯示就知道了。

靜態顯示兩天了都很穩定
回復

使用道具 舉報

17#
ID:161164 發表于 2022-5-11 09:31 | 只看該作者
小丑only 發表于 2022-5-10 20:34
也考慮過,后來只留時間刷寫程序。還是問題依舊。

多久刷一次?
回復

使用道具 舉報

18#
ID:447439 發表于 2022-5-11 09:42 | 只看該作者
lkc8210 發表于 2022-5-11 09:31
多久刷一次?

時間不會測試,但是我把按鍵掃描屏蔽掉了。
回復

使用道具 舉報

19#
ID:161164 發表于 2022-5-11 11:28 | 只看該作者
簡單粗暴
  1. uint DelayCnt = 0;
  2. void main()
  3. {

  4.         Time0_Init(10);
  5.         Init_LCD1616();
  6.         Clear_Screen(0);
  7.         Write_6x16Font_N(1,0,0,);
  8.         while(1)
  9.         {
  10.                 GetKeyValue();        //讀取按鍵數據
  11.                                 if(DelayCnt++>10000)//按需要調節
  12.                                 {
  13.                                         DelayCnt=0;
  14.                                         GotoDisplay();        //顯示時鐘芯片的數據                                       
  15.                                 }
  16.         }
  17. }
復制代碼
回復

使用道具 舉報

20#
ID:447439 發表于 2022-5-11 19:03 | 只看該作者
喜大普奔,驚天喜訊。問題解決了!困擾了5天,差點懷疑人生!今天下午借了臺示波器,發現單片機工作不穩定。晶振起振不規律。然后檢測電壓和電流,發現USB供電不足,接了個DC口瞬間屏幕顯示正常了。謝謝大家的指導,也學習了一些新思路。特別是uid:161164同學,多次不吝賜教。本次問題到此結束。[em01]
回復

使用道具 舉報

21#
ID:447439 發表于 2022-5-11 19:03 | 只看該作者

謝謝親了,多次不吝賜教。隆重感謝。問題解決了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产伦精品一区二区三区照片91 | 欧美三级三级三级爽爽爽 | 91精品久久久 | 国产一区二区自拍 | 夜夜骑天天干 | 国产精品99久久久久久宅男 | 亚洲人va欧美va人人爽 | 国产激情片在线观看 | 日韩激情在线 | 精品国产鲁一鲁一区二区张丽 | 成年精品 | 亚洲成人久久久 | 精品欧美色视频网站在线观看 | www.亚洲 | 亚洲一区中文字幕 | 国产伦精品一区二区三毛 | 国产精品一区久久久久 | 久久6| 成人国产在线视频 | 国产h在线| 国产91一区二区三区 | 亚洲视频区| 午夜视频在线观看一区二区 | 国产精品一区二区三 | 成人在线中文字幕 | 99re99| www.久久久久久久久 | 中文字幕亚洲一区二区va在线 | 国产精品久久久久久久久久久免费看 | 四虎成人精品永久免费av九九 | 国产在线97 | 97中文视频| 午夜看片网站 | 日韩三| 在线2区 | www国产成人免费观看视频,深夜成人网 | 亚洲电影一级片 | 在线免费观看成年人视频 | 99视频免费看 | 国产成人一区二区 | 久久人人网 |