打印
[DemoCode下载]

基于N76E003的数码管时钟

[复制链接]
758|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2024-6-23 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关键词:UART, I2C, 7segments led, EEPROM R/W, RealTime Clock with DS1307
Nuvoton-N76E003-main.zip (71.15 KB)

#include "main.h"

void fn8051ADCBypass (void){
                unsigned char i;
                for (i=0;i<0x03;i++){
                               
                                clr_ADCF;
                                set_ADCS;
                                while(ADCF == 0);
                }
}
void fn8051I2CStart(void){
                SCL = 1; SCL = 0;
                SDA = 1; SCL = 1;
                fn8051SYSDelay(1);
                SDA = 0; fn8051SYSDelay(1);
                SCL = 0; fn8051SYSDelay(1);
}
void fn8051I2CStop(void){
                SCL = 1; SCL = 0;
                SDA = 0; fn8051SYSDelay(1);
                SCL = 1; fn8051SYSDelay(1);
                SDA = 1;
}
bit fn8051I2CWrite(unsigned char dat){
                unsigned char i;
                for (i=0;i<8;i++){
                                SDA = (dat & 0x80) ? 1:0;
                                SCL=1;SCL=0;
                                dat<<=1;
                        }
                SCL = 1; fn8051SYSDelay(1);
                SCL = 0;
                return dat;
}
unsigned char fn8051I2CRead(void){
                bit rd_bit;
                unsigned char i, dat;
                dat = 0x00;
                for(i=0;i<8;i++)                                                                                 /* For loop read data 1 byte */
                {
                                fn8051SYSDelay(1);
                                SCL = 1; fn8051SYSDelay(1);                                 /* Set SCL */
                                rd_bit = SDA;                                                                                 /* Keep for check acknowledge */
                                dat = dat<<1;
                                dat = dat | rd_bit;                                                         /* Keep bit data in dat */
                                SCL = 0;                                                                                                         /* Clear SCL */
                }
                return dat;
}
void fn8051DS1307Out_1Hz()
{
        fn8051I2CStart(); /* Start i2c bus */
        fn8051I2CWrite(0xD0); /* Connect to DS1307 */
        fn8051I2CWrite(0x07);   //RTC pointer location
        fn8051I2CWrite(0x10);
        fn8051I2CStop();
}
unsigned char fn8051DS1307Readdata(unsigned char addr)
{
                unsigned int temp,ret;
                fn8051I2CStart();                 /* Start i2c bus */
                fn8051I2CWrite(0xD0);         /* Connect to DS1307 */
                fn8051I2CWrite(addr);         /* Request RAM address on DS1307 */
                fn8051I2CStart();                 /* Start i2c bus */
                fn8051I2CWrite(0XD1);         /* Connect to DS1307 for Read */
                ret = fn8051I2CRead();         /* Receive data */
                fn8051I2CStop();
                //**********************************************************
                temp = ret;                                                         /*BCD to HEX*/
                ret = (((ret/16)*10)+ (temp & 0x0f));         /*for Led 7seg*/
                //**********************************************************
                return ret;
}
void fn8051DS1307Writedata(unsigned char addr,unsigned char dat)
{
                unsigned int temp;
                //**********************************************
                temp = dat ;                                                 /*HEX to BCD*/
                dat = (((dat/10)*16)|(temp %10));         /*for Led 7seg*/
                //**********************************************
                fn8051I2CStart()
        ;                 /* Start i2c bus */
                fn8051I2CWrite(0XD0);         /* Connect to DS1307 */
                fn8051I2CWrite(addr);         /* Request RAM address on DS1307 */
                fn8051I2CWrite(dat);         /* Connect to DS1307 for Read */
                fn8051I2CStop();
}
void fn8051DS1307ReadTime()
{
                vrcGlb8051DS1307Sec  = fn8051DS1307Readdata(SEC);
                vrcGlb8051DS1307Min  = fn8051DS1307Readdata(MIN);
                vrcGlb8051DS1307Hour = fn8051DS1307Readdata(HOUR);
}
void fn8051DS1307WriteTime()
{
                fn8051DS1307Writedata(SEC,vrcGlb8051DS1307Sec);
                fn8051DS1307Writedata(MIN,vrcGlb8051DS1307Min);
                fn8051DS1307Writedata(HOUR,vrcGlb8051DS1307Hour);
}
int main (){
                Set_All_GPIO_Quasi_Mode;
                fn8051ITRRegSettup();
                fn8051DS1307Out_1Hz();
                //fn8051ADCBypass();
                do{
                                fn80517segledSenddt595(0x92,1,0);
                                fn8051SYSDelay(5);
                                fn80517segledSenddt595(0x06,2,0);
                                fn8051SYSDelay(5);
                                fn80517segledSenddt595(0xc7,3,0);
                                fn8051SYSDelay(5);
                                fn80517segledSenddt595(0x06,4,0);
                                fn8051SYSDelay(5);
                                }while(pni8051ButtonSeclect!=0);
                                fn8051SYSModeselect();
                while(1){
                                if(vrucGlb8051SYSChangemode == 0){
                                                while(vrucGlb8051SYSCurrentmode==1&&vrucGlb8051SYSChangemode==0){
                                                                fn80517segledFloatdisplay(vrfGlb8051ADCVadcP05);
                                                                if((pni8051ButtonSeclect)==0&(pni8051ButtonDown==0)) {
                                                                                vrucGlb8051SYSChangemode = 1;       
                                                                        }

                                        }
                                while((vrucGlb8051SYSCurrentmode==2)&(vrucGlb8051SYSChangemode==0)){
                                                                ET1 = 1;
                                                                fn8051DS1307ReadTime();
                                                                if((pni8051ButtonSeclect)==0&(pni8051ButtonDown==0)) {
                                                                                vrucGlb8051SYSChangemode = 1;
                                                                                ET1 = 0;
                                                                                        }
                                                                if((pni8051ButtonSeclect)==0&(pni8051ButtonUp==0)) {
                                                                                fn8051SYSDelay(500);
                                                                                if((pni8051ButtonSeclect)==0&(pni8051ButtonUp==0)){
                                                                                                fn8051DS1307timesetup();
                                                                                                        }
                                                                                        }
                                                                if(pni8051ButtonSeclect ==0){
                                                                                fn8051SYSDelay(2000);
                                                                                if(pni8051ButtonSeclect ==0){
                                                                                                fn8051APROMwriteTime();
                                                                                                        }
                                                                                }       
                                                        }
                                while(vrucGlb8051SYSCurrentmode==3&&vrucGlb8051SYSChangemode==0){
                                                fn8051APROMReadandDisplay();
                                                                if((pni8051ButtonSeclect==0)&(pni8051ButtonDown==0)) {
                                                                                vrucGlb8051SYSChangemode = 1;       
                                                                        }
                                                                if(pni8051ButtonSeclect ==0){
                                                                                fn8051SYSDelay(2000);
                                                                                if(pni8051ButtonSeclect ==0){
                                                                                                fn8051APROMWriteADC();
                                                                                                        }
                                                                                }       
                                                        }
                                }
                                else{
                                                while(vrucGlb8051SYSChangemode == 1){
                                                                        fn8051SYSModeselect();
                                                                        }
                                        }
                        }
}       
void fn8051ITRRegSettup (){
                TMOD = 0x11;
                TH0 = 0xC1;
                TL0 = 0x80;
                TH1 = 0xE0;
                TL1 = 0xC0;
                set_T0M;
                ET0 = 1;
                EA  = 1;
                TR0 = 1;
                TF0 = 0;
                TF1 = 0;
                TR1 = 1;
}
void  fn8051ITRVector1(void) interrupt 1{ //timer 1ms
                unsigned int vri8051LedblinkCount ;
                unsigned int vruc8051ADCAdctimer1 ;
          vri8051LedblinkCount++;
                if(vri8051LedblinkCount >1000){ //timer 1 s
                pnobl8051ledalert = ~pnobl8051ledalert;
                vri8051LedblinkCount = 0;
                }
                if(vrucGlb8051SYSCurrentmode == 1){
                                if(ADCS == 1) {vruc8051ADCAdctimer1 = 0;}
                                else{
                                vruc8051ADCAdctimer1++;
                                if(vruc8051ADCAdctimer1 > 100) {
                                                fn8051ADCAdcmain();
                                                vruc8051ADCAdctimer1=0;
                                                }
                        }
                }
                //TF0 = 0;
                TH0 = 0xC1;
                TL0 = 0x80;
}
void  fn8051ITRVector3(void) interrupt 3{ //timer 0,5ms
                unsigned char vruc8051DS1307indexcounter;
                        signed char hour1,hour2,min3,min4;
                vruc8051DS1307indexcounter++;
                if(vruc8051DS1307indexcounter>1){
                                vrucGlb8051DS1307Led_ctrlindex--;
                                vruc8051DS1307indexcounter = 0;
                                if(vrucGlb8051DS1307Led_ctrlindex<1){vrucGlb8051DS1307Led_ctrlindex = 4;}
                        }
                if(vrcGlb8051DS1307Hour<10){
                                hour1 = 0;
                                hour2 = vrcGlb8051DS1307Hour;
                                                }
                else{
                                hour1 = vrcGlb8051DS1307Hour/10;
                                hour2 = vrcGlb8051DS1307Hour-(hour1*10);                        
                                                }
                if(vrcGlb8051DS1307Min<10){
                                min4 = vrcGlb8051DS1307Min ;
                                min3 = 0;
                                                }
                else{
                                min3 = vrcGlb8051DS1307Min/10;
                                min4 = vrcGlb8051DS1307Min-(min3*10);                     
                                                }       
                if (vrucGlb8051DS1307Led_ctrlindex ==1){
                                fn80517segledSenddt595(vraGlb80517segledcharacter[hour1],vrucGlb8051DS1307Led_ctrlindex,0);
                                        }
                if (vrucGlb8051DS1307Led_ctrlindex ==2){
                                fn80517segledSenddt595(vraGlb80517segledcharacter[hour2],vrucGlb8051DS1307Led_ctrlindex,1);
                                        }
                if (vrucGlb8051DS1307Led_ctrlindex ==3){
                                fn80517segledSenddt595(vraGlb80517segledcharacter[min3],vrucGlb8051DS1307Led_ctrlindex,0);
                                        }
                if (vrucGlb8051DS1307Led_ctrlindex ==4){
                                fn80517segledSenddt595(vraGlb80517segledcharacter[min4],vrucGlb8051DS1307Led_ctrlindex,1);
                                        }       
                TH1 = 0xF9;
                TL1 = 0xC0;
}
void fn8051SYSDelay(signed int time){//delay 1ms
        signed int t,c;
        for(c=0;c<time;c++){
                 for(t=0;t<1600;t++){         
                                        }
                }
}               
signed char fn8051ButtonBTread(){
        if (pni8051ButtonDown==0){
                fn8051SYSDelay(100);
                return -1;
                }
        if (pni8051ButtonUp==0){
                fn8051SYSDelay(100);
                return 1;
                }                                                               
        else return 0;
}
void fn8051SYSModeselect(){
        fn8051SYSDelay(200);
        while(pni8051ButtonSeclect!=0){
                vrucGlb8051SYSCurrentmode += fn8051ButtonBTread();
                if (vrucGlb8051SYSCurrentmode>3) {vrucGlb8051SYSCurrentmode = 1;}
                if (vrucGlb8051SYSCurrentmode<1) {vrucGlb8051SYSCurrentmode = 3;}
                fn80517segledSenddt595(vraGlb80517segledcharacter[0],3,1);
                fn8051SYSDelay(5);
                fn80517segledSenddt595(vraGlb80517segledcharacter[vrucGlb8051SYSCurrentmode],4,0);
                fn8051SYSDelay(5);
                }
        vrucGlb8051SYSChangemode = 0;
}
void fn80517segledSenddt595(unsigned char vruc80517segleddata,signed char vrc80517segselectled, char dotpoint ){ //7segment led display by timer
                unsigned char i,Q;
                Q = vruc80517segleddata;
                for(i=0;i<8;i++){
                                if((dotpoint==1)&(i==0)){pnoGlb80517segmentSDI=0;}
                                else
                                pnoGlb80517segmentSDI = Q & (0x80>>i);
                                pnoGlb80517segmentCLK = 0;
                                pnoGlb80517segmentCLK = 1;
                        }
    pnoGlb80517segmentSTR = 0;
                pnoGlb80517segmentSTR = 1;
                if(vrc80517segselectled == 1 ){                       
                                pnobl80517segledCtr_L1 = 1;
                                pnobl80517segledCtr_L2 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L4 = 0;
                }
                if(vrc80517segselectled == 2 ){
                                pnobl80517segledCtr_L2 = 1;
                                pnobl80517segledCtr_L1 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L4 = 0;
                }
                if(vrc80517segselectled == 3 ){
                                pnobl80517segledCtr_L3 = 1;               
                                pnobl80517segledCtr_L1 = pnobl80517segledCtr_L2 = pnobl80517segledCtr_L4 = 0;
                }
                if(vrc80517segselectled == 4 )         {
                                pnobl80517segledCtr_L4 = 1;
                                pnobl80517segledCtr_L1 = pnobl80517segledCtr_L3 = pnobl80517segledCtr_L2 = 0;
                }
}
//void fn8051DS1307timedisplay() {                                       
//}
void fn8051DS1307timesetup(){
                fn80517segledSenddt595(0xff,1,1);
                vrcGlb8051DS1307Sec  = 0;
                vrcGlb8051DS1307Hour = 12;
                vrcGlb8051DS1307Min  = 30;
                do{
                        vrcGlb8051DS1307Min +=fn8051ButtonBTread();
                        if(vrcGlb8051DS1307Min>59) { vrcGlb8051DS1307Min=0; }
                        if(vrcGlb8051DS1307Min==0) { vrcGlb8051DS1307Min=59; }
                        if(pni8051ButtonSeclect==0) {
                                        fn8051SYSDelay(500);
                                                }
                                        }while(pni8051ButtonSeclect!=0);
                do{
                        vrcGlb8051DS1307Hour+=fn8051ButtonBTread();
                        if(vrcGlb8051DS1307Hour==0) { vrcGlb8051DS1307Hour=23; }
                        if(vrcGlb8051DS1307Hour>23){ vrcGlb8051DS1307Hour=0; }
                        if(pni8051ButtonSeclect==0){ fn8051SYSDelay(500);  }
                                        }while(pni8051ButtonSeclect!=0);
                        fn8051DS1307WriteTime();
}
void fn8051APROMwrite(unsigned char vruc80517APROMdata,signed char vruc80517APROMaddress ){ //APROM Write
                EA = 0;
                TA = 0xAA;
                TA = 0x55;
                CHPCON |= 0x01;
                TA = 0xAA;
                TA = 0x55;
                IAPUEN |= 0x02; //enable LDROM update
                TA = 0xAA;
                TA = 0x55;
                IAPTRG |= 0x01; //trig IAP GO
                IAPCN = vc8051LDROMByteProgram;
                IAPAH = 0x00;
                IAPAL = vruc80517APROMaddress;
                IAPFD = vruc80517APROMdata;
                TA = 0xAA;
                TA = 0x55;
                IAPTRG |= 0x01; //trig IAP GO
                TA = 0xAA; //IAPUEN is TA protected
                TA = 0x55;
                IAPUEN &= ~0x02; //disable LDROM update
                TA = 0xAA; //CHPCON is TA protected
                TA = 0x55;
                CHPCON &= ~0x01;// disable IAP
                EA = 1;
}
unsigned char fn8051APROMread(signed char vruc80517APROMaddress){
                unsigned char Q;
                EA = 0;
                TA = 0xAA;
                TA = 0x55;
                CHPCON |= 0x01;
                TA = 0xAA;
                TA = 0x55;
                IAPTRG |= 0x01;
                IAPCN = vc8051LDROMByteRead;
                IAPAH = 0x00;
                IAPAL = vruc80517APROMaddress;
                Q = IAPFD;
                TA = 0xAA;
                TA = 0x55;
                IAPTRG |= 0x01;//write �1� to IAPGO to trigger IAP process
                TA = 0xAA; //IAPUEN is TA protected
          TA = 0x55;
                IAPUEN &= ~0x02;
                TA = 0xAA; //CHPCON is TA protected
                TA = 0x55;
                CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
                EA = 1;
                return Q;
}
void fn8051APROMwriteTime(){
                        signed char hour1,hour2,min3,min4;
                if(vrcGlb8051DS1307Hour<10){
                                hour1 = 0;
                                hour2 = vrcGlb8051DS1307Hour;
                                                }
                else{
                                hour1 = vrcGlb8051DS1307Hour/10;
                                hour2 = vrcGlb8051DS1307Hour-(hour1*10);                        
                                                }
                if(vrcGlb8051DS1307Min<10){
                                min4 = vrcGlb8051DS1307Min ;
                                min3 = 0;
                                                }
                else{
                                min3 = vrcGlb8051DS1307Min/10;
                                min4 = vrcGlb8051DS1307Min-(min3*10);                     
                                                }
                EA = 0;
                TA = 0xAA; //TA protect
                TA = 0x55;
                CHPCON |= 0x01; //enable IAP
                TA = 0xAA;
                TA = 0x55;
                IAPUEN |= 0x02; //enable LDROM update
                IAPCN = vc8051LDROMPageErase;
                IAPAH = 0x00;
                IAPAL = 0x00;
                IAPFD = 0xff;
                fn8051APROMwrite(hour1,0x00);
                fn8051APROMwrite(hour2,0x01);
                fn8051APROMwrite(min3,0x02);
                fn8051APROMwrite(min4,0x03);
                EA =1 ;       
}
void fn8051APROMReadandDisplay(){
                char i,vrc8051APROMNguyen,vrc8051APROMTPhan1,vrc8051APROMTPhan2;
                unsigned char vrc8051APROMmode =0;
                vrc8051APROMmode+=fn8051ButtonBTread();
                if(vrc8051APROMmode>1) {vrc8051APROMmode = 0;}
                if(vrc8051APROMmode == 0){
                        for(i=1;i<5;i++){
                                        fn80517segledSenddt595(vraGlb80517segledcharacter[fn8051APROMread(0x00+i-1)],i,0);
                                        fn8051SYSDelay(4);
                                        }
                                }
                if(vrc8051APROMmode == 1){
                        vrc8051APROMNguyen = fn8051APROMread(0x04);
                        vrc8051APROMTPhan1 = fn8051APROMread(0x05);
                        vrc8051APROMTPhan2 = fn8051APROMread(0x06);
                        fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMNguyen],i,1);
                        fn8051SYSDelay(4);
                        fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMTPhan1],i,0);
                        fn8051SYSDelay(4);
                        fn80517segledSenddt595(vraGlb80517segledcharacter[vrc8051APROMTPhan2],i,0);
                        fn8051SYSDelay(4);                       
                }
               
}
void fn80517segledFloatdisplay(float vrf80517segledFin){
                float Q;
                unsigned char nguyen,tphan1,tphan2;
                Q = vrf80517segledFin;
                nguyen = (unsigned char)(Q/1000);
                tphan1 = (unsigned char)((Q - nguyen*1000)/100);
                tphan2 = (unsigned char)((Q - (nguyen*1000+tphan1*100))/10);
                fn80517segledSenddt595(vraGlb80517segledcharacter[nguyen],2,1);
                fn8051SYSDelay(3);
                fn80517segledSenddt595(vraGlb80517segledcharacter[tphan1],3,0);
                fn8051SYSDelay(3);
                fn80517segledSenddt595(vraGlb80517segledcharacter[tphan2],4,0);
                fn8051SYSDelay(3);
}
void fn8051ADCRead_bandgap(){ //IAP read
                unsigned char BandgapHigh,BandgapLow,BandgapMark;       
                float Bandgap_Value,Bandgap_Voltage_Temp;
                set_IAPEN;
                IAPCN = 0x04;
                IAPAL = 0x0d;
    IAPAH = 0x00;
    set_IAPGO;
                BandgapLow  = IAPFD;
                BandgapMark = BandgapLow&0xF0;
                       
                if (BandgapMark==0x80)
                {
                                BandgapLow = BandgapLow&0x0F;
                                IAPAL = 0x0C;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                Bandgap_Voltage_Temp = Bandgap_Value*3/4;
                }
                if (BandgapMark==0x00)
                {
                                BandgapLow = BandgapLow&0x0F;
                                IAPAL = 0x0C;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                vrfGlb8051ADCBandgap_Voltage= Bandgap_Value*3/4;
                }
                if (BandgapMark==0x90)
                {
                                IAPAL = 0x0E;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                IAPAL = 0x0F;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapLow = IAPFD;
                                BandgapLow = BandgapLow&0x0F;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                vrfGlb8051ADCBandgap_Voltage= Bandgap_Value*3/4;
                }
                clr_IAPEN;
        }
