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

AVR M16实验之九 LCD12864

发布时间:2020-09-03 发布时间:
|
/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 接好LCD12864,用在LCD12864上显示,这里建议再外接上电源。
“CEPARK-M16开发板
12864液晶测试 
程序设计: 曹佃生!!
www.cepark.com ”
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
//头文件包含
#include //io端口寄存器配置文件,必须包含
#include //GCC中的延时函数头文件

//端口位定义
#define RS PA4 //数据/命令控制端 0命令,1数据
#define RW PA5 //读/写选择控制端 0写,1读
#define E PA6 //使能端 下降沿读,高电平写
#define PSB PA3 //数据传输方式选择端,H,8位或4位并口方式;L,串口方式 

//全局变量声明
unsigned char ucString1[]="CEPARK-M16开发板";
unsigned char ucString2[]=" 12864液晶测试 ";
unsigned char ucString3[]="程序设计: 曹佃生";
unsigned char ucString4[]=" www.cepark.com ";


//函数声明
void LCD12864PortInit(void); //端口初始化
void LCD12864Init(void); //LCD初始化
void LCD12864WriteCommand(unsigned char ucCommand); //LCD写指令
void LCD12864WriteData(unsigned char ucData); //LCD写数据
void LCD12864BusyCheck(void); //读写检测函数,每次对液晶操作前都要进行读写检测

int main(void) 
{
unsigned char i;

LCD12864PortInit(); //端口初始化
LCD12864Init(); //LCD初始化

LCD12864WriteCommand(0x80+0x00);
for(i = 0;i < 16;i++)
{
LCD12864WriteData(ucString1[i]);
}
LCD12864WriteCommand(0x90+0x00);
for(i = 0;i < 16;i++)
{
LCD12864WriteData(ucString2[i]);
}
LCD12864WriteCommand(0x88+0x00);
for(i = 0;i < 16;i++)
{
LCD12864WriteData(ucString3[i]);
}
LCD12864WriteCommand(0x98+0x00);
for(i = 0;i < 16;i++)
{
LCD12864WriteData(ucString4[i]);
}

while(1)
{

}
}

void LCD12864PortInit()

//LCD数据端口设置
PORTB = 0x00; //
DDRB = 0xFF; //配置端口PA全部为输出口

PORTA = 0x00;
DDRA |= (1 << RS) | (1 << RW) | (1 << E);
_delay_ms(15);
}

void LCD12864Init()
{
LCD12864WriteCommand(0x01); //清屏
_delay_ms(15);
LCD12864WriteCommand(0x38); //显示模式 
_delay_ms(5);
//LCD12864WriteCommand(0x0f); //显示开关控制,开显示,光标显示,光标闪烁
LCD12864WriteCommand(0x0c); //显示开关控制,开显示,光标不显示,光标不闪烁
_delay_ms(5);
LCD12864WriteCommand(0x06); //光标设置,读或写一个字符后,地址指针加一,光标加一,整屏不移动
_delay_ms(5);
}

void LCD12864WriteCommand(unsigned char ucCommand)
{
LCD12864BusyCheck();

PORTA &= ~(1 << RS); //RS=0,写命令
PORTA &= ~(1 << RW); //RW=0,写指令
PORTA |= (1 << E); //E=1,写操作
_delay_ms(2);
PORTB = ucCommand; //指令送数据端口
PORTA &= ~(1 << E); //E=0,停止写操作
// _delay_ms(5);

}

void LCD12864WriteData(unsigned char ucData)
{
LCD12864BusyCheck();

PORTA |= (1 << RS); //RS=1,写数据
PORTA &= ~(1 << RW); //RW=0,写指令
PORTA |= (1 << E); //E=1,写操作
_delay_ms(2); 
PORTB = ucData; // 数据送数据端口 
PORTA &= ~(1 << E); //E=0,停止写操作
// _delay_ms(5);

}

void LCD12864BusyCheck(void)
{
unsigned int uiTemp;
uiTemp = 3000;

DDRB = 0x00; //PB口置为输入口,准备读取数据
PORTA &= ~(1 << RS); //RS=0,读命令
PORTA |= (1 << RW); //RW=1,读指令
PORTA |= (1 << E); //E=1,使能

while((0x80 & PINB) && (uiTemp--)); //监测忙信号,直到忙信号为0,才能进行读写操作

PORTA &= ~(1 << E); //E=0
DDRB = 0xFF; //PA口置为输出口,准备向端口发送数据

}


视频地址:http://v.youku.com/v_show/id_XMTYxNDk3NzUy.html

关键字:AVR  M16实验  LCD12864

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

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