📄 lcd.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 + -