×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-20 发布时间:
|
型号: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);
}

关键字:C51代码  LCD12864  头文件  上下屏

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

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法