看看我的吧,这个是可以用的.
/* Disp1602.h ,其它程序包含这个头文件就可以调用putchar了*/
#ifndef __DISP1602_H__ #define __DISP1602_H__
typedef unsigned char BYTE; typedef unsigned int WORD; typedef bit BOOL;
extern void clr(void); extern void lcd_init(); extern BOOL putchar(BYTE ch);
#endif // __DISP1602_H__
/* Disp1602.C */ #include <AtmelAT89X52.h> #include <intrins.h> #include "Gpr.h" //这个头文件定义Delay函数 #include "Disp1602.h"
sbit rs = P2^0; //引脚定义 sbit rw = P2^1; sbit ep = P2^2; sbit light = P3^3;
static idata BYTE pos = 0, chcnt = 0;
BOOL lcd_bz() { // 测试LCD忙碌状态 static BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (BOOL)(P0 & 0x80); ep = 0; return result; }
lcd_wcmd(BYTE cmd) { // 写入指令数据到LCD while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
lcd_pos(BYTE pos) { //设定显示位置 lcd_wcmd(pos | 0x80); //80 + DDRAM地址 }
lcd_wdat(BYTE dat) { //写入字符显示数据到LCD while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }
void lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); //显示模式设置 delay(1); lcd_wcmd(0x0c); //开显示,不显示光标 delay(1); lcd_wcmd(0x06); //读写后光标及指针加1 delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1);
light = 0; }
void clr(void) { P1 = 0xFF; lcd_wcmd(0x01); //清除LCD的显示内容 pos = 0; chcnt = 0; }
BOOL putchar(BYTE ch) { if (lcd_bz()) { delay(5); }
if (lcd_bz()) { return 0; }
lcd_wdat(ch);
if (++chcnt >= 16) { chcnt = 0; if (pos == 0) pos = 0x40; else pos = 0x00; lcd_pos(pos); } return 1; }
|
|