用C语言怎么清除1602中的一小段数据

如题所述

1、设置指针void *P,p=1602,memset()函数清零,如果是动态开辟的就要用free。

2、例程:

/* ME300B单片机开发系统演示程序 - DS18B20温度显示     */
/* LCD1602显示                                       */
/*******************************************************************/
#include < reg51.h >
#include < intrins.h >
#define uchar unsigned char
#define uint   unsigned int
sbit DQ = P3^3 ;   //定义DS18B20端口DQ  
sbit BEEP=P3^7   ; //蜂鸣器驱动线
bit presence   ;
sbit LCD_RS = P2^0 ;             
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
uchar code   cdis1[ ] =  ;
uchar code   cdis2[ ] =  ;
uchar code   cdis3[ ] =  ;
uchar code   cdis4[ ] =  ;
unsigned char data   temp_data[2] =  ;
unsigned char data   display[5] =     ;
unsigned char code   ditab[16] =     {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                         0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ; 
unsigned char code   mytab[8] =  ;
#define delayNOP() ;  ;
/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
   while(ms--)
{
   for(y = 0 ; y<250 ; y++)
   {
    _nop_() ;
    _nop_() ;
    _nop_() ;
    _nop_() ;
   }
}
}
/******************************************************************/
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。    */
/******************************************************************/ 
bit lcd_busy()
{                          
     bit result ;
     LCD_RS = 0 ;
     LCD_RW = 1 ;
     LCD_EN = 1 ;
     delayNOP() ;
     result = (bit)(P0&0x80) ;
     LCD_EN = 0 ;
     return(result) ; 
}
/*写指令数据到LCD                                                   */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。           */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
    while(lcd_busy()) ;
     LCD_RS = 0 ;
     LCD_RW = 0 ;
     LCD_EN = 0 ;
     _nop_() ;
     _nop_() ; 
     P0 = cmd ;
     delayNOP() ;
     LCD_EN = 1 ;
     delayNOP() ;
     LCD_EN = 0 ;  
}
/*******************************************************************/
/*写显示数据到LCD                             */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。        */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
    while(lcd_busy()) ;
     LCD_RS = 1 ;
     LCD_RW = 0 ;
     LCD_EN = 0 ;
     P0 = dat ;
     delayNOP() ;
     LCD_EN = 1 ;
     delayNOP() ;
     LCD_EN = 0 ; 
}
/*   LCD初始化设定                                                   */
/*******************************************************************/
void lcd_init()

     delay1(15) ;   
     lcd_wcmd(0x01) ;       //清除LCD的显示内容            
     lcd_wcmd(0x38) ;       //16*2显示,5*7点阵,8位数据
     delay1(5) ;
     lcd_wcmd(0x38) ;         
     delay1(5) ;
     lcd_wcmd(0x38) ;         
     delay1(5) ;
     lcd_wcmd(0x0c) ;       //显示开,关光标
     delay1(5) ;
     lcd_wcmd(0x06) ;       //移动光标
     delay1(5) ;
     lcd_wcmd(0x01) ;       //清除LCD的显示内容
     delay1(5) ;
}
/*   设定显示位置                                     */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
   lcd_wcmd(pos | 0x80) ;   //数据指针=80+地址变量
}
/*自定义字符写入CGRAM                                    */
/*******************************************************************/
void   writetab()  
{  
     unsigned char i ;
     lcd_wcmd(0x40) ;             //写CGRAM
     for (i = 0 ; i< 8 ; i++)       
     lcd_wdat(mytab[ i ]) ;        
}
/*us级延时函数                                         */
/*******************************************************************/
void Delay(unsigned int num)
{
   while( --num ) ;
}
/*初始化ds1820                                       */
/*******************************************************************/
Init_DS18B20(void)
{  
      DQ = 1 ;       //DQ复位
      Delay(8) ;     //稍做延时
      DQ = 0 ;       //单片机将DQ拉低
      Delay(90) ;    //精确延时 大于 480us
      DQ = 1 ;        //拉高总线
      Delay(8) ;
      presence = DQ ;     //如果=0则初始化成功 =1则初始化失败
      Delay(100) ;
      DQ = 1 ; 
     
      return(presence) ; //返回信号,0=presence,1= no presence
}
/* 读一个字节                      */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--)
   {
     DQ = 0 ; // 给脉冲信号
     dat >>= 1 ;
     DQ = 1 ; // 给脉冲信号
     if(DQ)
      dat |= 0x80 ;
     Delay(4) ;
   }
     return (dat) ;
}
/* 写一个字节                                          */
/*******************************************************************/
WriteOneChar(unsigned char dat)
{
   unsigned char i = 0 ;
   for (i = 8 ; i > 0 ; i--)
   {
     DQ = 0 ;
     DQ = dat&0x01 ;
     Delay(5) ;
     DQ = 1 ;
     dat>>=1 ;
   }
}
/* 读取温度                             */
/*******************************************************************/
Read_Temperature(void)
{
      Init_DS18B20() ;
  
      WriteOneChar(0xCC) ;   // 跳过读序号列号的操作
      WriteOneChar(0x44) ;   // 启动温度转换
      Init_DS18B20() ;
      WriteOneChar(0xCC) ;   //跳过读序号列号的操作
      WriteOneChar(0xBE) ;   //读取温度寄存器
      temp_data[0] = ReadOneChar() ;    //温度低8位
      temp_data[1] = ReadOneChar() ;    //温度高8位 
}
/* 数据转换与温度显示                                               */
/*******************************************************************/
Disp_Temperature()
{
   display[4]=temp_data[0]&0x0f ;
   display[0]=ditab[display[4]]+0x30 ;      //查表得小数位的值
  
   display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
   display[3]=display[4]/100+0x30 ;
   display[1]=display[4]%100 ;
   display[2]=display[1]/10+0x30 ;
   display[1]=display[1]%10+0x30 ;
     if(display[3]==0x30)         //高位为0,不显示
    { 
      display[3]=0x20 ;              
      if(display[2]==0x30)       //次高位为0,不显示
      display[2]=0x20 ;
    }
      lcd_pos(0x48) ;             
      lcd_wdat(display[3]) ;         //百位数显示 
      lcd_pos(0x49) ;             
      lcd_wdat(display[2]) ;         //十位数显示 
   lcd_pos(0x4a) ;             
      lcd_wdat(display[1]) ;         //个位数显示 
   lcd_pos(0x4c) ;             
      lcd_wdat(display[0]) ;         //小数位数显示 
}  
/*******************************************************************/
/* 蜂鸣器响一声                  */
/*******************************************************************/
void beep()
   {
     unsigned char y ;
     for (y=0 ;y<100 ;y++)
     {
       Delay(60) ;
       BEEP=!BEEP ;                 //BEEP取反
     } 
     BEEP=1 ;                       //关闭蜂鸣器
Delay(40000) ;
   }
