微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > [C51代码]LCD12864头文件[上下屏]

[C51代码]LCD12864头文件[上下屏]

时间:11-10 来源:互联网 点击:
型号:LCD12864a3 驱动器:ST7920A

汉字显示坐标图:

图形显示坐标图:

/*====================lcd12864.h =====================*/

#ifndef _LCD12864_h_
#define _LCD12864_h_
#include
#include "delay.h"
#include "link.h"

/*================= ST7920LCD 定义 ===================*/

sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_e=P2^4;
sbit busy=P0^7;
#define Lcd_port P0

/*外部调用函数声明*/
extern void Chk_busy (void);
extern void LCD_Write_Cmd(uint8 cmd);
extern void LCD_Write_Dat(uint8 dat);
extern void LCD_Initial(void);
extern void LCD_Set_xy(uint8 x,uint8 y);
extern void Disp_hzk(uint8 x,uint8 y,uint8 *p);
extern void Disp16_hz_up(uint8 x,uint8 y, uint8 *hzk);
extern void Disp16_hz_down(uint8 x,uint8 y, uint8 *hzk);
extern void LCD_Img_Cls(void);
extern void Disp_img_up(uint8 x,uint8 y,uint8 high,uint8 line,uint8 *img);
extern void Disp_img_down(uint8 x,uint8 y,uint8 high,uint8 line,uint8 *img);

#endif

/*====================lcd12864.c =====================*/

#include
#include "delay.h"
#include "link.h"
#include "lcd12864.h"

/****************************************************************
*函数功能:检查忙碌位
*入口参数:无
*出口参数:无
****************************************************************/
void Chk_busy (void)
{
Lcd_port = 0xff;
lcd_e = 0;
lcd_rs = 0; // 命令
lcd_rw = 1; // 读
lcd_e = 1; //高电平读入
while(busy==1);
lcd_e = 0;
}

/****************************************************************
*函数功能:写LCD命令
*入口参数:命令参数cmd
*出口参数:无
****************************************************************/
void LCD_Write_Cmd(uint8 cmd)
{
Chk_busy ();
lcd_e=0;
lcd_rs = 0;
lcd_rw = 0; // 写
Lcd_port=cmd; // 输出命令
lcd_e=1; //下降沿写入
delay1ms(1);
lcd_e=0;
}

/****************************************************************
*函数功能:写LCD数据
*入口参数:数据参数dat
*出口参数:无
****************************************************************/
void LCD_Write_Dat(uint8 dat)
{
Chk_busy ();
lcd_e=0;
lcd_rs = 1;
lcd_rw = 0; // 写
Lcd_port=dat; // 输出数据
lcd_e=1; //下降沿写入
delay1ms(1);
lcd_e=0;
}

/****************************************************************
*函数功能:LCD初始化
*入口参数:无
*出口参数:无
****************************************************************/
void LCD_Initial(void)
{
LCD_Write_Cmd(0x30); // 30---基本指令动作
LCD_Write_Cmd(0x06); // 光标的移动方向,写一个字节,右移一位
LCD_Write_Cmd(0x0c); // 开显示,关游标
LCD_Write_Cmd(0x01);//清除显示
}

/****************************************************************
*函数功能:LCD光标定位
*入口参数:横坐标x,纵坐标y
*出口参数:无
****************************************************************/
void LCD_Set_xy(uint8 x,uint8 y)
{

uint8 address;
if(x>3) x = 3;
if(y>7) y = 7;
switch(x)
{
case 0: address = 0x80 + y; break;
case 1: address = 0x90 + y; break;
case 2: address = 0x88 + y; break;
case 3: address = 0x98 + y; break;
default:address = 0x80 + y; break;
}
LCD_Write_Cmd(address);
}

/****************************************************************
*函数功能:非图形模式下显示现有汉字库中的汉字
*入口参数:横坐标x,纵坐标y,待显示字符地址
*出口参数:无
****************************************************************/
void Disp_hzk(uint8 x,uint8 y,uint8 *p)
{
LCD_Set_xy(x,y);
while (*p!=\0)
{
LCD_Write_Dat(*p);
p++;
}
}
/****************************************************************
*函数功能:图型模式下指定位置显示汉字16*16
*入口参数:横坐标x,纵坐标y,待显示字符地址
*出口参数:无
****************************************************************/
void Disp16_hz_up(uint8 x,uint8 y, uint8 *hzk)
{
uint8 i,j;
uint16 k =0 ;
for(i=0;i<16;i++)
{
LCD_Write_Cmd(0x80+y*16+i); // 先写纵坐标,纵坐标不自动加
LCD_Write_Cmd(0x80+x); // 再写横坐标,模坐标自动加
for(j=0;j<2;j++)
{
LCD_Write_Dat(hzk[k++]);
}
}
}
void Disp16_hz_down(uint8 x,uint8 y, uint8 *hzk)
{
uint8 i,j;
uint16 k =0 ;
for(i=0;i<16;i++)
{
LCD_Write_Cmd(0x80+y*16+i); // 先写纵坐标,纵坐标不自动加
LCD_Write_Cmd(0x88+x); // 再写横坐标,模坐标自动加
for(j=0;j<2;j++)
{
LCD_Write_Dat(hzk[k++]);
}
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top