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

📄 read4442.c

📁 一个LCD2002液晶屏驱动程序,对于想对LCD想对LCD编程的朋友可以参考.
💻 C
字号:
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include <ctype.h> 
#include <setjmp.h> 

//#include <reg51.h>
#include "AT89X52.h"
#include <absacc.h>
#include <Read4442.h>

#define BN 16							    					//数据个数
#define allow 0x0EA
#define address 0x08                                            //下位机机号
#define FSA_INIT 0x00
#define FSA_ADDRESS 0x01
#define FSA_DATA 0x02

uchar command_pre,command_cur;

//uhar compare_command_buffer(void);
uchar compare_command_buffer(void) reentrant; 


uchar  bdata flag;
sbit  auto_flush=flag^1;
sbit  message_disp=flag^3;
sbit  message_flag=flag^2;                                      //需刷新显示置位

uchar recv_state = FSA_INIT;
uchar recv_ctr = 0;

uchar command_buffer_cur[16]; // =
//      {0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF};
uchar command_buffer_pre[16];

uchar command_buffer_OK[16] = 
      {0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0BF,0x0B4,0x1D,0x00,0x00,0x01,0x0C0,};

uchar command_buffer_Pin15ConnectPin16[16] = 
      {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uchar command_buffer_Pin4ConnectPin5[16] = 
      {0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF};

uchar command_buffer_Pin19ConnectPin20[16] = 
      {0x88,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x07F,0x69,0x3B};

main()
{
	init();

	message_flag = 0;
	message_disp = 1;
	Lcd2002Init();
	Lcd2002Clr(1);
	Lcd2002DispStr(4,1,"UC/OS-II V2.52");
    Lcd2002DispCha(12, 1, ' ');
    Lcd2002DispStr(13,1,"V2.52");
	while(1)
	{
		if(message_flag == 1)
		{
			 message_flag = 0; 
			 message_disp = 0;
			 command_pre = compare_command_buffer();
			 message_disp = 1;
			 if (command_pre == command_cur)
			{
			 	auto_flush = 0;
				auto_flush = 0;
			}
			 else 
			 {
				auto_flush = 1;
				command_cur = command_pre;
			 }
		}
		if (auto_flush == 1)
		switch(command_cur)
		{
			case  0x01:
			{
 // 				EA = 0 ;
				Lcd2002Clr(1);
				Lcd2002Clr(2);
				Lcd2002DispStr(2,2,"No SmartCard board");
				auto_flush = 0;
//				EA =1;
			}
			break;
			case  0x02:
			{
//  				EA = 0;
				Lcd2002Clr(1);
				Lcd2002DispStr(7,1,"Success!");
				Lcd2002Clr(2);
				Lcd2002DispStr(2,2,"SmartCard board OK");
				auto_flush = 0;
//				EA = 1;
			}
			break;
			case  0x03:
			{
//  				EA = 0;
				Lcd2002Clr(1);
				Lcd2002DispStr(1,1,"SmartCard Board Bad!");
				Lcd2002Clr(2);
				Lcd2002DispStr(1,2,"2 3 4 15 16 CN2:6 7!");
				auto_flush = 0;
//				EA = 1;
			}
			break;
			case  0x04:
			{
//  				EA = 0;
				Lcd2002Clr(1);
				Lcd2002DispStr(1,1,"SmartCard Board Bad!");
				Lcd2002Clr(2);
				Lcd2002DispStr(1,2,"Bridge:4 5 6 7 17 18");
				auto_flush = 0;
//				EA = 1;
			}
			break;
			case  0x05:
			{
//  				EA = 0;
				Lcd2002Clr(1);
				Lcd2002DispStr(1,1,"SmartCard Board Bad!");
				Lcd2002Clr(2);
				Lcd2002DispStr(3,2,"Bridge:18 19 20");
				auto_flush = 0;
//				EA = 1;
			}
			break;
			default: auto_flush = 0;
			break;
		
		}
	}
}
/*
void Delay10us(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
//    _nop_();
//    _nop_();
}

void Delay5us(void)
{
    _nop_();
    _nop_();
//    _nop_();
}
 */

void init()
{
	TMOD=0x20;
	TL1=0xFd;	   //19200  Fosc =22.1184
	TH1=0xFd;
//	TL1=0xFA;	   //9600   Fosc =22.1184
//	TH1=0xFA;
	SCON=0x50;
	PCON=0x00;
	EA = 1;
	ES = 1;
	TR1=1;	
}



void  Lcd2002Delay(void)
{
    INT8U i;

    i = 300;
    do
    {
      ;
    } while (--i != 0);
}

void  Lcd2002SendComm(INT8U Command)
{
    Lcd2002Delay();
    LCD2002_SEND_COMMAND(Command);
}

void  Lcd2002SendDate(INT8U Data)
{
    Lcd2002Delay();
    LCD2002_SEND_DATA(Data);
}

void  Lcd2002DispStr(INT8U x, INT8U y, INT8S *Data)
{
    if (y == 1)                                                 /* 在第一行显示 */
    {
        if (x < (20 + 1))                                       /* 有效的列号   */
        {
            Lcd2002SendComm(LCD2002_LINE1 - 1 + x);             /* 设置显示地址 */
            for( ; x < (20 + 1) && *Data != '\0'; x++)          /* 显示到字符串结束 */
                                                                /* 或是行结束   */
            {
                Lcd2002SendDate(*Data++);                       /* 显示一个字符 */
            }
            if (*Data != '\0')                                  /* 字符串没有结束 */
            {
                x = 1;                                          /* 从第二行第一列 */
                y = 2;                                          /* 继续显示       */
            }
        }
    }
    if (y == 2)                                                 /* 在第二行显示 */
    {
        Lcd2002SendComm(LCD2002_LINE2 - 1 + x);                 /* 设置显示地址 */
        for( ; x < (20 + 1) && *Data != '\0'; x++)              /* 显示到字符串结束 */
                                                                /* 或是行结束   */
        {
            Lcd2002SendDate(*Data++);                           /* 显示一个字符 */
        }
    }
}

void  Lcd2002DispCha(INT8U x, INT8U y, INT8U Data)
{
    if (y == 1)                                                 /* 在第一行显示 */
    {
        if (x < (20 + 1))                                       /* 有效的列号   */
        {
           Lcd2002SendComm(LCD2002_LINE1 - 1 + x);              /* 设置显示地址 */
            Lcd2002SendDate(Data);                              /* 显示一个字符 */
        }
    }
    if (y == 2)                                                 /* 在第二行显示 */
    {
        Lcd2002SendComm(LCD2002_LINE2 - 1 + x);                 /* 设置显示地址 */
        
            Lcd2002SendDate(Data);                              /* 显示一个字符 */
    }
}

void Lcd2002Clr(INT8U y)
{
    INT8U i;
    
    if(y==1)
    {
        Lcd2002SendComm(LCD2002_LINE1);
    }
    if(y==2)
    {
        Lcd2002SendComm(LCD2002_LINE2);
    }
    for(i=0;i<20;i++)  
      {
          Lcd2002SendDate(' ');
      }
}

void  Lcd2002Init(void)
{
    Lcd2002SendComm(LCD2002_MODE);          // 设置LCM模式(系统方式设置)
    Lcd2002SendComm(LCD2002_NO_FLASH);      // 打开LCM显示,无光标
    Lcd2002SendComm(LCD2002_NO_SHIFT);      // 字符向地址递增,光标移动
    Lcd2002SendComm(LCD2002_SH);            // 重新设为光标移动,向右移
    Lcd2002Clr(1);                          // 清屏
    Lcd2002Clr(2);
}


void serial_int(void) interrupt SIO_VECTOR using 3
{
  uchar c;
  if(_testbit_(RI))
  c = SBUF;
  switch(recv_state)
   {
     case FSA_INIT:
 	   if (c == 0xEA)
	     recv_state = FSA_ADDRESS;
	   else 
	     recv_state = FSA_INIT;
	   break;
	 case FSA_ADDRESS:
	   if (c == address)
 	     recv_state = FSA_DATA;
	   else 
	     recv_state = FSA_INIT;
 	   break;
	 case FSA_DATA:
	   {
	    command_buffer_pre[recv_ctr] = c;
	    recv_ctr ++;
	      if (recv_ctr >= BN)
		  {
			message_flag = 1;
			if(message_disp == 1)
			memcpy(command_buffer_cur,command_buffer_pre,16);
			recv_state = FSA_INIT;
			recv_ctr = 0;
          }
		  else
		    recv_state = FSA_DATA;
//		command = compare_command_buffer();
	   };
	   break;
   }
}


uchar compare_command_buffer(void) reentrant
{
 //uchar compare;
// uchar i;
// for(compare=0;compare<6;compare++)
 // {
//		i = strncmp(command_buffer_cur,command_buffer_OK,BN);
		if(!strncmp(command_buffer_cur,command_buffer_OK,16))
		{
			return(0x02);
		}
//		i = strncmp(command_buffer_cur,command_buffer_Pin15ConnectPin16,BN);

		else if(!strncmp(command_buffer_cur,command_buffer_Pin15ConnectPin16,16))
		{
			return(0x03);
		}
//		i = strncmp(command_buffer_cur,command_buffer_Pin4ConnectPin5,BN);
		else if(!strncmp(command_buffer_cur,command_buffer_Pin4ConnectPin5,16))
		{
			return(0x04);
		}
// 		i = strncmp(command_buffer_cur,command_buffer_Pin19ConnectPin20,BN);
		if(!strncmp(command_buffer_cur,command_buffer_Pin19ConnectPin20,16))
		{
			return(0x05);
		}

		else
			return(0x01);
//  }
// message_flag=1;
// return(0x01);
} 

⌨️ 快捷键说明

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