/**********************************************************************
* 文件名称: 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口置为输出口,准备向端口发送数据
}
视频地址:
阅读(1301) | 评论(0) | 转发(0) |