⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 avr单片机 128*64液晶显示器
💻 C
字号:
//******************************************************************************
//                                                                             *
//    FileName   : 实验板12864lcd.c           ICCAVR V6.31A编译                *
//    Function   : 1602字符型LCD的显示 (8位数据方式)                           *
//    Date       : 2006-12-14                                                  *
//    Version    : 1.0                                                         *
//                                                                             *
//    Author     : 开关电源              hongtusy@163.com                      *
//    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
//                                                                             *
//***************************描述与记事*****************************************
//实验板的AVR程序,驱动12864LCM(可显示4行,每行8个汉字)模块显示实验练习。
//说明:RS高显示/低指令输入    RW高读/低写    EN高读数据/下降沿写数据
//记事:本程序旨在对LCD驱动的理解与演示,程序适合初学者使用。
//具体电路可参照使用指南里的说明。共4×8个汉字。
//使用器件:ATMEGA8535,可更换。          使用默认的片内RC振荡器,1MHz。
//接线定义:PD4,5,6,7为RS,R/W,EA,RST(可不用)。数据位为PC口。
//使用的开关:SW2-1,2,3,4.SW1-1,2,3,4,5,6,7,8.SW2-5为背光开关。 SW3-8为系统复位端。
//PSB脚为串并行模式选择。SW2-7为高并行模式,SW2-8为低串行模式。
//记事:
//******************************************************************************
#include <string.h>             //字符串操作函数库
#include <iom8535v.h>           //头文件,ATmega8535单片机的寄存器定义
#include "macros.h"             //可以使用NOP()以及SEI()等指令.

typedef unsigned char  uchar;    //宏
typedef unsigned int   uint;

/************************************************
函 数 名:    DelaymS()
功    能:    毫秒级延时函数
输入参数:     延迟时间/系统晶体
输出参数:    做相应的延迟处理
描    述:    /
***********************************************/
void DelaymS (uint i)            //延时函数,参数i为延时时间
{
    uint j,k;                        //双重延时
	for (j=0;j<i;j++)
	{
	    for (k=0;k<=50;k++);
	}
}
/************************************************
函 数 名:    init_mcu()
功    能:    单片机初始化函数
输入参数:     /
输出参数:    /
描    述:    相关口方向的设置等
***********************************************/
void init_mcu(void)
{
 	DDRC = 0xff;                      //PC口为推挽1输出,数据位
	DDRD = 0xff;                      //PD口为推挽1输出,控制信号
}
/********************************************************
  子程序名:   write_data()
  功    能:   写入一字节数据
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void write_data(uchar h)
{
 	 PORTC = h;                  //先将数据送出
	 PORTD |= (1<<PD4);   //RS=1,数据
	 PORTD &= ~(1<<PD5);  //R/W=0,写
	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	 DelaymS (1);
	 PORTD |= (1<<PD6);   //EN=1 ,除能
}
/********************************************************
  子程序名:   write_code()
  功    能:   写入一字节指令/地址
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void write_code(uchar h)
{
 	 PORTC = h;                  //先将地址送出
	 PORTD &= ~(1<<PD4);  //RS=0,命令或数据
	 PORTD &= ~(1<<PD5);  //R/W=0,写
	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	 DelaymS (1);
	 PORTD |= (1<<PD6);   //EN=1 ,除能
}
/********************************************************
  子程序名:   init_lcd()
  功    能:   初始化LCD
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void init_lcd(void)
{
 	 PORTD &= ~(1<<PD7);  //RS=0,低电平复位,然后变高后可以正常工作。也可以直接接高电平或NC不用。
	 DelaymS (1);
	 PORTD |= (1<<PD7);   //RS=1,开始工作
	 
	 write_code(0x01);           //清除屏幕
	 write_code(0b00000011);     //光标回到原点
	 write_code(0b00000111);     //设定,光标右移,位址加一
	 write_code(0b00001111);     //显示状态开关,整体显示,光标显示,光标位置反白
	 write_code(0b00010111);     //光标向右移动
	 write_code(0b00111011);     //功能设定,8位数据口,基本指令集 
	 //write_code(0b01000000);     //设定CGRAM位址(列)
	 //write_code(0b10000000);     //设定DDRAM位址(行)
}
/********************************************************
  子程序名:   display_lcd()
  功    能:   刷新显示一屏数据,独立的LCD显示程序,用户将显存buf内容更新后,只要调用此程序即可更新显示。
  输入参数:   显存buf
  输出参数:   /
  描    述:   在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
  此12864LCD使用的是ST7920为驱动芯片。可以显示ASCII码的前128个值,此时为半字宽,数据为8位,
  即输入的8位数据的最高位为0,范围为0x00~0x7f,比如0x00为空格,0x61为小写字母a,0x7e为~。
  若最高位为1,则可以显示汉字,且此时为一个字宽,两个字节代表一个汉字。起始数据为0x8000,代表一个字的空格,
  0x8001代表汉字“啊”,0xffff代表汉字“翰”。
  也可以使用自定义字库或显示图片等。
********************************************************/
void display_lcd(uchar *p)
{
	 uchar i;
	 write_code(0x80);     //第一行起始地址,0b10000000B=0x80.即DDRAM位址

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -