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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1309|回復: 1
打印 上一主題 下一主題
收起左側(cè)

單片機程序 74hc595數(shù)碼管菜單帶24c02保存

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:492633 發(fā)表于 2024-10-20 17:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


/*******************EEPROM記錄大于255的數(shù)*****************                  
*硬件平臺:STC89C52RC
*開發(fā)環(huán)境:KEIL        
*功能:由于24c02是每個存儲地址只對應8個bit的存儲空間,即一個                          
           存儲單元所存儲的數(shù)據(jù)最大為255,該例程介紹了一種當所記憶                          
           數(shù)據(jù)大于255(而小于65536)的存儲方法。即用兩個存儲單元來                  
           存儲一個數(shù)據(jù)。            
*********************************************************/
#include<reg52.h>
#include "intrins.h"
#include "i2c.h"
#include "24cxx.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char

#define valdata      5000//計算值



sbit ds=P1^3;
sbit sh_cp=P1^2;
sbit st_cp=P1^4;

sbit dula=P2^6;
sbit wela=P2^7;



sbit k1=P3^3; //設(shè)置/退出
sbit k2=P3^4; //加
sbit k3=P3^5; //減
sbit k4=P3^6; //左移一位
sbit k5=P3^7; //確認


sbit led=P2^0;

uchar diss[8];//595數(shù)碼管8個

uchar mode=0;//模式 0-255

uchar num1;
uchar num2;
uchar num3;
uchar num4;
uchar num5;
uchar num6;
uchar num7;
uchar num8;
uchar num9;
uchar num10;
uchar num11;
uchar num12;
uchar num13;
uchar num14;
uchar num15;
uchar num16;  //計算 0-255


bit writedat=0; //寫24C08 的標

unsigned short Val; //mcp4725輸出變量 0-65535

//unsigned short mode0=0;//主顯示0 0-65535
unsigned short mode1=0;//菜單顯示1 0-65535
unsigned short mode2=0;//菜單顯示2 0-65535
unsigned short mode3=0;//菜單顯示3 0-65535
unsigned short mode4=0;//菜單顯示4 0-65535
unsigned short mode5=0;//菜單顯示5 0-65535
unsigned short mode6=0;//菜單顯示6 0-65535
unsigned short mode7=0;//菜單顯示7 0-65535
unsigned short mode8=0;//菜單顯示8 0-65535

//uchar time=0;  //系統(tǒng)定時 0-255

uchar code table[]=
{
        0x3F,//'0'0
  0x06,//'1'1
  0x5B,//'2'2
  0x4F,//'3'3
  0x66,//'4'4
  0x6D,//'5'5
  0x7D,//'6'6
  0x07,//'7'7
  0x7F,//'8'8
  0x6F,//'9'9
  0x77,//'A'10
  0x5F,//'a'11
  0x7F,//'B'12
  0x7C,//'b'13
  0x39,//'C'14
  0x58,//'c'15
  0x3F,//'D'16
  0x5E,//'d'17
  0x79,//'E'18
  0x7B,//'e'19
  0x71,//'F'20
  0x71,//'f'21
  0x7D,//'G'22
  0x6F,//'g'23
  0x76,//'H'24
  0x74,//'h'25
  0x06,//'I'26
  0x04,//'i'27
  0x1E,//'J'28
  0x1E,//'j'29
  0x38,//'L'30
  0x06,//'l'31
  0x37,//'N'32
  0x54,//'n'33
  0x3F,//'O'34
  0x5C,//'o'35
  0x73,//'P'36
  0x73,//'p'37
  0x67,//'Q'38
  0x67,//'q'39
  0x77,//'R'40
  0x50,//'r'41
  0x6D,//'S'42
  0x6D,//'s'43
  0x31,//'T'44
  0x78,//'t'45
  0x3E,//'U'46
  0x1C,//'u'47
  0x6E,//'Y'48
  0x6E,//'y'49
  0x5B,//'Z'50
  0x5B,//'z'51
  0x40,//'-'52
  0x08,//'_'53
  0x80 //'.'54
};
//數(shù)碼管編碼   

void delay1(uint z)      //延時為 1ms
{
uchar x,x1;
for(;z>0;z--)
{
  for(x=0;x<114;x++)
  {for(x1=0;x1<1;x1++);}
}
}


//595處理開始
void hc595(uchar dat) //595開始
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sh_cp=0;
                _nop_();
                _nop_();

                ds=dat>>7;
                dat=dat<<1;

                sh_cp=1;
                _nop_();
                _nop_();
        }
}

void ds_dat_txd()//鎖存發(fā)送
{
        st_cp=0;
        _nop_();
        _nop_();
        st_cp=1;
        _nop_();
        _nop_();
}

void display595() //595數(shù)碼管數(shù)據(jù)
{      
        uchar i=0,dat=0;
        for(dat=0xfe;dat!=0xff;dat=dat<<1|0x01)
        {
                hc595(dat);//先發(fā)送位碼
                hc595(table[diss[i++]]);//段碼
                ds_dat_txd();  //發(fā)送
                if(i==8)i=0;
                delay1(1);//適當延時
                hc595(0x00);  //消隱
                ds_dat_txd();  //發(fā)送
        }
}
//595處理結(jié)束


void KEY()  //按鍵
{
  uchar kk; //按鍵 0-255
         if(mode>=9) mode=0;
        {
    if(!k1 &&(kk!=1))                 //設(shè)置/確認
                {
                        kk=1;
                        mode++;
                        writedat=1; //寫入24C08 的標志;
                }
        
               
                if(mode==1)//模式1
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode1<65535)  // 小于65535
                                        mode1++;    //自加一次
                                       
                                printf("%dHz\r\n",mode1);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode1>1)  //判斷大于1
                                        mode1--;  //自減一次
                                printf("%dHz\r\n",mode1);
                        }                        
                }
               
                if(mode==2)//模式2
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode2<65535)  // 小于65535
                                        mode2++;    //自加一次
                                       
                                printf("%dHz\r\n",mode2);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode2>1)  //判斷大于1
                                        mode2--;  //自減一次
                                printf("%dHz\r\n",mode2);
                        }                        
                }
        
               
                if(mode==3)//模式3
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode3<65535)  // 小于65535
                                        mode3++;    //自加一次
                                       
                                printf("%dHz\r\n",mode3);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode3>1)  //判斷大于1
                                        mode3--;  //自減一次
                                printf("%dHz\r\n",mode3);
                        }                        
                }
               
                if(mode==4)//模式4
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode4<65535)  // 小于65535
                                        mode4++;    //自加一次
                                printf("%dHz\r\n",mode4);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode4>1)  //判斷大于1
                                        mode4--;  //自減一次
                                printf("%dHz\r\n",mode4);
                        }                        
                }
               
                if(mode==5)//模式5
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode5<65535)  // 小于65535
                                        mode5++;    //自加一次
                                       
                                printf("%dHz\r\n",mode5);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode5>1)  //判斷大于1
                                        mode5--;  //自減一次
                                printf("%dHz\r\n",mode5);
                        }                        
                }
               
                if(mode==6)//模式6
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode6<65535)  // 小于65535
                                        mode6++;    //自加一次
                                       
                                printf("%dHz\r\n",mode6);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode6>1)  //判斷大于1
                                        mode6--;  //自減一次
                                printf("%dHz\r\n",mode6);
                        }                        
                }
                                
                if(mode==7)//模式7
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode7<65535)  // 小于65535
                                        mode7++;    //自加一次
                                       
                                printf("%dHz\r\n",mode7);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode7>1)  //判斷大于1
                                        mode7--;  //自減一次
                                printf("%dHz\r\n",mode7);
                        }                        
                }
               
                if(mode==8)//模式8
                {
                        if(!k2 &&(kk!=2))  //加
                        {
                                kk=2;
                                if(mode8<65535)  // 小于65535
                                        mode8++;    //自加一次
                                       
                                printf("%dHz\r\n",mode8);        
                        }
                        if(!k3 &&(kk!=3)) //減
                        {
                                kk=3;
                                if(mode8>1)  //判斷大于1
                                        mode8--;  //自減一次
                                printf("%dHz\r\n",mode8);
                        }                        
                }

                        if(!k4 &&(kk!=4)) //
                        {
                                kk=4;
                                if(Val<=1000)
        Val++;
                                MCP4725Write(Val);
                                printf("%d\r\n",Val);
                                }
                        
                        if(!k5 &&(kk!=5)) //
                        {
                                kk=5;
                                if(Val>1)
        Val--;
                                MCP4725Write(Val);
                                printf("%d\r\n",Val);
                                }
                        
        
                  if(k1 && k2 && k3 && k4 && k5)
                        {
                        kk=0;
                        }
                }
         
                if(writedat==1) //寫入24C08 的標志;
                {
                        writedat=0; //清除寫入24C08 的標志;

                                 num1=(uchar)(mode1/256);
         num2=(uchar)(mode1%256); //num1和num2是將up的0-65535計算成兩個255分別存儲的變量
                        
                                 num3=(uchar)(mode2/256);
         num4=(uchar)(mode2%256); //num3和num4是將down的0-65535計算成兩個255分別存儲的變量
                        
                        
                                 num5=(uchar)(mode3/256);
         num6=(uchar)(mode3%256); //num5和num6是將up的0-65535計算成兩個255分別存儲的變量
                        
                                 num7=(uchar)(mode4/256);
         num8=(uchar)(mode4%256); //num7和num8是將down的0-65535計算成兩個255分別存儲的變量
                        
                                 num9=(uchar)(mode5/256);
         num10=(uchar)(mode5%256); //num9和num10是將up的0-65535計算成兩個255分別存儲的變量
                        
                                 num11=(uchar)(mode6/256);
         num12=(uchar)(mode6%256); //num11和num12是將down的0-65535計算成兩個255分別存儲的變量
                        
                                 num13=(uchar)(mode7/256);
         num14=(uchar)(mode7%256); //num13和num14是將up的0-65535計算成兩個255分別存儲的變量
                        
                                 num15=(uchar)(mode8/256);
         num16=(uchar)(mode8%256); //num15和num16是將down的0-65535計算成兩個255分別存儲的變量
                                
                                
                                 write(0xa0,0x01,num1); //地址1寫入0-255
         delay1(10);  
         write(0xa0,0x02,num2); //地址2寫入0-255
         delay1(10);
         write(0xa0,0x03,num3); //地址3寫入0-255
         delay1(10);         
         write(0xa0,0x04,num4); //地址4寫入0-255
         delay1(10);
                                 write(0xa0,0x05,num5); //地址5寫入0-255
         delay1(10);  
         write(0xa0,0x06,num6); //地址6寫入0-255
         delay1(10);
         write(0xa0,0x07,num7); //地址7寫入0-255
         delay1(10);         
         write(0xa0,0x08,num8); //地址8寫入0-255
         delay1(10);
                                 write(0xa0,0x09,num9); //地址9寫入0-255
         delay1(10);  
         write(0xa0,0x10,num10); //地址10寫入0-255
         delay1(10);
         write(0xa0,0x11,num11); //地址11寫入0-255
         delay1(10);         
         write(0xa0,0x12,num12); //地址12寫入0-255
         delay1(10);
                                 write(0xa0,0x13,num13); //地址13寫入0-255
         delay1(10);  
         write(0xa0,0x14,num14); //地址14寫入0-255
         delay1(10);
         write(0xa0,0x15,num15); //地址15寫入0-255
         delay1(10);         
         write(0xa0,0x16,num16); //地址16寫入0-255
         delay1(10);                 
                                 
                }
        
}
void UartInit(void)        //9600bps@11.0592MHz
{

        SCON=0X50;                        //設(shè)置為工作方式1
        TMOD=0X21;                        //設(shè)置計數(shù)器工作方式2
        TH1=0XFD;                        //9600
        TL1=0XFD;
        TH0=0X3c;               
        TL0=0Xb0;
        ET0=1;
        EA=1;                                //打開總中斷
        TR1=1;                                //打開計數(shù)器
        TR0=1;
        TI=0;
        TI=1;
        

        
}


