您的位置:首页 > 编程语言

lcd驱动编写代码

2011-04-24 10:04 363 查看
//lcd.h
//By 小E  VER 0.1 QQ592646022
#define u16 unsigned int
#define u8 unsigned char
//LCD ADDR
#define WRITECMD 0
#define READCMD  2 
#define WRITEDATA 1 
#define READDATA   3
//LCD REG
#define LCDCLS 1
#define LCDHOME 2
#define LCDVISIBLE 8
#define LCDRESET 0x38
#define LCDSETMODE 4
#define LCDSHIFT 16
#define LCDFUCTION 32
#define	LCDSETCGADDR 0x40
#define LCDSETDDADDR 0x80
#define LCDCURSORADD 0xe
#define LCDCURSORDEC 0xa 
#define LCDNOCURSORADD 4
#define LCDNOCURSORDEC 0 	
void lcd_write_cmd(u8 cmd);	  //写命令		
void lcd_write_data(u8 dat);  //写数据
void lcd_wait_busy();		  //等待不忙
void delay(u16 time);		  //延时
void lcd_set_xy(u8 x,u8 y);	  //设置坐标
void lcd_write_string(u8 * pch);	//输出字符串
void lcd_write_charxy(u8 ch,u8 x,u8 y);		//在坐标(x,y)输出字符 x=列 y=行
void lcd_write_char(u8 ch);		//输出字符
void lcd_reset_cursor();		//光标复位
void lcd_cls();					//清屏
bit lcd_is_busy();				//测试是否为忙 返回1忙,0不忙
void lcd_write_cgram(u8 * pcgram); //写cgram数据

//lcd.c
#include "lcd.h"
#include <reg51.h>
#include <absacc.h>
void delay(u16 time){
	u16 i;
	for(i=0;i<time;i++){
		 
	}
}
void lcd_set_xy(u8 x,u8 y){
	if(y==0){ 
		x|=0x80;
	}else{
		x|=0xc0;
	}
	lcd_write_cmd(x);
}
void lcd_write_string(u8 * pch){
	while(*pch){
	 	PBYTE[WRITEDATA]=*pch;
		lcd_wait_busy();
		pch++;	
	}
}
void lcd_write_charxy(u8 ch,u8 x,u8 y){
	lcd_set_xy(x,y);
	lcd_wait_busy();
	lcd_write_data(ch);
}
void lcd_write_char(u8 ch){
	lcd_write_data(ch);
}
void lcd_write_cmd(u8 cmd){
 	 PBYTE[WRITECMD]=cmd;
}
void lcd_write_data(u8 dat){
 	PBYTE[WRITEDATA]=dat;
}
void lcd_reset_cursor(){
 	PBYTE[WRITECMD]=0x02;
}
void lcd_cls(){
	PBYTE[WRITECMD]=LCDCLS;
}
bit lcd_is_busy(){
	u8 t;
	t=PBYTE[READCMD];
 	return t&0x80;
}
void lcd_wait_busy(){
 	while(lcd_is_busy()){
	}
}
void lcd_write_cgram(u8 * pcgram){
 	u8 i,j,number=0,addrcgram=LCDSETCGADDR;
	for(i=0;i<8;i++){
	 	for(j=0;j<8;j++){
		 	lcd_write_cmd(addrcgram+j);
			lcd_wait_busy();
			lcd_write_data(pcgram[number++]);
		}
		addrcgram+=8;
	}
}
void main(){
	u8 i,j;	
	u8 table[]="Hello,World.";
	u8 table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
                           0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                           0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
                           0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
                           0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
                           0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
                           0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
                           0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案

	lcd_write_cmd(LCDRESET);
	lcd_wait_busy();
	lcd_write_cmd(LCDVISIBLE|LCDNOCURSORADD);
	lcd_wait_busy();
	lcd_cls();
	lcd_wait_busy();
	lcd_write_cgram(table1);
	lcd_wait_busy();
 	while(1){
		lcd_set_xy(0,0);
	    lcd_wait_busy();
	 	lcd_write_data(0xff);
		delay(5000);
		lcd_wait_busy();
		lcd_write_string(table);
		delay(5000);
 		lcd_wait_busy();
		for(i=0;i<4;i++){
			lcd_wait_busy();
			lcd_set_xy(15+i,0);
			lcd_wait_busy();
		 	lcd_write_char(i);
		}
		for(i=4;i<8;i++){
			lcd_wait_busy();
			lcd_set_xy(15+i-4,1);
			lcd_wait_busy();
		 	lcd_write_char(i);
		}
		delay(5000);
	}
}
//电路连接图
 
//实验结果




//实验结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: