正负数 储存读取STC单片机内部 LCD显示测试

 

/*最大  PAST  999999 正负数测试*****/
/*****L368 CODE 1799 2018 3 3 17:38*/
/*****-------------------***********/
/*****|负 0 0 2 4 6 8    |**********/
/*****|负 0 0 2 4 6 8    |**********/
/*****|                  |**********/
/*****|                  |**********/
/*****-------------------***********/
              #include       <reg52.h>              //自动拔管程序需现场编制
              #include       <intrins.h>
              #include       <stdlib.h>
              #include       <stdio.h>
              #define        uint unsigned int
              #define        uchar unsigned char        //自定义关键字
              #define        IAP_ADDRESS    0x0000        //EEPROM首地址
              typedef        unsigned char BYTE;
              typedef        unsigned int WORD;
              #define        CMD_IDLE    0              //空闲模式
              #define        CMD_READ    1              //IAP字节读命令
              #define        CMD_PROGRAM 2              //IAP字节编程命令
              #define        CMD_ERASE   3              //IAP扇区擦除命令
              #define        ENABLE_IAP  0x82           //if SYSCLK<20MHz
              long           p1,p2,p3;
              sbit           CS=P3^4;                    //  12864PIN4 RS    vala显示缓冲valb加减时间处理缓冲
              sbit           SID=P3^3;                  //     12864PIN5 RW
              sbit           SCLK=P1^6;                    //     12864PIN6 E  INT0
              sbit           RST=P3^0;
              sbit           INT0=P3^2;                    //
              sbit           Key_Out1=P4^5;
              sbit           Key_Out2=P4^6;
              sbit           Key_Out3=P2^7;
              sbit           Key_Out4=P2^6;
              sbit           Key_Out5=P2^5;
              sbit           Key_In0=P3^2;
              sbit           GN=P0^3;
              sbit           Key_In1=P0^3;
              sbit           Key_In2=P0^2;
              sbit           Key_In3=P0^1;
              sbit           Key_In4=P0^0;
              sbit           Key_Rst=P0^3;
              sbit           Key_Motor=P0^1;         //电机
              sbit           LED0=P0^2;
              void           IapIdle();
              void           IapProgramByte(WORD addr, BYTE dat);
                 uchar          i,j,k,l,m,n;
              void           delay_iic(int v);        /****eeprom读写延时**/
              void           delay(uint k);           /****延时****/
            
               uchar          code disdt[10]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};
/*------------------延时子程序------------------------*/
               void delay(unsigned int t)
               {
                uint i,j;
                for(i=0;i<t;i++)
                for(j=0;j<500;j++);
               }
/*------------------延时子程序------------------------*/
               void delay_1ms(uint x)
               {
               int i, j;
               for (i=0;i<x;i++)
               for (j=0;j<1500;j++);
               }
               /*------------------写命令到LCD-----------------------*/
              void write_com(unsigned char cmdcode)
              {
              uchar i;
              uchar i_data,temp_data1,temp_data2;
              i_data=0xf8;
              delay(10);
              CS=1;
              SCLK=0;
              for(i=0;i<8;i++)
               {
               SID=(bit)(i_data&0x80);
               SCLK=0;
               SCLK=1;
               i_data=i_data<<1;
               }
               i_data=cmdcode;
               i_data&=0xf0;
               for(i=0;i<8;i++)
               {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
               }
               i_data=cmdcode;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               }
/*-------------------写数据到LCD----------------------*/
               void write_data(unsigned char Dispdata)
               {
               uchar i;
               uchar i_data,temp_data1,temp_data2;
               i_data=0xfa;
               delay(10);
               CS=1;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               i_data=Dispdata;
               temp_data1=i_data&0xf0;
               temp_data2=i_data&0x0f;
               temp_data1>>=4;
               temp_data2<<=4;
               i_data=temp_data1|temp_data2;
               i_data&=0xf0;
                for(i=0;i<8;i++)
                {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
                }
               CS=0;
               }
/*------------------初始化LCD屏-----------------------*/
              void lcd_init()
               {
               uchar comdata;
               RST=0;
               delay_1ms(100);
               RST=1;
               comdata=0x30;
               write_com(comdata); /*功能设置:一次送8位数据,基本指令集*/
               comdata=0x04;
               write_com(comdata); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
               comdata=0x0f;
               write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
               comdata=0x01;
               write_com(comdata); /*清DDRAM*/
               comdata=0x02;
               write_com(comdata); /*DDRAM地址归位*/
               comdata=0x80;
               write_com(comdata); /*把显示地址设为0X80,即为第一行的首位*/
               }