/* DS18B20 OK 显示菜单                                              */
/*******************************************************************/
void   Ok_Menu ()

     uchar   m ;
     lcd_init() ;                 //初始化LCD 
            
     lcd_pos(0) ;                 //设置显示位置为第一行的第1个字符
      m = 0 ;
     while(cdis1[m] != '\0')
      {                          //显示字符
        lcd_wdat(cdis1[m]) ;
        m++ ;
      }
     lcd_pos(0x40) ;              //设置显示位置为第二行第1个字符
      m = 0 ;
     while(cdis2[m] != '\0')
      {
        lcd_wdat(cdis2[m]) ;       //显示字符
        m++ ;
      }
      writetab() ;                //自定义字符写入CGRAM
      delay1(5) ;
      lcd_pos(0x4d) ;
      lcd_wdat(0x00) ;           //显示自定义字符
}
/* DS18B20 ERROR 显示菜单                              */
/*******************************************************************/
void   Error_Menu ()
{
      uchar   m ;
      lcd_init() ;                 //初始化LCD 
     lcd_pos(0) ;                 //设置显示位置为第一行的第1个字符
      m = 0 ;
      while(cdis3[m] != '\0')
      {                          //显示字符
        lcd_wdat(cdis3[m]) ;
        m++ ;
      }
      lcd_pos(0x40) ;              //设置显示位置为第二行第1个字符
      m = 0 ;
      while(cdis4[m] != '\0')
      {
        lcd_wdat(cdis4[m]) ;       //显示字符
        m++ ;
      }
}
/* 主函数      */
/************************************/
void main()
{
      Ok_Menu () ;
do
   {
       Read_Temperature() ;
    Disp_Temperature() ;
      }
     while(!presence)   ;
      Error_Menu () ;
do
   {  
     Init_DS18B20() ;
     beep() ;
      }
while(presence) ;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-09-08
您研究一下以下这个程序,然后就可以加上时间功能.多做一点就能多学一点.

开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示:
DS18B20 ERROR
PLEASE CHECK
蜂鸣器报警。

DS18B20检测正常,LCD1602显示:
DS18B20 OK
TEMP: 100.8℃
如果温度值高位为0,将不显示出来。
你可以通过拔插DS18B20查看DS18B20的检测功能。

/* ME300B单片机开发系统演示程序 - DS18B20温度显示 */
/* LCD1602显示 */
/* 作者: gguoqing */
/*Copyright(C)伟纳电子 All Rights Reserved */
/*******************************************************************/

#include < reg51.h >
#include < intrins.h >

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3 ; //定义DS18B20端口DQ
sbit BEEP=P3^7 ; //蜂鸣器驱动线

bit presence ;

sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;

uchar code cdis1[ ] = ;
uchar code cdis2[ ] = ;
uchar code cdis3[ ] = ;
uchar code cdis4[ ] = ;

unsigned char data temp_data[2] = ;
unsigned char data display[5] = ;
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ;
unsigned char code mytab[8] = ;

#define delayNOP() ; ;

/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}

