正負數 儲存讀取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 循環
              }             //主循環

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章