找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23|回复: 1
打印 上一主题 下一主题
收起左侧

单片机程序 74hc595数码管菜单带24c02保存

[复制链接]
跳转到指定楼层
楼主


/*******************EEPROM记录大于255的数*****************                  
*硬件平台:STC89C52RC
*开发环境:KEIL        
*功能:由于24c02是每个存储地址只对应8个bit的存储空间,即一个                          
           存储单元所存储的数据最大为255,该例程介绍了一种当所记忆                          
           数据大于255(而小于65536)的存储方法。即用两个存储单元来                  
           存储一个数据。            
*********************************************************/
#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; //设置/退出
sbit k2=P3^4; //加
sbit k3=P3^5; //减
sbit k4=P3^6; //左移一位
sbit k5=P3^7; //确认


sbit led=P2^0;

uchar diss[8];//595数码管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;  //系统定时 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
};
//数码管编码   

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()//锁存发送
{
        st_cp=0;
        _nop_();
        _nop_();
        st_cp=1;
        _nop_();
        _nop_();
}

void display595() //595数码管数据
{      
        uchar i=0,dat=0;
        for(dat=0xfe;dat!=0xff;dat=dat<<1|0x01)
        {
                hc595(dat);//先发送位码
                hc595(table[diss[i++]]);//段码
                ds_dat_txd();  //发送
                if(i==8)i=0;
                delay1(1);//适当延时
                hc595(0x00);  //消隐
                ds_dat_txd();  //发送
        }
}
//595处理结束


void KEY()  //按键
{
  uchar kk; //按键 0-255
         if(mode>=9) mode=0;
        {
    if(!k1 &&(kk!=1))                 //设置/确认
                {
                        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;                        //设置为工作方式1
        TMOD=0X21;                        //设置计数器工作方式2
        TH1=0XFD;                        //9600
        TL1=0XFD;
        TH0=0X3c;               
        TL0=0Xb0;
        ET0=1;
        EA=1;                                //打开总中断
        TR1=1;                                //打开计数器
        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后面的值都没有匹配上,那么就执行这里的代码。
//        break;
        
        
}
void display595out() //595数码管输出
{
        display595();
        disss();
}

void init()  //初始化
{
        
MCP4725_Init(); //初始化MCP4725
MCP4725Write(0);        //掉电不保存数据
// MCP4725_Write_data(1000);  //掉电后保存当前输出电压数据,并在下一次上电自动设为上一次输出数据
{
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数码管显示//读取要显示出来的数
}
        
        UartInit(); //串口初始化

}

void main()
{

  init();
  printf("初始化完成...\r\n"); //初始化完成后串口发出
//        printf("%d\r\n",mode0); //初始化完成后串口发出
while(1)
{
         KEY(); //按键处理
   display595out(); //595数码管显示
         
}
}
//定时器中断   

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


仿真程序: 测试.7z (318.94 KB, 下载次数: 2)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:492633 发表于 2024-10-20 18:12 | 只看该作者
MCP4725程序还没有调通其他没事
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表