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

📄 lcd.c

📁 C8051F020单片机的AD测试程序
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: lcd.C
* 文件标识: none
* 适用器件: c8051f020
* 
* 摘 要: 本文件是LCD显示子程序;使用外部22.1184MHz晶振,将跳线器JP8短接,R44空闲
* 
* 当前版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件

#include "c8051F020.h"
#include "Const.h"
#include "lcd.h"
#include <intrins.h>

/************************************************************************************/

/************************************************************************************/
// 全局变量
/************************************************************************************/

unsigned char col,row,cbyte;			/*列x,行(页)y,输出数据*/
bit xy;									/*画线方向标志:1水平*/
unsigned int xdata addr;
unsigned char xdata *tp;
unsigned char xdata et;

/***********************************************************************************
* 函数名称:lcd_init;
*
* 函数功能描述:lcd_init;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void lcd_init(void)                                           
  {

	DISABLE_INTERRUPTS;//EA=0	

	addr=0x980c;

	lcd_wrct(0xc0);
	lcd_wrct(0x40);		// COLOUM ADDRESS
	lcd_wrct(0xb8);		// ROW ADDRESS
	lcd_wrct(0x3f);

	ENABLE_INTERRUPTS;  //EA=1   

 }

/***********************************************************************************
* 函数名称:checkbusy;
*
* 函数功能描述: 判断LCD忙等待;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void checkbusy(void)
{
	addr=0x980e;

	_nop_();_nop_();
    _nop_();_nop_();

	do
	{
		tp=addr;
	}while((*tp&0x80)==0x80);

	addr=0x180f;
}

/***********************************************************************************
* 函数名称:lcd_wrct;
*
* 函数功能描述: 向LCD写命令;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void lcd_wrct(unsigned char dd)
{
	DISABLE_INTERRUPTS;	

	addr=0x980c;
    tp=addr;
	*tp=dd;

	addr=0x180c;

	_nop_();_nop_();
    _nop_();_nop_();

	addr=0x180d;

	ENABLE_INTERRUPTS;
}

/***********************************************************************************
* 函数名称:set_xy;
*
* 函数功能描述: LCD读写位置变换;
*              
* 输入参数:unsigned char类型坐标x,y;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void set_xy(unsigned char x,unsigned char y)
{
	DISABLE_INTERRUPTS;
  
    checkbusy();

	y&=0x07;
	y|=0xB8;
	lcd_wrct(y);

    x&=0x3F;
	x|=0x40;
	lcd_wrct(x);

	ENABLE_INTERRUPTS;
}

/***********************************************************************************
* 函数名称:lcd_wrda;
*
* 函数功能描述:向LCD写数据;
*              
* 输入参数:unsigned char类型坐标x,y, unsigned char类型写入数据dd;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void lcd_wrda(unsigned char x,unsigned char y,unsigned char dd)
  {
    
   	DISABLE_INTERRUPTS;
	set_xy(x,y);
    checkbusy();
    if(x<64)
         {
			addr=0x9805;
			tp=0x9805;
		 }
    else
         {
			addr=0x9809;
			tp=0x9809;
		 }

	*tp=dd;

	addr&=0x1fff;

	_nop_();_nop_();
	_nop_();_nop_();

	addr|=0x8000;

	ENABLE_INTERRUPTS;
  }

/***********************************************************************************
* 函数名称:lcd_rdda;
*
* 函数功能描述:从LCD中读数据;
*              
* 输入参数:unsigned char类型坐标x,y, 
*
* 返回数据:unsigned char类型读出数据;
*
* 注意:    none;
************************************************************************************/

unsigned char lcd_rdda(unsigned char x,unsigned char y)
{  
	unsigned char xdata readdata;

    set_xy(x,y);
    checkbusy();
    if(x<64)
         {
			addr=0x9807;
			tp=addr;
			addr=0x1805;
		 }
    else
         {
			addr=0x980b;
			tp=addr;
			addr=0x1809;
		 }
	readdata=*tp;
    checkbusy();
    if(x<64)
         {
			addr=0x9807;
			tp=addr;
			addr=0x1805;
		 }
    else
         {
			addr=0x980b;
			tp=addr;
			addr=0x1809;
		 }
	readdata=*tp;
	return readdata;
}

/***********************************************************************************
* 函数名称:dis_start;
*
* 函数功能描述:显示开机画面;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void dis_start(void)
{
    unsigned char x,y;
    for(y=0;y<8;y++)
    {
        for(x=0;x<128;x++)
           {
               _nop_();_nop_();
               lcd_wrda(x,y,0xAA); _nop_();_nop_();
               lcd_wrda(x+1,y,0x55);_nop_();_nop_();
               x+=1;
           }
    }
}

/***********************************************************************************
* 函数名称:dis_clr;
*
* 函数功能描述: 清屏;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void dis_clr(void)
{
      unsigned char x,y;
      for(y=0;y<8;y++)
        {
           for(x=0;x<128;x++)                
                 lcd_wrda(x,y,0x00);
        }
}

/***********************************************************************************
* 函数名称:dis_full;
*
* 函数功能描述: 写满屏;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void dis_full(void)
{
      unsigned char x,y;
      for(y=0;y<8;y++)
        {
           for(x=0;x<128;x++)                
                 lcd_wrda(x,y,0xff);
        }
}

/***********************************************************************************
* 函数名称:LCD_Draw_dot;
*
* 函数功能描述:画点(x,y);
*              
* 输入参数:BYTE类型坐标x,y; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void  LCD_Draw_dot(BYTE x,BYTE y,bool flag)
{
	R_BYTE temp,bit_x;

	bit_x=7-y%8;

	y=7-y/8;

	
	temp=lcd_rdda(x,y);
	if (flag)
		temp|=(1<<bit_x);
	else
		temp&=~(1<<bit_x);

	lcd_wrda(x,y,temp);
}

/***********************************************************************************
* 函数名称:LCD_Draw_byte;
*
* 函数功能描述:向LCD写一个字节数据;
*              
* 输入参数:BYTE类型坐标x,y;BYTE类型字节数据value;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void  LCD_Draw_byte(BYTE x,y, BYTE value)
{
	R_BYTE temp,bit_x;

	bit_x=y%8;
	y=y/8;

	if (bit_x==0)
		lcd_wrda(x,y,value);
	else
	{	
		temp=lcd_rdda(x,y);	
		
		temp&=(0xff>>(8-bit_x));
		temp|=(value<<bit_x);
		lcd_wrda(x,y,temp);
	
		temp=lcd_rdda(x,y+1);
		temp&=(0xff<<bit_x);
		temp|=(value>>(8-bit_x));
		lcd_wrda(x,y+1,temp);		
	}
}

/***********************************************************************************
* 函数名称:LCD_Disp_Word;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Word(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, *p++);	
}

/***********************************************************************************
* 函数名称: LCD_Disp_Word_F;
*
* 函数功能描述:向LCD写一组数据,显示白字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Word_F(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, ~(*p++));
	
}

/***********************************************************************************
* 函数名称: LCD_Disp_Time;
*
* 函数功能描述:向LCD写一组数据,显示时间;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Time(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, *p++);
}

/***********************************************************************************
* 函数名称: LCD_Disp_Flash_Word;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据xdata区指针p

⌨️ 快捷键说明

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