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

📄 tt.c

📁 此为一温度自动控制系统
💻 C
字号:
/*******************************************************************
注意: 此文档为仿真程序,若要在试验板上验证,需要须改一下函数
  void lcd_wait(void)
{
    DATAPORT=0xff;	     
	LCM_EN=1;
    LCM_RS=0;   			
    LCM_RW=1;   			
    _nop_();
    while(DATAPORT&BUSY)
	/*{  LCM_EN=0;
	   _nop_();
	   _nop_();
	   LCM_EN=1;
	   _nop_();
	   _nop_();
	   }*//*
   	LCM_EN=0;
	
}■○
地址:01000000  数据:00001110     图示:○○○○■■■○
   01000001     00010001           ○○○■○○○■
   01000010     00010000           ○○○■○○○○
   01000011     00010000           ○○○■○○○○
   01000100     00010000           ○○○■○○○○
   01000101     00010000           ○○○■○○○○
   01000110     00010001           ○○○■○○○■
   01000111     00001110           ○○○○■■■○

0x80,0x00,  0x44,0x41,  0x24,0x42,  0x14,0x44,  
0x08,0x9C,  0x0C,0xF4,  0x1B,0x28,  0x29,0x60,  
0x48,0xA0,  0x09,0x68,  0x0B,0x26,  0x0E,0x32,  
0x08,0xA8,  0x18,0x64,  0x20,0x02,  0x40,0x01,
*******************************************************************/

#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint   unsigned int
/*uchar table[]={0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00,
				0x0e,0x11,0x10,0x10,0x10,0x11,0x0e,0x00};//字符℃*/
uchar table[]={0x00,0x01,0x09,0x12,0x24,0x50,0x90,0x11,
				0x00,0x00,0x00,0xfe,0x02,0x44,0x40,0x50,
				0x12,0x14,0x10,0x10,0x11,0x10,0x00,0x00,
				0x48,0x40,0x40,0x40,0x40,0xb0,0x00,0x00};
/*uchar table[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
				0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
				0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
				0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
				0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
				0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
				0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
				0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案 */

#define BUSY  0x80                               //lcd忙检测标志
#define DATAPORT P0                              //定义P0口为LCD通讯端口
 
sbit LCM_RS=P2^0;								//数据/命令端
sbit LCM_RW=P2^1;								//读/写选择端
sbit LCM_EN=P2^2;
sbit sda=P2^3;                          //IO口定义
sbit scl=P2^4;              				//LCD使能信号
sbit ad_busy=P3^2;              				//adc中断方式接口

uchar ad_data;                  				//ad采样值存储						
uchar seconde;                				//定义并初始化时钟变量
uchar minite;
uchar hour;
uchar mstcnt=0;
uchar temp1,temp2,temp;         			    //温度显示变量
uchar t,set;
uchar K;
bit ON_OFF=0;
bit outflag;
bit write=0;

uchar code str0[]={"LCD TEST        "};
uchar code str1[]={"SUCCESSFUL      "};

void delay_LCM(uint);             											//LCD延时子程序
void initLCM(void);               											//LCD初始化子程序
void lcd_wait(void);              											//LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM);                                             //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData);                           //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData);                    //显示指定坐标的一串字符子函数
/*********延时K*1ms,12.000mhz**********/

void delay_LCM(uint k)
{
    uint i,j;
    for(i=0;i<k;i++)
    {
        for(j=0;j<60;j++)
        	{;}
    }
}   
/**********写指令到LCM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)lcd_wait();
	DATAPORT=WCLCM;
    LCM_RS=0;                   // 选中指令寄存器
    LCM_RW=0;               	// 写模式	
    LCM_EN=1;    
	_nop_();   
	_nop_();
	_nop_(); 
    LCM_EN=0;  
}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)
{ 
    lcd_wait( );            //检测忙信号    
	DATAPORT=WDLCM;
    LCM_RS=1;               // 选中数据寄存器
    LCM_RW=0;           	// 写模式
    LCM_EN=1;
    _nop_();
	_nop_();
	_nop_();
    LCM_EN=0;
}

/***********lcm内部等待函数*************/


void lcd_wait(void)
{
    DATAPORT=0xff;	     
	LCM_EN=1;
    LCM_RS=0;   			
    LCM_RW=1;   			
    _nop_();
    while(DATAPORT&BUSY)
	{  LCM_EN=0;
	   _nop_();
	   _nop_();
	   LCM_EN=1;
	   _nop_();
	   _nop_();
	   }
   	LCM_EN=0;
	
}


/**********LCM初始化子函数***********/

void initLCM( )
{   
	DATAPORT=0;	
	delay_LCM(15);
	WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
    delay_LCM(5); 
    WriteCommandLCM(0x38,0);
    delay_LCM(5); 
    WriteCommandLCM(0x38,0);
    delay_LCM(5); 

    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
    WriteCommandLCM(0x01,1);    //清屏,检测忙信号
    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}

/****************显示指定坐标的一个字符子函数*************/

void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
    X|=0x80;                    //指令码为地址码+0X80
    WriteCommandLCM(X,0);
    WriteDataLCM(DData);
}

/***********显示指定坐标的一串字符子函数***********/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
    while(X<16)
    {
        DisplayOneChar(X,Y,DData[ListLength]);
        ListLength++;
        X++;
    }
}

/***********the main funtion*************/
    
void main(void)
{ 
    unsigned char a,b,c,tmp;
    P1=0xff;                                   				//初始化p1口,全设为1       
	delay_LCM(500);	                                        //延时500ms启动
	initLCM( );                               				//LCD初始化 
	tmp=0x40;//设置CGRAM地址的格式字
	c=0;
    for(a=0;a<4;a++)
	{
		for(b=0;b<8;b++)
    	{
			WriteCommandLCM(tmp+b,1); // 设置自定义字符的 CGRAM 地址  
			delay_LCM(2);
			WriteDataLCM(table[c]); // 向CGRAM写入自定义字符表的数据
			c++;
			delay_LCM(2);
		}
		tmp=tmp+8;
	}
	//DisplayListChar(0,0,str0);
	//DisplayListChar(0,1,str1);
  for(a=0;a<2;a++)
	{
		DisplayOneChar(1+a,0,a);//在第一行第11列位置显示心图案的上半部(列数,行数,数据地址)
	}
	for(a=2;a<4;a++)
	{
		DisplayOneChar(1+a-2,1,a);//在第一行第11列位置显示心图案的上半部(列数,行数,数据地址)
	}
	while (1);
}

⌨️ 快捷键说明

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