void disss() //595顯示計算
{
        
        
        switch(mode) //模式
        {
        case 0:  //主顯示
        {
        diss[0]=52; //顯示千萬位
        diss[1]=52;//顯示百萬位
        diss[2]=52;//顯示十萬
        diss[3]=52;//顯示萬位
        diss[4]=52; //顯示千位
        diss[5]=52; //顯示百位
        diss[6]=52; // 顯示十位
        diss[7]=52; //顯示個位
        }                break;
        
        case 1: //菜單1
        {
        diss[0]=36; //顯示千萬位
        diss[1]=1; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode1/10000; //顯示萬位
        diss[4]=mode1%10000/1000; //顯示千位
        diss[5]=mode1%1000/100; //顯示百位
        diss[6]=mode1%100/10; // 顯示十位
        diss[7]=mode1%10; //顯示個位
        }        break;
        
        case 2: //菜單2
        {
        diss[0]=36; //顯示千萬位
        diss[1]=2; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode2/10000; //顯示萬位
        diss[4]=mode2%10000/1000; //顯示千位
        diss[5]=mode2%1000/100; //顯示百位
        diss[6]=mode2%100/10; // 顯示十位
        diss[7]=mode2%10; //顯示個位
        }                break;
        
        case 3: //菜單3
        {
        diss[0]=36; //顯示千萬位
        diss[1]=3; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode3/10000; //顯示萬位
        diss[4]=mode3%10000/1000; //顯示千位
        diss[5]=mode3%1000/100; //顯示百位
        diss[6]=mode3%100/10; // 顯示十位
        diss[7]=mode3%10; //顯示個位
        }                break;
        
        case 4: //菜單4
        {
        diss[0]=36; //顯示千萬位
        diss[1]=4; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode4/10000; //顯示萬位
        diss[4]=mode4%10000/1000; //顯示千位
        diss[5]=mode4%1000/100; //顯示百位
        diss[6]=mode4%100/10; // 顯示十位
        diss[7]=mode4%10; //顯示個位
        }        break;
        
        case 5: //菜單5
        {
        diss[0]=36; //顯示千萬位
        diss[1]=5; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode5/10000; //顯示萬位
        diss[4]=mode5%10000/1000; //顯示千位
        diss[5]=mode5%1000/100; //顯示百位
        diss[6]=mode5%100/10; // 顯示十位
        diss[7]=mode5%10; //顯示個位
        }        break;
        
        case 6: //菜單6
        {
        diss[0]=36; //顯示千萬位
        diss[1]=6; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode6/10000; //顯示萬位
        diss[4]=mode6%10000/1000; //顯示千位
        diss[5]=mode6%1000/100; //顯示百位
        diss[6]=mode6%100/10; // 顯示十位
        diss[7]=mode6%10; //顯示個位
        }        break;
        
        case 7: //菜單7
        {
        diss[0]=36; //顯示千萬位
        diss[1]=7; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode7/10000; //顯示萬位
        diss[4]=mode7%10000/1000; //顯示千位
        diss[5]=mode7%1000/100; //顯示百位
        diss[6]=mode7%100/10; // 顯示十位
        diss[7]=mode7%10; //顯示個位
        } break;
        
        case 8: //菜單8
        {
        diss[0]=36; //顯示千萬位
        diss[1]=8; //顯示百萬位
        diss[2]=52; //顯示十萬
        diss[3]=mode8/10000; //顯示萬位
        diss[4]=mode8%10000/1000; //顯示千位
        diss[5]=mode8%1000/100; //顯示百位
        diss[6]=mode8%100/10; // 顯示十位
        diss[7]=mode8%10; //顯示個位
        }        break;

}
  //default: 如果表達式的值和以上的case后面的值都沒有匹配上,那么就執(zhí)行這里的代碼。
//        break;
        
        
}
void display595out() //595數(shù)碼管輸出
{
        display595();
        disss();
}

void init()  //初始化
{
        
MCP4725_Init(); //初始化MCP4725
MCP4725Write(0);        //掉電不保存數(shù)據(jù)
// MCP4725_Write_data(1000);  //掉電后保存當前輸出電壓數(shù)據(jù),并在下一次上電自動設(shè)為上一次輸出數(shù)據(jù)
{
num1 = read(0xa0,0x01,0xa1); //地址1讀出0-255
delay1(10);  //適當延時

num2 = read(0xa0,0x02,0xa1); //地址2讀出0-255
delay1(10);  //適當延時

num3 = read(0xa0,0x03,0xa1); //地址3讀出0-255
delay1(10);  //適當延時

num4 = read(0xa0,0x04,0xa1); //地址4讀出0-255
delay1(10);  //適當延時

num5 = read(0xa0,0x05,0xa1); //地址5讀出0-255
delay1(10);  //適當延時

num6 = read(0xa0,0x06,0xa1); //地址6讀出0-255
delay1(10);  //適當延時

num7 = read(0xa0,0x07,0xa1); //地址7讀出0-255
delay1(10);  //適當延時

num8 = read(0xa0,0x08,0xa1); //地址8讀出0-255
delay1(10);  //適當延時

num9 = read(0xa0,0x09,0xa1); //地址9讀出0-255
delay1(10);  //適當延時

num10 = read(0xa0,0x10,0xa1); //地址10讀出0-255
delay1(10);  //適當延時

num11 = read(0xa0,0x11,0xa1); //地址11讀出0-255
delay1(10);  //適當延時

num12 = read(0xa0,0x12,0xa1); //地址12讀出0-255
delay1(10);  //適當延時

num13 = read(0xa0,0x13,0xa1); //地址13讀出0-255
delay1(10);  //適當延時

num14 = read(0xa0,0x14,0xa1); //地址14讀出0-255
delay1(10);  //適當延時

num15 = read(0xa0,0x15,0xa1); //地址15讀出0-255
delay1(10);  //適當延時

num16 = read(0xa0,0x16,0xa1); //地址16讀出0-255
delay1(10);  //適當延時


mode1 = num1*256 + num2; //計算還原成0-65535

mode2 = num3*256 + num4; //計算還原成0-65535
        
mode3 = num5*256 + num6; //計算還原成0-65535
        
mode4 = num7*256 + num8; //計算還原成0-65535
        
mode5 = num9*256 + num10; //計算還原成0-65535

mode6 = num11*256 + num12; //計算還原成0-65535

mode7 = num13*256 + num14; //計算還原成0-65535

mode8 = num15*256 + num16; //計算還原成0-65535


// display595out(); //595數(shù)碼管顯示//讀取要顯示出來的數(shù)
}
        
        UartInit(); //串口初始化

}

