⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12232.c

📁 刚通过的1820温度显示程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//  DDRA = 0x00;                 //PA口输入
	lcd_data = 0xff;
	clr_A0();                      //指令
   	set_WR();                    //读
	NOP(); NOP();                         
	while(lcd_data & status_busy); //读入LCD状态,1=忙,一直等待LCD内部操作完成
//	DDRA = 0xff;	               //重新置PA口输出
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_init(void)
//函数说明:122x32LCD初始化,开机后仅调用一次
////////////////////////////////////////////////////////////////////////////////
void lcd_init(void)
{
    send_mi(reset);						//复位m-left,s-right
	 send_si(reset);

    send_mi(disp_off);					//关闭显示
    send_si(disp_off);

    send_mi(dynamic_driver);			//动态驱动
	 send_si(dynamic_driver);

    send_mi(clk32);			            //1/32占空比
	 send_si(clk32);

    send_mi(adc_select);				//clockwise
	 send_si(adc_select);

    //send_mi(mode_write);				//写模式
	 //send_si(mode_write);
    
    send_mi(col_addr_set);
	 send_mi(disp_start_line);			//归回零列,设定显示起始行首
    send_si(col_addr_set);
	 send_si(disp_start_line);
    
    send_mi(disp_on);                   //开显示
	 send_si(disp_on);  
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void lcd_clr(void)
//函数说明:清屏
////////////////////////////////////////////////////////////////////////////////
void lcd_clr(void)
{
    uchar i, page;
	for (page=0;page<4;page++)
    {
    	send_mi(page_addr_set+page);
		send_si(page_addr_set+page);
    	               
    	for (i=0;i<122;i++)            //若为62则中间可能有条竖线
    	{  send_mi(i);                     //主窗口设置为0列
		   send_si(i);                     //从窗口设置为0列
	    	send_md(0);
			send_sd(0);
		}
    }
}     

////////////////////////////////////////////////////////////////////////////////
//调用方式:void set_page(uchar page)
//函数说明:同时设置主(右)从(左)显示页为0-3页
////////////////////////////////////////////////////////////////////////////////
void set_page(uchar page)
{
    send_mi(page_addr_set|page);
    send_si(page_addr_set|page);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void SetAddress(uchar address)
//函数说明:同时设置主(右)从(左)列地址为0-61列
////////////////////////////////////////////////////////////////////////////////
void set_address(uchar address)
{
    send_mi(address&0x7F);  //&0x7F,考虑到防止越限
    send_si(address&0x7F);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_l(uchar c)
//函数说明:在右页(从窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_l(uchar c)
{
    send_md(c);
}

////////////////////////////////////////////////////////////////////////////////
//调用方式:void putchar_r(uchar c)
//函数说明:在左页(主窗口)当前地址画一个字节(8点)
////////////////////////////////////////////////////////////////////////////////
void putchar_r(uchar c)
{
    send_sd(c);
}    

////////////////////////////////////////////////////////////////////////////////
//调用方式:void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
//函数说明:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16
//          bmp是图形指针
//          使用zimo21软件,采用纵向取模下高位得到bmp数据。
//  col     图型的起始位置0~121
// layer    图形的位置(Y坐标)0-下半部分 非0-上半部分
// width    图形宽度8,16可选
//  bmp     图形数据指针
////////////////////////////////////////////////////////////////////////////////
void draw_bmp(uchar col,uchar layer,uchar width,uchar *bmp)
{
    uchar x;        
	uchar address;                  //address表示显存的物理地址
	uchar p=0;     	   
    uchar page=0;
	uchar window=0;  			    //page表示上下两页,window表示左右窗口(0左,1右)
    if (layer) page=2;              //左-主窗口,右-从窗口
    
    for (x=col; x<col+width; x++)
    {   
	    if (x>121)return;           //防止显示乱码
        if (x>60)					//左右窗口定位
		{
			window=1;               //右-从窗口
			address=x%61;
		}
        else
		    address=x;              //主窗口输出  

        set_page(page);             //上层数据输出
        set_address(address);
        
        if (window) 				
          putchar_r(bmp[p]);        
        else 
          putchar_l(bmp[p]);        

        set_page(page+1);           //下层数据输出
        set_address(address);       //列保持不变 
        
        if (window) 				
           putchar_r(bmp[p+width]);     
		else 
           putchar_l(bmp[p+width]);       

        p++;
    }
}

////////////////////////////////////////////////////////////////////////////////
//函数:void disp_one_ascii(uchar col,uchar layer,uchar ascii_code)
//说明:显示单个ASCII码col-列;layer-上下行:1-上,0-下;ascii_code:所要显示德ASCCII码
////////////////////////////////////////////////////////////////////////////////
void disp_one_ascii(uchar col,uchar layer,uchar ascii_code,uchar mode)
{
	uchar i;
	for(i=0;i<16;i++)                //ASCII码显示占用16个字节
	{   
		if(mode)dot_buffer[i]=~ascii[(ascii_code-0x20)*16 + i];
	    else    dot_buffer[i]= ascii[(ascii_code-0x20)*16 + i]; 
	}  
	draw_bmp(col,layer,8,dot_buffer);
}

////////////////////////////////////////////////////////////////////////////////
//函数:void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
//说明:显示小于4个的十进制数字//修改缓冲区的大小可以扩展显示
////////////////////////////////////////////////////////////////////////////////
void disp_ram_data(uchar col,uchar layer,uchar n,uchar mode)
{
     while(n--)
	 {
		if(mode)disp_one_ascii(col,layer,disp_buffer[n]+0x30,1);
		else    disp_one_ascii(col,layer,disp_buffer[n]+0x30,0);
		col += 8;
	 }
}

////////////////////////////////////////////////////////////////////////////////
//函数:void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
//说明:ASCII(8*16) 和 汉字(16*16)显示函数
////////////////////////////////////////////////////////////////////////////////
void dprintf(uchar col,uchar layer,uchar *ptr,uchar mode)
{
	uchar c1,c2;
	uchar i,j,k;
	uchar ulen;
	//uchar ucol,ulayer,umode;
	uchar ucol,ulayer;
    ulen = 0; 
	ucol = col;   
	ulayer = layer;
	
	while (ptr[ulen]!= 0)ulen++;		   //探测字串长度
    i=0;
	while(i<ulen)
	{
		c1 = ptr[i];
		c2 = ptr[i+1];
        //ASCII字符与汉字内码的区别在于128做分界;大于128的为汉字码
		if(c1 <=128)					  //ASCII
		{   
		        if(mode)disp_one_ascii(ucol,ulayer,c1,1);
				else    disp_one_ascii(ucol,ulayer,c1,0);
				ucol+=8;
				i++;                      //ASCII码的处理
		}
		else							  //中文
		{
			    for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  				                        
			    {                         //查找定位当前汉字的点阵区
				    if((c1 == GB_16[j].Index[0]) && (c2 == GB_16[j].Index[1]))
					break;
			    }
			    for(k=0;k<32;k++)
				{   if(mode)dot_buffer[k]=~GB_16[j].Msk[k];
				    else    dot_buffer[k]= GB_16[j].Msk[k];
				}
			    draw_bmp(ucol,ulayer,16,dot_buffer);
			    ucol+=16;
				i+=2;                     //中文的处理
		}
	}
}	


void delay(uint x)   ////when crystal is 12M ,a*2+5 us  ,子程序调用要5us,while 就等于DJNZ指令
{ 
while (x--);
}

bit reset(void)                //初始化18B20 
{ 
    bit presence=0;      //定义一个应答信号     
    DQ=1; 
 	 DQ=0;
     delay(80);                 //置总线为低电平并保持至少480us       
    DQ=1;                //等电阻拉高总线并保持15-60us 
   delay(5);     
    presence=DQ;              //接受应答信号 
   delay(13);                           //延时60-240us  
    return(presence);         //返回应答信号 
} 

/* 从DS18B20读出1个字节 */
uchar read_byte(void)        //从18b20读一个字节.返回读到的内容
{
    uchar i,j;
    j=0;                              
    for(i=0;i<8;i++)
     {
        j=j>>1;
        DQ=0;
        _nop_();                      //要求>1us,但又不能超过15us
        _nop_();
        DQ=1;                  //释放总线
        _nop_();
        _nop_();
        if(DQ)
        j|=0x80;
        delay(30); 
     }
	    return  (j);
 }


void write_byte(uchar val)  //向DS18B20写入1个字节 
{
    uchar i;
    for(i=0;i<8;i++)
    {
        DQ=0;
        _nop_();                      //要求>1us,但又不能超过15us
        _nop_();
        if(0x01&val)
             DQ=1;
        delay(30);                  //要求总时间在60-120us
        DQ=1;                  //释放总线
        _nop_();                      //要求>1us      
        val=val>>1;
    }    
}

/* 读取温度子程序       */
 get_temperature(void)
{
    uchar msb;//高8位
    uchar lsb;//低8位
    reset();         /* 发送复位信号     */
    delay(20);
    write_byte(0xcc);          /* 跳过ROM          */
    write_byte(0x44);         /* 发送转换温度命令 */
    reset();
    delay(14);
    write_byte(0xcc);
    write_byte(0xBE);         /* 发送读memory命令 */
    lsb =read_byte();
    msb =read_byte();
    reset();
if((msb&0xF0)>0) { flag=1;msb=~msb; lsb=~lsb+1;}//如果为负温度取反加1
else  flag=0;
table[0]=(msb<<4)|(lsb&0>>4);
table[1]=((lsb<<4)*5)/128;// 小数点后两位.可做到后4位即0.0625为单位
}

main ()
{
    get_temperature();
    while(1)
    {
         get_temperature();
        if (flag)
        {
         ;   
        }
        delay(10000);
    }
}


////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/*
void main(void)
{	
   char i;
   uint  j;
//   DDRC=0xF0;                           //C口高四位为输出控制端口
//   DDRA=0xFF;                           //A口为数据线(一般为输出,仅在读LCD状态时为输入)
   for(i=0;i<10;i++);
	for(j=1;j<10;j++);       //开机延时
   lcd_init();
   lcd_clr();
   while(1) 
	{
		for(i=121;i>0;i--)        //往左滚动输出
				{
			   lcd_clr();
				dprintf((i+24),1,"太川单片机          欢迎光临",0);//第二步,调整数据使它达到要求10个空格刚刚好在中间
			   dprintf((i-96),0,"单 HTTP://TCMCU.ICPCN.COM",0);
			   //第一步,调整I-x使最后出现的达到要求,第一个字出现在后面也不要紧
				delay_ms(200);
				
				}
    delay_ms(3000);
    lcd_clr();
    delay_ms(3000);
	 for(i=121;i>0;i--)      //往左滚动输出
				{
			   lcd_clr();
				dprintf((i+24),1,"太川单片机",0);
			   dprintf(i,0,"电话:028-66021915",1); 
			   delay_ms(200);
					
				}
	   delay_ms(1000);
		lcd_clr();delay_ms(200);
            dprintf(24,1,"太川单片机",0);
			   dprintf(0,0,"电话:028-66021915",1);
		      delay_ms(200);
      lcd_clr();delay_ms(200);
            dprintf(24,1,"太川单片机",0);
			   dprintf(0,0,"电话:028-66021915",1);
		      delay_ms(200);
		lcd_clr();delay_ms(200);
            dprintf(24,1,"太川单片机",0);
			   dprintf(0,0,"电话:028-66021915",1);
		      delay_ms(200);
		lcd_clr();
		      delay_ms(200);

	
   
	} 
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -