×
嵌入式 > 嵌入式开发 > 详情

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

发布时间:2020-08-19 发布时间:
|
型号: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++]);
}
}
}

/****************************************************************
*函数功能:图型模式清屏
*入口参数:无
*出口参数:无
****************************************************************/
void LCD_Img_Cls(void)
{
uint8 i,j;
for(i=0;i<32;i++)
{
LCD_Write_Cmd(0x80+i);
LCD_Write_Cmd(0x80);
for(j=0;j<16;j++)
{
LCD_Write_Dat(0x00);
}
}

for(i=0;i<32;i++)
{
LCD_Write_Cmd(0x80+i);
LCD_Write_Cmd(0x88);
for(j=0;j<16;j++)
{
LCD_Write_Dat(0x00);
}
}
}

/****************************************************************
*函数功能:图型模式下图形显示
*入口参数:横坐标x,纵坐标y,图形高度high(像素),宽度line(字节),图形地址
*出口参数:无
//图形显示 字模221 横向取膜
****************************************************************/
void Disp_img_up(uint8 x,uint8 y,uint8 high,uint8 line,uint8 *img)
{
uint8 i,j;
uint16 k =0;
for(i=0;i {
if((y+i)<32)
{
LCD_Write_Cmd(0x80+y+i); // Y Y地址不能自动加
LCD_Write_Cmd(0x80+x); // X X 地址自动加
}
else
{
LCD_Write_Cmd(0x80+((y+i)%32));
LCD_Write_Cmd(0x88+x);
}
for(j=0;j {
LCD_Write_Dat(img[k++]);
}
}
}

void Disp_img_down(uint8 x,uint8 y,uint8 high,uint8 line,uint8 *img)
{
uint8 i,j;
uint16 k =0;
for(i=0;i {
LCD_Write_Cmd(0x80+y+i);
LCD_Write_Cmd(0x88+x);
for(j=0;j {
LCD_Write_Dat(img[k++]);
}
}
}

/*========================test.c========================*/

#include
#include "link.h"
#include "LCD12864.h"
#include "picture.h"

void main()
{
LCD_Initial();
delay1ms(3);
LCD_Write_Cmd(0x36); //开启图形模式
LCD_Img_Cls();//清除屏幕上的乱码点
Disp_img_up(0,0,64,16,che);
Disp16_hz_up(7,1, name[0]);
Disp16_hz_down(7,0, name[1]);
LCD_Write_Cmd(0x30);
Disp_hzk(3,0,"CAN 总线技术");
while(1);
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念