Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1593080
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类: 嵌入式

2010-04-22 10:13:06

/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 接好LCD12864,用在LCD12864上显示,这里建议再外接上电源。
“CEPARK-M16开发板
12864液晶测试
程序设计: 曹佃生!!

* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:
**********************************************************************/
//头文件包含
#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[]=" ";


//函数声明
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口置为输出口,准备向端口发送数据

}


视频地址:

阅读(1293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~