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

📄 lcd1602.c

📁 avr单片机 液晶显示16*16控制显示 c语言源程序
💻 C
字号:
//******************************************************************************
//                                                                             *
//    FileName   : 实验板1602lcd.c           ICCAVR V6.31A编译                 *
//    Function   : 1602字符型LCD的显示 (8位数据方式)                           *
//    Date       : 2006-12-11                                                  *
//    Version    : 1.0                                                         *
//                                                                             *
//    Author     : 开关电源              hongtusy@163.com                      *
//    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
//                                                                             *
//***************************描述与记事*****************************************
//实验板的AVR程序,驱动1602LCM(可显示2行,每行16个字符)模块显示实验练习。
//说明:RS高显示/低指令输入    RW高读/低写    EN高读数据/下降沿写数据
//具体电路可参照使用指南里的说明。每个字符为5×7或5×8的点阵,共16×2个字符。
//使用器件:ATMEGA8535,可更换。          使用默认的片内RC振荡器,1MHz。
//接线定义:PD4,5,6 为RS,R/W,EA。数据位为PC口。
//使用的开关:SW2-1,2,3.SW1-1,2,3,4,5,6,7,8.SW2-5为背光开关。  SW3-8为系统复位端。
//记事:
//******************************************************************************
#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)
{
 	 write_code(0x01);     //清除屏幕
	 write_code(0x38);     //功能设定,8位数据口/2行/5*7的点阵
	 write_code(0b00001111);     //显示幕ON,光标ON,闪烁ON
	 write_code(0x06);     //模式,加1,显示幕ON。
	 write_code(0b00000011);     //光标回到原点
}
/********************************************************
  子程序名:   display_lcd()
  功    能:   刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
  输入参数:   /
  输出参数:   /
  描    述:   在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
********************************************************/
void display_lcd(uchar *p)
{
	 uchar i;
	 write_code(0x80);     //第一行起始地址,0b10000000B=0x80.
	 for(i=0;i<16;i++)
	 {
	     write_data(p[i]);
	 }
	 write_code(0xc0);     //第二行起始地址,0b11000000B=0xc0.
	 for(i=16;i<32;i++)
	 {
	     write_data(p[i]);
	 }
}
//*****************主程序**********************************
void main (void)
{
	 uchar i;	 
	 uchar buf[]="    welcome!      www.itsn.cn!   ";
	 DelaymS(100);	 
	 init_mcu();        //单片机初始化
     init_lcd();        //lcd初始化
	 display_lcd(buf);  //刷新显示一屏
	 
	 buf[0] = 'i';      //可以任意修改显示的内容
	 display_lcd(buf);  //刷新显示
	 write_code (0xC0);  //光标停留在0C2H位置。第1行光标位置有0x80,0x81...0x8f,第2行光标位置有0xc0,0xc1...0xcf.
	 while(1);
}

⌨️ 快捷键说明

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