void main()
{

  init();
  printf("初始化完成...\r\n"); //初始化完成后串口發(fā)出
//        printf("%d\r\n",mode0); //初始化完成后串口發(fā)出
while(1)
{
         KEY(); //按鍵處理
   display595out(); //595數(shù)碼管顯示
         
}
}
//定時器中斷   

void time0() interrupt 1 //初始值大概22毫秒
{
uchar time; //亮燈計時
        
        if(time<5)//5x0.22=1.1s
               
                time++;
        
        else
        {
                time=0;
               
                led=~led;
        }
        
}


仿真程序: 測試.7z (318.94 KB, 下載次數(shù): 13)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:492633 發(fā)表于 2024-10-20 18:12 | 只看該作者
MCP4725程序還沒有調(diào)通其他沒事
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品区一区二区三区 | 蜜桃精品视频在线 | 四季久久免费一区二区三区四区 | 日本精品视频一区二区 | 玖玖国产精品视频 | 天天色天天色 | 台湾佬久久| 国产成人精品综合 | 日本精品一区二区 | 欧美久久久久久久久中文字幕 | 中文字幕专区 | 九九国产在线观看 | 狠狠干影院 | 午夜影院网站 | 日韩一区二区黄色片 | 日韩毛片在线视频 | 日韩久久久一区二区 | 国产美女精品 | 老司机成人在线 | 亚洲精品美女视频 | 一区在线视频 | 精品日韩在线 | 理论片免费在线观看 | 自拍第一页 | 91大神在线资源观看无广告 | 欧美a区 | 国产网站在线免费观看 | 亚洲国产一区二区在线 | 中文字幕乱码亚洲精品一区 | 日本在线网址 | 久久久久国产精品 | 在线播放亚洲 | 日韩电影在线一区 | 精品国产乱码一区二区三区a | 精品成人| 亚洲视频在线观看 | 欧美久久一级 | 不卡一区 | 天天色综网| 国内成人免费视频 | 国产精品久久久久久久久久妇女 |