微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR M16实验之九 LCD12864

AVR M16实验之九 LCD12864

时间:11-25 来源:互联网 点击:
/**********************************************************************
* 文件名称: 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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top