正负数 储存读取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
    评论
要实现STC单片机LCD1602显示温度,需要先连接温度传感器并读取温度值,然后将温度值转换为字符串并输出到LCD1602上。 以下是可能的代码实现: ```c #include <STC12C5A60S2.h> #include <intrins.h> #define LCD_RS P1_0 // LCD1602 RS信号引脚 #define LCD_RW P1_1 // LCD1602 RW信号引脚 #define LCD_E P1_2 // LCD1602 E信号引脚 #define LCD_D4 P1_4 // LCD1602 数据信号引脚4 #define LCD_D5 P1_5 // LCD1602 数据信号引脚5 #define LCD_D6 P1_6 // LCD1602 数据信号引脚6 #define LCD_D7 P1_7 // LCD1602 数据信号引脚7 #define TEMP_PIN P3_0 // 温度传感器引脚 // 延时函数 void delay(unsigned int t) { while(t--); } // LCD1602命令写入 void LCD_WriteCmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_E = 0; _nop_(); _nop_(); LCD_D7 = cmd >> 7; LCD_D6 = (cmd >> 6) & 0x01; LCD_D5 = (cmd >> 5) & 0x01; LCD_D4 = (cmd >> 4) & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; _nop_(); _nop_(); LCD_D7 = (cmd >> 3) & 0x01; LCD_D6 = (cmd >> 2) & 0x01; LCD_D5 = (cmd >> 1) & 0x01; LCD_D4 = cmd & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay(5); } // LCD1602数据写入 void LCD_WriteData(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_E = 0; _nop_(); _nop_(); LCD_D7 = data >> 7; LCD_D6 = (data >> 6) & 0x01; LCD_D5 = (data >> 5) & 0x01; LCD_D4 = (data >> 4) & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; _nop_(); _nop_(); LCD_D7 = (data >> 3) & 0x01; LCD_D6 = (data >> 2) & 0x01; LCD_D5 = (data >> 1) & 0x01; LCD_D4 = data & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay(5); } // 初始化LCD1602 void LCD_Init() { delay(15000); LCD_WriteCmd(0x30); delay(4500); LCD_WriteCmd(0x30); delay(300); LCD_WriteCmd(0x30); delay(600); LCD_WriteCmd(0x38); // 设置16x2显示,5x8点阵,8位数据接口 LCD_WriteCmd(0x08); // 关闭显示 LCD_WriteCmd(0x01); // 清除显示 LCD_WriteCmd(0x06); // 显示光标右移,不移动内容 LCD_WriteCmd(0x0C); // 打开显示,不显示光标、闪烁 } // 读取温度值 float Get_Temperature() { unsigned int temp; // 温度值 unsigned char low_byte, high_byte; // 低字节和高字节 float temperature; // 实际温度值 // 启动温度传感器 TEMP_PIN = 1; delay(10); TEMP_PIN = 0; delay(10); // 读取温度值 TEMP_PIN = 1; delay(10); low_byte = TEMP_PIN; delay(10); high_byte = TEMP_PIN; delay(10); // 计算温度值 temp = (high_byte << 8) | low_byte; temperature = temp * 0.0625; return temperature; } // 将浮点数转换为字符串 void FloatToString(char* str, float value) { int integer = (int)value; int decimal = (int)((value - integer) * 100); sprintf(str, "%d.%02d", integer, decimal); } void main() { char temp_str[10]; // 存储温度字符串 LCD_Init(); // 初始化LCD1602 while(1) { float temperature = Get_Temperature(); // 读取温度值 FloatToString(temp_str, temperature); // 将温度值转换为字符串 LCD_WriteCmd(0x01); // 清屏 LCD_WriteCmd(0x80); // 光标移到第一行第一列 LCD_WriteData('T'); LCD_WriteData('e'); LCD_WriteData('m'); LCD_WriteData('p'); LCD_WriteData(':'); LCD_WriteData(' '); for(int i = 0; i < strlen(temp_str); i++) { LCD_WriteData(temp_str[i]); // 在第一行显示温度值 } delay(1000); // 延时1秒钟 } } ``` 注意:以上代码仅供参考,具体实现方式可能因电路设计、STC单片机型号等因素而异。请根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值