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

📄 lcd.c

📁 C8051F系列单片机BTF020多功能板的LCD16*2控制程序
💻 C
字号:
//-----------------------------------------------------------------------------
//程序描述:
//  这个程序可以在该液晶模块上显示字符:"  BT F020 V1.0  www.xhl.com.cn"
//  此程序用4位数据线来驱动液晶
//  液晶接线方法 :1脚接地;2脚接+5V;3脚通过1个10K电阻接+5v,通过1个430欧电阻接地;
//  15脚接地;16脚通过1个15R电阻接+5v。液晶别的引脚直接接相应的数据或控制信号线。
//作者:ZDP
//时间:2005-11-30
//版本:V1.0
//-----------------------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------------------
#include <c8051f020.h>                 

//-----------------------------------------------------------------------------
//全局变量定义
//-----------------------------------------------------------------------------
#define sysclk 22118400
unsigned char kc;                                 
unsigned long x;                 //"www.xhl.com.cn"
unsigned char code Netdata[]={"  www.xhl.com.cn                        "
                              "   BT F020 V1.0                         "
							  };
//0x77,0x77,0x77,0x2e,0x78,0x68,0x6c,0x2e,0x63,0x6f,
                               //  0x6d,0x2e,0x63,0x6e,0x20,0x20,0x20,0x20,0x20,0x20,
                               //  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                               //  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};                                
                               
                                 //"  BT F020 V1.0  "
//unsigned char xdata NCDdata[40]={0x20,0x20,0x42,0x54,0x20,0x46,0x30,0x32,0x30,0x20,
                               //  0x56,0x31,0x2e,0x30,0x20,0x20,0x20,0x20,0x20,0x20,
                              //   0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                               //  0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
                                                              
//unsigned char *lcdpoint;        //指向 lcddata数组的指针

//-----------------------------------------------------------------------------
// 函数定义
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void LCD_Init(void);
void delayms(unsigned int ms);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
 {unsigned int i;
	static unsigned char data1;
    WDTCN = 0xde;
    WDTCN = 0xad;                       	//禁止看门狗定时器
                                          
    PORT_Init ();                          	// 交叉开关和通用I/O口初始化
    kc=0;
   P2=0x00;
   P3=0x00;
   	EA = 0;
 	while(1){
	SYSCLK_Init ();                        	// 系统时钟初始化
    delayms(5000);
    if(kc==1)	
   	{   LCD_Init();//LCD初始化
	       	P2 = 0x00;
			P3 = 0x80;
        	P2 = 0x80;
    for(x=0;x<1000;x++);
 	     	P2 = 0x00;
 for(x=0;x<1000;x++);

	    P2  = 0x20;                        //准备送数据
	     for(x=0;x<1000;x++);
	    for(i=0;i<40;i++)//显示第一行字符
	    { 
		    data1=*((Netdata+i));
		    P3 = data1; 
//-----------------------------------------------------
	        P2 = 0xA0;                   /*原来的LCD程序*/ 
			P2 = 0x20;
//-----------------------------------------------------
		   // P2 = 0xA0;                   //修改后的LCD程序
           // P2 = 0x20;
//------------------------------------------------------/
	       // lcdpoint++;
			for(x=0;x<1000;x++);
		}
	    P2=0x00;
   	    P3 = 0xc0;
		P2 = 0x80; 
		   for(x=0;x<1000;x++);
 	       		P2 = 0x00;
		 for(x=0;x<1000;x++);
 	     
   		
   		P2 = 0x20;
	   //lcdpoint1=Netdata;					//取地址
	    for(i=0;i<40;i++)//显示第一行字符
	    {    
		    data1=*((Netdata+i+40));				//读出数据				
		    P3 = data1; 					//写数据到端口
		    P2 = 0xA0;                   //修改后的LCD程序
			for(x=0;x<1000;x++);
            P2 = 0x20;	
	        //lcdpoint1++;
			for(x=0;x<1000;x++);
		}
     kc=0;
	   
	}

   }
 }

//-----------------------------------------------------------------------------
//函数名称:      SYSCLK_Init ()
//函数功能:      系统时钟初始化
//入口参数:      无
//出口参数:      无
//全局变量引用:  无
//调用模块:      无 
//-----------------------------------------------------------------------------
//

  void SYSCLK_Init (void)
{
   int i;                              // delay counter

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;           // Wait for osc. to start up

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   OSCICN = 0x88;    

   //OSCICN = 0x05;                          // 系统时钟初始化为片内的 24.5MHz / 8                                                           
 }

//-----------------------------------------------------------------------------
//函数名称:      PORT_Init  ()
//函数功能:      通用I/O口及交叉开关初始化
//入口参数:      无
//出口参数:      无
//全局变量引用:  无
//调用模块:      无  
//-----------------------------------------------------------------------------

void PORT_Init (void)
{

   XBR0     = 0x00;                       // 没有选择数字外设
   XBR2     = 0x40;
   P2MDOUT  = 0xe0;                       // P2口设为推挽方式
}
//-----------------------------------------------------------------------------
//函数名称:      LCD_Init ()
//函数功能:      LCD初始化
//入口参数:      无
//出口参数:      无
//全局变量引用:  无
//调用模块:      无  
//-----------------------------------------------------------------------------
void LCD_Init(void)
{  
  for(x=0;x<50000;x++);
   //P7 = 0x30;				/*一行显示*/
   
   P2=0x00;
   P3 = 0x38;				/*两行显示*/
   P2 = 0X80;
    for(x=0;x<1000;x++);
   P2 = 0X00;//0x08;
    for(x=0;x<1000;x++);

   	P2=0x00;
	P3 = 0x04;   //显示开,光标开;不闪
   P2 = 0X80;//0x09; 
   for(x=0;x<1000;x++);   
  P2 = 0x00;
 for(x=0;x<1000;x++);
 
   P2 = 0x00;
   P3=  0x0c;  //增量方式,现不移动
   P2 = 0x80;
   for(x=0;x<1000;x++); 
   P2 = 0x00;
    for(x=0;x<1000;x++);

	P2 = 0x00;
	P3 = 0x01;// 清屏
   P2 = 0x80;
   for(x=0;x<5000;x++);
   P2 = 0x00;
    for(x=0;x<1000;x++);
   
	P2 = 0x80;
   OSCICN = 0x05; 
   for(x=0;x<5000;x++);
}
void delayms(unsigned int ms)
{int i; // 毫秒计数器
for (i = 0; i < ms; i++) { // 数毫秒
TR0 = 0; // 停定时器T0
TH0 = (-sysclk/1000) >> 8; // 设置定时器T0 1ms溢出
TL0 = -sysclk/1000;
TR0 = 1; // 启动定时器T0
while (TF0 == 0); // 等待溢出
TF0 = 0; // 清除溢出标志
kc=1;
}
}

⌨️ 快捷键说明

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