/*----关闭IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR=0;                  //关闭IAP功能
              IAP_CMD=0;                    //清除命令寄存器
              IAP_TRIG=0;                   //清除触发寄存器
              IAP_ADDRH=0x80;               //将地址设置到非IAP区域
              IAP_ADDRL=0;
              }
/*-从ISP/IAP/EEPROM区域读取一字节-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                       //数据缓冲区
              IAP_CONTR=ENABLE_IAP;         //使能IAP
              IAP_CMD=CMD_READ;             //设置IAP命令
              IAP_ADDRL=addr;               //设置IAP低地址
              IAP_ADDRH=addr >> 8;          //设置IAP高地址
              IAP_TRIG=0x5a;                //写触发命令(0x5a)
              IAP_TRIG=0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              dat=IAP_DATA;                 //读ISP/IAP/EEPROM数据
              IapIdle();                      //关闭IAP功能
              return dat;                     //返回
              }
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_PROGRAM;          //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇区擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD = CMD_ERASE;            //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/********************************/    
              void  chuang_Six(long  X)
              {
              i=X/100000;
              j=(X/10000)%10;
              k=(X/1000)%10;
              l=(X/100)%10;
              m=(X/10)%10;
              n=X%10;
              }
/********************************/                    
              void Dis_XMemory(long X)
              {
              if(X>=0)             //
              {
              write_com(0x80);      
              write_data(0XD5);      /*半个字符*/
              write_data(0XFD);      /*正*/
              }
              else
              {
              write_com(0x80);      
              write_data(0XB8);      /*半个字符*/
              write_data(0XBA);      /*负*/
              X=X-2*X;
              }
             chuang_Six(X);
             write_com(0x81);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[i]);  /**/
              write_com(0x82);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[j]);  /**/
             write_com(0x83);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[k]);  /**/
             write_com(0x84);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[l]);  /**/
             write_com(0x85);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[m]);  /**/
             write_com(0x86);      
             write_data(0xA3);      /*半个字符*/
             write_data(disdt[n]);  /**/
            }
/********************************/                    
            void Dis_NewData(long X)
            {
            if(X>=0)             //
            {
            write_com(0x90);      
            write_data(0XD5);      /*半个字符*/
            write_data(0XFD);      /*正*/
            }
            else
            {
            write_com(0x90);      
            write_data(0XB8);      /*半个字符*/
            write_data(0XBA);      /*负*/
            X=X-2*X;
            }
            chuang_Six(X);
            write_com(0x91);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[i]);  /**/
            write_com(0x92);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[j]);  /**/
            write_com(0x93);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[k]);  /**/
            write_com(0x94);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[l]);  /**/
            write_com(0x95);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[m]);  /**/
            write_com(0x96);      
            write_data(0xA3);      /*半个字符*/
            write_data(disdt[n]);  /**/
            }                    
/***AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)***/    
              void  Write_Value(long  Value)
              {
               if(Value<0)                     //è?1?ValueD?óú0?a?oêy
               {
                p1=Value;                      //×?μí??
                p2=Value>>8;                   //μú?t??
                p3=Value>>16&0XFF;             //£¨1111 11μú??????????áù??£?£¨XXμúèy??è?μíá???£? ×??????a?o êy×?ò?21êyD?ê?2úéú
               }
               else                            //·??ò′óóú0?a?yêy
               {
                p1=Value;                      //×?μí??
                p2=Value>>8;                   //μú?t??
                p3=Value>>16&0X03;             //0000 0011 ×??????a?y ?á±???áù??
               }
              }    
/************AT24CXX_ReadOneByte(u16 ReadAddr)********************/    
              long Read_X()
              {    
               uchar s;
               long  n,X;
               s=p3;                 //×?????
               n=s&0X80;             //1000 0000?àó?
               if(n==0X80)           //×??????aò?μèóú?oêy
               {
                X=0XFF;              //FFH   1111 1111
               }
               else                  //?y
               {
                X=0X00;                //     0000 0000
               }
               X=X<<8;               //×?????μú????×óò?8??
               X=X|s;                //oíμúèy???à?òè?μúèy??μ?μíá????μ
               X=X<<8;               //×óò?8??
               X=X|p2;               //oíμú?t???à?ò
               X=X<<8;               //×óò?8??
               X=X|p1;               //oíμúò????à?ò
               return X;
              }                            
/*------------------主循环程序----------------*/      
               void   main( )                    /*主程序开始*/
               {   
               uchar x;
               long h;
               lcd_init() ;                      /*液晶复位*/
               delay(5000);
                while(1)                          /*主函数循环*/
                {                                 /*开始kcounter,kstatus*/
                Dis_XMemory(-2468);
                delay(5000);
                Write_Value(-2468);
                h=Read_X();
                Dis_NewData(h);
                  for(x=0;x<20;x++)                   
                 {
                  delay(500);
                  LED0=!LED0;
                 }     
                 delay(5000);
                 lcd_init() ;                      /*液晶复位*/
                 Dis_XMemory(7236);
                 Write_Value(7236);
                 h=Read_X();
                 Dis_NewData(h);
                 for(x=0;x<20;x++)                   
                 {
                 delay(500);
                 LED0=!LED0;
                 }     
                 delay(5000);
                 lcd_init() ;                      /*液晶复位*/
                }         //while 循环
              }             //主循环

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值