void fn8051ADCAdcmain(){
                float bandgapvalue,VDD,VAIN,ADCvalue;
                //fn8051ADCBypass();
                fn8051ADCRead_bandgap();
                ADCCON0 = 0x08;
                ADCCON1 = 0x01;
                clr_ADCF;
                set_ADCS;
                while(ADCF == 0){};
                bandgapvalue = (ADCRH<<4) + ADCRL;
                VDD = (0xFFF/bandgapvalue)*vrfGlb8051ADCBandgap_Voltage;
                Disable_ADC;
                ADCCON0 = 0x04;
                ADCCON1 = 0x01;
                //ADCCON2 = 0x00;
                //AINDIDS = 0xEF;
                clr_ADCF;
                set_ADCS;
                while(ADCF == 0){};
                ADCvalue = (ADCRH<<4) + ADCRL;
                VAIN = (float)ADCvalue/0x1000;
                vrfGlb8051ADCVadcP05 = (float)(VAIN*VDD);
                Disable_ADC;
}
void fn8051APROMWriteADC(){
                float Q;
                unsigned char nguyen,tphan1,tphan2;
                Q = vrfGlb8051ADCVadcP05;
                nguyen = (unsigned char)(Q/1000);
                tphan1 = (unsigned char)((Q - nguyen*1000)/100);
                tphan2 = (unsigned char)((Q - (nguyen*1000+tphan1*100))/10);
                fn8051APROMwrite(nguyen,0x04);
                fn8051APROMwrite(tphan1,0x05);
                fn8051APROMwrite(tphan2,0x06);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

201

主题

3587

帖子

16

粉丝