/******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/******************************************************************/
bit lcd_busy()
{
bit result ;
LCD_RS = 0 ;
LCD_RW = 1 ;
LCD_EN = 1 ;
delayNOP() ;
result = (bit)(P0&0x80) ;
LCD_EN = 0 ;
return(result) ;
}

/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS = 0 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P0 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}

/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}

/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;

lcd_wcmd(0x0c) ; //显示开,关光标
delay1(5) ;
lcd_wcmd(0x06) ; //移动光标
delay1(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay1(5) ;
}

/* 设定显示位置 */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
}

/*自定义字符写入CGRAM */
/*******************************************************************/
void writetab()
{
unsigned char i ;
lcd_wcmd(0x40) ; //写CGRAM
for (i = 0 ; i< 8 ; i++)
lcd_wdat(mytab[ i ]) ;
}

/*us级延时函数 */
/*******************************************************************/

void Delay(unsigned int num)
{
while( --num ) ;
}

/*初始化ds1820 */
/*******************************************************************/
Init_DS18B20(void)
{
DQ = 1 ; //DQ复位
Delay(8) ; //稍做延时

DQ = 0 ; //单片机将DQ拉低
Delay(90) ; //精确延时 大于 480us

DQ = 1 ; //拉高总线
Delay(8) ;

presence = DQ ; //如果=0则初始化成功 =1则初始化失败
Delay(100) ;
DQ = 1 ;

return(presence) ; //返回信号,0=presence,1= no presence
}

/* 读一个字节 */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ = 1 ; // 给脉冲信号

if(DQ)
dat |= 0x80 ;
Delay(4) ;
}

return (dat) ;
}

/* 写一个字节 */
/*******************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
Delay(5) ;

DQ = 1 ;
dat>>=1 ;
}
}

/* 读取温度 */
/*******************************************************************/
Read_Temperature(void)
{
Init_DS18B20() ;

WriteOneChar(0xCC) ; // 跳过读序号列号的操作
WriteOneChar(0x44) ; // 启动温度转换

Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0xBE) ; //读取温度寄存器

temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
}

/* 数据转换与温度显示 */
/*******************************************************************/
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
display[3]=display[4]/100+0x30 ;
display[1]=display[4]%100 ;
display[2]=display[1]/10+0x30 ;
display[1]=display[1]%10+0x30 ;

if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}

lcd_pos(0x48) ;
lcd_wdat(display[3]) ; //百位数显示
lcd_pos(0x49) ;
lcd_wdat(display[2]) ; //十位数显示
lcd_pos(0x4a) ;
lcd_wdat(display[1]) ; //个位数显示
lcd_pos(0x4c) ;
lcd_wdat(display[0]) ; //小数位数显示
}

/*******************************************************************/
/* 蜂鸣器响一声 */
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
}
BEEP=1 ; //关闭蜂鸣器
Delay(40000) ;
}

/* DS18B20 OK 显示菜单 */
/*******************************************************************/
void Ok_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD

lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]) ;
m++ ;
}

lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}

writetab() ; //自定义字符写入CGRAM
delay1(5) ;
lcd_pos(0x4d) ;
lcd_wdat(0x00) ; //显示自定义字符
}

/* DS18B20 ERROR 显示菜单 */
/*******************************************************************/
void Error_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD

lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]) ;
m++ ;
}

lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]) ; //显示字符
m++ ;
}
}

/* 主函数 */
/************************************/
void main()
{
Ok_Menu () ;

do
{
Read_Temperature() ;
Disp_Temperature() ;
}
while(!presence) ;

Error_Menu () ;

do
{
Init_DS18B20() ;
beep() ;
}
while(presence) ;
}

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!本回答被提问者采纳
第2个回答  2010-09-12
你说的是1602液晶吧?
先写你要清数据的地址命令
write_com(0x80+0xxx);
write_dat(' ');
其实也就是写一个空格进去,显示的东西就给屏蔽掉了。
第3个回答  2010-09-12
设置指针void *P,p=1602,memset()函数清零,如果是动态开辟的就要用free

用C语言怎么清除1602中的一小段数据
1、设置指针void *P,p=1602,memset()函数清零,如果是动态开辟的就要用free。 2、例程: \/* ME300B单片机开发系统演示程序 - DS18B20温度显示 *\/\/* LCD1602显示 *\/\/***\/#include < reg51.h >#include < intrins.h >#define uchar unsigned char#define uint unsigned intsbit DQ = P3^3 ; \/\/定义DS18B2...

1602一行不足16个字符时不用空格会自动显示乱码,怎样能去除乱码_百度知 ...
write_command(0x80+0x40);你不能直接将4+8=c,在C语言里面不可以这样的。呵呵,你试下看看。

单片机控制的LCD1602数字钟的C语言编程
voidbusy(void){uchartemp=0x80;\/\/初始化temp最高位为1,使得能够进入下面 \/\/的while循环 p0=0xff;(p0就是8个数据口)rs=0;\/\/设置命令操作 rw=1;\/\/设置读操作 en=1;\/\/使能 delay(100);(这是设的延时函数,不用解释)while(temp&0x80)\/\/判忙,一旦表达式为假,即temp最高位为0,\/\/...

单片机 1602 液晶屏 检测是否忙对的c程序,看不懂,望详解
void busy_test()\/\/检测lcd是否忙{ u8 st; \/\/忙状态标志 0:不忙,0x80:忙 if(f_init==0) \/\/如果某个东西没有初始化 { return; \/\/ 退出忙判断,不执行下面的代码 } lcd=0xff; \/\/ 先往数据端口赋高电平,便于读数据 rs=0; \/\/ 读忙设置 ...

...键盘输入数字并在LCD1602上显示出来的C语言程序
输入 : 输入的命令值 输出 : 无 \/ void wcmd(uchar del){ while(Busy());RS = 0;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;} \/ 名称 : wdata(uchar del)功能 : 1602写数据函数 输入 : 需要写入1602的数据 输出 : 无 \/ void wdata(uchar del){ ...

单片机C语言1602设置 “三次显示模式设置,不检测忙信号”这句话是什 ...
三次显示模式好像就是设置16*2显示,5*7点阵,8位数据口 不检测忙信号就是在写指令时不检查busy位,直接用延迟的方法!

51单片机 控制1602 液晶 遇到问题 求高手指教
这可能是程序的延时问题,你要把显示的时间加大一点。如果是C语言则在主程序delay()中的数改大点。

单片机C语言程序设计实训100例综合设计中的用1602LCD与DS18B20设计的温度...
{\/\/消除显示缓冲中待显示行首尾可能出现的空格 if((i==0||i==15)&&*p==' ') p++;if(*p!='\\0'){ Disp_Buffer[i]=*p++;} else { if(++k>Line_Count) break;p=Msg[k];\/\/p指向下一串的首地址 Disp_Buffer[i]=*p++;} } \/\/不足16个字符时空格补充 for(j=i;j<16;j++) ...

请问一下有关1602显示的问题?
(unsigned long)是C语言中强行转换为unsigned long的意思,LCD1602内部的CGROM中的字形或字符是与标准的ASCII是相同的。而C语言编程的时候 数字+0X30 对应的正好是该数字的ASCII码。用 数字+0x30 是1602编程中最常用的数字显示方式

51单片机1602怎么显示一行字符,c语言的
lcd1602_e=0; lcd1602_e=1; }while(lcd1602_busy);}\/*** * 函数名称: lcd1602_WriteCmd() * 函数功能:写命令 * 入口参数:命令字 * 出口参数:无***\/void lcd1602_WriteCmd(const uchar cmd)

相似回答