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

自制51单片机常用头文件(st7920串行方式)

发布时间:2020-06-20 发布时间:
|
/*--------------------------------------------------------------------------

ST7920.H

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
// 串行方式
#ifndef __ST7920_H__
#define __ST7920_H__

#define uint unsigned int
#define uchar unsigned char

//引脚定义
#define LCD_CS    P3_2 // 片选 高电平有效 单片LCD使用时可固定高电平
#define LCD_SID   P3_3 // 数据
#define LCD_CLK   P3_4 // 时钟
#define LCD_PSB   P3_5 // 低电平时表示用串口驱动,可固定低电平
#define LCD_RST   P3_6 // LCD复位,LCD模块自带复位电路。可不接
//#define LCD_BACK P2_6   // LCD背光控制

/***************************************************** 
 函 数 名:void Delay_LCD(uint Number)
 功    能:LCD延时
 说    明:在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间
 入口参数:Number
 返 回 值:无 
 *****************************************************/
void Delay_LCD(uint Number) 
{
  uint i,j;

  for (i=0; i   {
      for(j=0; j<10; j++)
        {
   ;
  }
 }
}

/***************************************************** 
 函 数 名:void Send_byte(uchar Byte) 
 功    能:发送一个字节
 入口参数:Byte
 返 回 值:无 
 *****************************************************/
void Send_byte(uchar Byte) 
{
 uchar i;

  for (i=0; i<8; i++)
    {
     LCD_SID = Byte&0x80;                // 取出最高位 写入串行数据
     LCD_CLK = 1;                      // 串行同步时钟信号
     LCD_CLK = 0;
    Byte <<= 1;                        // 左移
   }  
}
/***************************************************** 
 函 数 名:void WriteCommandLCM()
 功    能:向LCM中写入指令
 入口参数:WCLCM
 返 回 值:无  
 ****************************************************/
void WriteCommandLCM(uchar WCLCM)
{
   uchar Start_data,Hdata,Ldata;

 Start_data = 0xf8;                 // 写指令 11111000
  
   Hdata = WCLCM&0xf0;                     // 取高四位   DDDD0000
   Ldata = (WCLCM << 4) & 0xf0;            // 取低四位   0000DDDD

   Send_byte(Start_data);                 // 发送起始信号 第1字节-格式:1111ABC
   Delay_LCD(5);                         // 延时是必须的

   Send_byte(Hdata);                    // 发送高四位   第2字节-格式:DDDD0000
   Delay_LCD(1);                           // 延时是必须的

   Send_byte(Ldata);                   // 发送低四位   第3字节-格式:0000DDDD
   Delay_LCD(1);                           // 延时是必须的
}
/***************************************************** 
 函 数 名:void WriteDataLCM()
 功    能:向LCM1602中写入数据
 说    明:将形参WDLCM中的数据写入LCM中
 入口参数:WDLCM 
 返 回 值:无  
 *****************************************************/
void WriteDataLCM(uchar WDLCM)
{
   uchar Start_data,Hdata,Ldata;

 Start_data = 0xfa;                    // 写数据 11111010 

   Hdata = WDLCM & 0xf0;                   // 取高四位   DDDD0000
   Ldata = (WDLCM << 4) & 0xf0;            // 取低四位   0000DDDD

   Send_byte(Start_data);                 // 发送起始信号 第1字节-格式:1111ABC
   Delay_LCD(5);                           // 延时是必须的

   Send_byte(Hdata);                     // 发送高四位   第2字节-格式:DDDD0000
   Delay_LCD(1);                           // 延时是必须的

   Send_byte(Ldata);                     // 发送低四位   第3字节-格式:0000DDDD
   Delay_LCD(1);                           // 延时是必须的
}

/***************************************************** 
 函 数 名:void Lcdinit(void)
 功    能:LCD初始化
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Lcdinit(void)  
{
   Delay_LCD(10);                    // 启动等待,等LCM讲入工作状态
   LCD_PSB = 0;                       // 串口驱动模式
   LCD_RST = 0;

 Delay_LCD(1); 
 LCD_RST = 1;                        // 复位LCD
   LCD_CS = 1;                            // 片选

   WriteCommandLCM(0x30);                  // 8 位介面,基本指令集
   WriteCommandLCM(0x0c);                  // 显示打开,光标关,反白关
   WriteCommandLCM(0x01);                  // 清屏,将DDRAM的地址计数器归零  
}

/***************************************************** 
 函 数 名:void DisplayListChar()
 功    能:向指点的地址写入字符串
 入口参数:x-横坐标,y-纵坐标,s-字符串
 返 回 值:无  
 *****************************************************/
void DisplayListChar(uchar x, uchar y, uchar code *s)
{
 uchar add;                           // 显示地址

 switch (y)                           // 显示地址计数
 {
  case 0: add = x + 0x80; break;   // 第一行的地址
  case 1: add = x + 0x90; break;   // 第二行的地址  
  case 2: add = x + 0x88; break;   // 第三行的地址
  case 3: add = x + 0x98; break;   // 第四行的地址
  default: break; 
 }

 WriteCommandLCM(0x30);      // 8位介面,基本指令集
 WriteCommandLCM(add);                // 写入地址

    while (*s > 0)                    // 写入字符串
    {
     WriteDataLCM(*s);
        s++;
        Delay_LCD(50);
    }
}

/***************************************************** 
 函 数 名:void DisplayPicture(uint code *img)
 功    能:在LCD上显示图形
 说    明:在LCD上显示图形时,由于ST7920的特殊性应分两屏控制 
 入口参数:*img
 返 回 值:无 
 *****************************************************/
//图形方式
void DisplayPicture(uint code *img) 

    uchar Line,Row;        // Line为行地址;Row为列地址
    uint regist = 0;         // 图形地址寄存器

 WriteCommandLCM(0x36);      // 图形方式,扩展指令
    // -------------- 上半屏 ----------------
   for (Line=0; Line<32; Line++)     
    { 
       WriteCommandLCM(0x80 + Line);    // 写入行地址
       WriteCommandLCM(0x80);           // 写入列

       for (Row=0; Row<16; Row++)
  {
       WriteDataLCM(img[regist++]);  // 写入图片数据
  }
    }
    // --------------- 下半屏 ---------------
   regist=512;          // 下半屏起始数据

   for (Line=0; Line<32; Line++)  
    { 
       WriteCommandLCM(0x80 + Line);  // 写入行地址
    WriteCommandLCM(0x88);    // 写入列

       for (Row=0; Row<16; Row++)
  {
        WriteDataLCM(img[regist++]);  // 写入图片数据
  }
    }

 WriteCommandLCM(0x30);      // 基本指令
}

/***************************************************** 
 函 数 名:void main(void)
 功    能:主函数
 入口参数:无
 返 回 值:无 
 *****************************************************/
void main(void)
{

   Lcdinit();       // 初始化LCD

   while(1)
   {

  DisplayListChar(0,0,"zhaojun");
   }

}

#endif

关键字:51单片机  头文件  st7920  串行方式

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

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