给你我的1602液晶程序:
1602_8.c
#include "1602_8.h"
#include "myfun.h"
/*******************************************************
+------------------------------------+
|振南电子 驱动程序模块 1602液晶部分 |
+------------------------------------+
此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
严禁随意用于商业目的,违者必究,后果自负
振南电子
->产品网站 http://www.znmcu.cn/
->产品论坛 http://bbs.znmcu.cn/
->产品网店 http://shop.znmcu.cn/
->产品咨询 QQ:987582714
MSN:yzn07@126.com
WW:yzn07
********************************************************/
void LCD1602_Check_Busy() //检测1602是否正忙
{
unsigned char temp;
RS=0; //命令
RW=1; //读取
DAT_PORT=0xff; //作输入前先赋值为全1
do
{
E=1; //使能
delay(1); //延时一段时间,1602输出数据
temp=DAT_PORT; //将数据端口上的值赋给temp
E=0; //关闭使能
}while(temp&0x80); //第七个位如果是1说明1602正忙
}
void LCD1602_Write_Cmd(unsigned char com) //向1602写入命令
{
LCD1602_Check_Busy();//检测1602是否正忙
RS=0;//命令
RW=0;//写
DAT_PORT=com;//将命令码输出在数据端口上
E=1; //使能
delay(1);//延时一段时间,命令被写入1602中
E=0; //关闭使能
}
void LCD1602_Write_Dat(unsigned char dat) //向1602写入一个字节的数据
{
LCD1602_Check_Busy();//检测1602是否正忙
RS=1;//数据
RW=0;//写
DAT_PORT=dat;//将数据输出在数据端口上
E=1;//使能
delay(1);//延时一段时间,数据被写入到1602中
E=0;//关闭使能
}
unsigned char LCD1602_Read_Dat() //从1602液晶读取一个字节
{
unsigned char temp;
LCD1602_Check_Busy();//检测1602是否正忙
RS=1;
RW=1;
DAT_PORT=0xff;
E=1;
delay(1);
temp=DAT_PORT;
E=0;
return temp;
}
void LCD1602_Set_Mode(unsigned char dl,unsigned char n,unsigned char f)
{
//命令:001 DL N F XX
//描述:DL:1为8位数据接口 0为4位数据接口
// N :1为两行显示 0为一行显示
// F :1为5X10点阵 0为5X7点阵
unsigned char mode=0x20;
if(dl) mode|=0x10;
if(n) mode|=0x08;
if(f) mode|=0x04;
LCD1602_Write_Cmd(mode);//4位数据接口,两行显示,5X7
}
void LCD1602_Clr() //1602清屏
{
//命令:0000 0001
//描述:无
//功能:清屏 清除DDRAM和AC的值
LCD1602_Write_Cmd(0x01);
}
void LCD1602_Home() //1602光标回到起始位置
{
//命令:0000 001X
//描述:X为无关位
//功能:光标、画面回home位
LCD1602_Write_Cmd(0x02);
}
void LCD1602_Move_Mode(unsigned char id,unsigned char s)
{
//命令:0000 01 I/D S
//描述:I/D:1为数据读写后AC自增1;0为数据读写后AC自减1
// S: 1为数据读写后光标、画面平移;0为数据读写后光标、画面不动
//功能:输入方式设置
unsigned char mode=0x04;
if(id) mode|=0x02;
if(s) mode|=0x01;
LCD1602_Write_Cmd(mode);
}
void LCD1602_Set_Display(unsigned char d,unsigned char c,unsigned char b)
{
//命令:0000 1DCB
//描述:D:显示开关:1为开 0为关
// C:光标开关:1为开 0为关
// B:光标闪烁开关:1为开 0为关
//功能:显示开关控制
unsigned char mode=0x08;
if(d) mode|=0x04;
if(c) mode|=0x02;
if(b) mode|=0x01;
LCD1602_Write_Cmd(mode);
}
void LCD1602_Shift(unsigned char sc,unsigned char rl)
{
//命令:0001 S/C R/L XX
//描述:S/C: 为1画面平移一个字符位 为0光标平移一个字符位
// R/L:为1向右移 为0向左移
// X:无关位
//功能:光标画面位移
unsigned char mode=0x10;
if(sc) mode|=0x08;
if(rl) mode|=0x04;
LCD1602_Write_Cmd(mode);
}
void LCD1602_Set_DDRAM_Addr(unsigned char x,unsigned char y)
{
//命令:1 A6 A5 A4 A3 A2 A1 A0
//描述:A6~A0:DDRAM的地址
// N=1时,单行显示 地址是 A6~A0:00~4F
// N=0时,双行显示 首行地址是 A6~A0: 00~2F
// 第二行地址是A6~A0:40~67
//功能:DDRAM地址设置
if(y==0)
{
LCD1602_Write_Cmd(0x80+x);
}
else
{
LCD1602_Write_Cmd(0xc0+x);
}
}
void LCD1602_Set_CGRAM_Addr(unsigned char x) //设置CGRAM地址
{
//命令:01 A5 A4 A3 A2 A1 A0
//描述:A5~A0:CGRAM的地址 00~3F
//功能:CGRAM地址设置
LCD1602_Write_Cmd(0x40+x);
}
void LCD1602_Init() //1602初始化
{
LCD1602_Set_Mode(1,1,0);
LCD1602_Move_Mode(1,0);
LCD1602_Set_Display(1,1,1);
LCD1602_Clr();
LCD1602_Home();
}
void LCD1602_Put_Str(unsigned char x,unsigned char y,char *str) //在指定位置显示字符串
{
unsigned char i=0;
LCD1602_Set_DDRAM_Addr(x,y);
while(str[i])
{
LCD1602_Write_Dat(str[i]);
i++;
}
}
void LCD1602_Put_Long(unsigned char x,unsigned char y,unsigned long n) //在指定位置显示整形值
{
unsigned char temp[20];
u32tostr(n,temp);
LCD1602_Put_Str(x,y,temp);
}
1602_8.h
#ifndef _1602_8_H_
#define _1602_8_H_
/*******************************************************
+------------------------------------+
|振南电子 驱动程序模块 1602液晶部分 |
+------------------------------------+
此源码版权属 振南 全权享有,如欲引用,敬请署名并告知
严禁随意用于商业目的,违者必究,后果自负
振南电子
->产品网站 http://www.znmcu.cn/
->产品论坛 http://bbs.znmcu.cn/
->产品网店 http://shop.znmcu.cn/
->产品咨询 QQ:987582714
MSN:yzn07@126.com
WW:yzn07
********************************************************/
#include <reg51.h>
#define COM_PORT P3 //控制端口
#define DAT_PORT P0 //数据端口
sbit RS=COM_PORT^5; //RS=1 数据 RS=0 命令
sbit RW=COM_PORT^6; //RW=1 读取 RW=0 写入
sbit E =COM_PORT^7; //E 使能信号
void LCD1602_Check_Busy();
void LCD1602_Write_Cmd(unsigned char com);
void LCD1602_Write_Dat(unsigned char dat);
unsigned char LCD1602_Read_Dat();
void LCD1602_Set_Mode(unsigned char dl,unsigned char n,unsigned char f);
void LCD1602_Clr();
void LCD1602_Home();
void LCD1602_Move_Mode(unsigned char id,unsigned char s);
void LCD1602_Set_Display(unsigned char d,unsigned char c,unsigned char b);
void LCD1602_Shift(unsigned char sc,unsigned char rl);
void LCD1602_Set_DDRAM_Addr(unsigned char x,unsigned char y);
void LCD1602_Set_CGRAM_Addr(unsigned char x);
void LCD1602_Init();
void LCD1602_Put_Str(unsigned char x,unsigned char y,char *str);
void LCD1602_Put_Long(unsigned char x,unsigned char y,unsigned long n);
#endif
main.c
#include "1602_8.h"
void main()
{
LCD1602_Init();
LCD1602_Put_Str(0,0,"WWW.ZNMCU.CN"); //在第一行起始位置显示 WWW.ZNMCU.CN
while(1);
}
myfun.c 与 myfun.h 是公用函数模块,如下:
myfun.rar
(1.51 KB)
|