/*LCD命令函数声明
#define uchar unsigned char
#define uint unsigned int
void lcd_write_cmd(uchar com);
void lcd_write_data(uchar date);
void lcd_write_string(uchar *str);
void lcd_pos(uchar x,uchar y); //从第X行的第Y位置开始显示,xy都从1开始
void lcd_clear();
void mouse_left();
void mouse_right();
void mouse_on();
void mouse_off();
void lcd_init();
*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uchar unsigned char
#define uint unsigned int
//8bit数据接入IO口
#define Part PORTB //PB接8位数据线
//控制数据端
#define LCD_RS PORTA_PA0 //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
#define LCD_RW PORTA_PA1 //定义12864液晶RW端,读/写信号 H:读 L:写
#define LCD_EN PORTA_PA2 //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据
void delay(uint xms) //总线时钟24M
{
uint i,j;
for(j=0;j<xms;j++)
for(i=0;i<500;i++);
}
//====================================
//LCD忙检测函数
char lcd_busy()
{
char result;
DDRB=0X00; //读数据
LCD_RS=0;
LCD_RW=1;
LCD_EN= 1;
result=Part & 0x80;
LCD_EN=0;
DDRB=0XFF; //写数据
return result;
}
//=====================================
//液晶写命令函数
void lcd_write_cmd(uchar com)
{
delay(5);
while(lcd_busy());
LCD_RS=0; //选择指令寄存器
LCD_RW=0; //写
LCD_EN=0;
Part=com; //指令值赋给P0口
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//=====================================
//液晶写一个字符数据函数
void lcd_write_data(uchar date)
{
delay(5);
while(lcd_busy());
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //写
LCD_EN=0;
Part=date; //数据值赋给P0口
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//=====================================
//液晶写一个字符串函数
void lcd_write_string(char *str)
{
while(*str!='\0') //未结束
lcd_write_data(*str++);
}
//=====================================
//液晶显示位置函数
void lcd_pos(char x,char y) //从第X行的第Y位置开始显示
{
char pos;
if(x==1) //第一行
x=0x80;
if(x==2) //第二行
x=0x90;
if(x==3) //第三行
x=0x88;
if(x==4) //第四行
x=0x98;
pos=x+y-1; //首地址为0X80
lcd_write_cmd(pos);
}
void lcd_clear() //清屏
{
lcd_write_cmd(0x01);
lcd_pos(1,5);
lcd_write_data(' ');
}
void mouse_left() //光标左移
{
lcd_write_cmd(0x10);
}
void mouse_right() //光标右移
{
lcd_write_cmd(0x14);
}
void mouse_on() //光标闪烁
{
lcd_write_cmd(0x0f);
}
void mouse_off() //光标不闪烁
{
lcd_write_cmd(0x0c);
}
//=====================================
//液晶初始化函数
void lcd_init()
{
DDRA=0XFF; //写数据
DDRB=0XFF;
lcd_write_cmd(0x30); //基本指令集,绘图显示关
delay(5);
mouse_off(); //开显示,不显示光标
delay(5);
lcd_clear(); //清屏
delay(5);
lcd_write_cmd(0x06); //写一个字符后地址指针自动加1
delay(5);
}