[转帖]源程序大公开-16X2字符液晶8Bit接口程序(注释应该算详细了)

//呵呵,看到论坛有人要有注释的液晶程序,特意翻出以前的程序,注释应该算详细了
//--------------------------------------------------------------------------//
// 源程序大公开 //
// (c) Copyright 2001-2002 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//标 题: 16X2字符液晶8Bit接口程序(MCS51模拟IO方式) //
//版 本: V1.00 //
//文件名: xwj_lcd16.C //
//创建人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 02-11-5 //
//描 述: 16X2字符液晶8Bit接口程序(MCS51模拟IO方式) //
//声 明: //
// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
// 如用于商业用途请与作者联系. E-mail:xuwenjun@21cn.com //
// 有问题请mailto xuwenjun@21cn.com 欢迎与我交流! //
//--------------------------------------------------------------------------//
//修改人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 02-11-5 //
//描 述: //
//--------------------------------------------------------------------------//

//HD44780指令一览表:
//RS=0;R/W=0----写入指令:
// 16进制 D7 D6 D5 D4 D3 D2 D1 D0 运行时间(250KHZ)
//清屏 01 0 0 0 0 0 0 0 1 1.64MS
//归Home 02 0 0 0 0 0 0 1 0 1.64MS
//设置输入方式 04~07 0 0 0 0 0 1 I/D S 40US
// I/D=0:AC减1:AC加;S=0:禁止滚动1:允许滚动
//设置显示状态 08~0F 0 0 0 0 1 D C B 40US
// D=0:关显示1:开显示;C=0:光标消失1:光标显示;B=0:闪烁禁止1:闪烁启用
//光标或画面滚动10~1F 0 0 0 1 S/C R/L * * 40US (*为任意值)
// S/C=0:画面滚动1:光标滚动;R/L=0:向左滚动1:向右滚动
//设置工作方式 20~3F 0 0 1 DL N F * * 40US
// DL=0:4位总线1:8位总线;N=0:一行字符1:二行字符;
// F=0:5X7点阵字体1:5X10点阵字体
//设置CGRAM地址 40~7F 0 1 A5 A4 A3 A2 A1 A0 40US
//设置DDRAM地址 80~FF 1 A6 A5 A4 A3 A2 A1 A0 40US
//RS=0;R/W=1----读状态 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 0US (BF=0:空闲1:忙)
//RS=1;R/W=0----写数据
//RS=1;R/W=1----读数据
//--------------------------------------------------------------------------//

// P2口16X2字符液晶8Bit -- 存储器定义 //
unsigned char code lcd16_tab_hex[]={"0123456789ABCDEF"};
unsigned char code lcd16_tab_cg[]={
0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00, //"元"代码
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //"年"代码
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00, //"月"代码
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00, //"日"代码
0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00, //"四"代码
0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00, //"五"代码
0x08,0x04,0x1F,0x00,0x0A,0x11,0x00,0x00, //"六"代码
0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, //"/"代码

0x01,0x02,0x05,0x02,0x06,0x02,0x02,0x02, //自定义字符
0x04,0x0A,0x1F,0x04,0x1F,0x0E,0x15,0x0C, //自定义字符
0x01,0x0F,0x04,0x02,0x01,0x02,0x04,0x08, //自定义字符
0x00,0x1E,0x08,0x10,0x00,0x10,0x08,0x06, //自定义字符
0x0F,0x12,0x0F,0x04,0x0F,0x00,0x0F,0x00, //自定义字符
0x1F,0x12,0x1C,0x10,0x1E,0x10,0x1F,0x10, //自定义字符
};
//--------------------------------------------------------------------------//

// P2口16X2字符液晶8Bit -- IO定义 //
#ifndef P2
#include <reg51.h> //
#include <intrins.h> //使用了_nop_()
#endif

#define LCD16_VD P2 //LCD16_VD------------P2高4位//
sbit LCD16_RS = P1^2; //LCD16_RS------------P1.2 //
sbit LCD16_RW = P1^3; //LCD16_RW------------P1.3 //
sbit LCD16_E = P1^0; //LCD16_E-------------P1.0 //
//--------------------------------------------------------------------------//

// P2口16X2字符液晶8Bit -- 函数原型 //
void lcd16_ctrl(unsigned char c); //指令写入函数( 检测忙信号)//
void lcd16_ctrln(unsigned char c); //指令写入函数(不检测忙信号)//
void lcd16_wd(unsigned char d); //数据和指令参数写入函数 //
unsigned char lcd16_readc(void); //状态和地址读出函数 //
//unsigned char lcd16_readd(void); //数据读出函数 //
void lcd16_reset(void); //LCD复位 //
void lcd16_initcg(void); //初始化自定义字符 //
void lcd16_writecg(unsigned char x,unsigned char y,unsigned char n);//显示自定义字符 //
void lcd16_wdh(unsigned char d); //1位16进制数字写入函数 //
void lcd16_wdhh(unsigned char d); //2位16进制数字写入函数 //
void lcd16_pos(unsigned char xpos,unsigned char ypos); // 计算并写入地址,参数:列位置,第几行 //
void lcd16_write(unsigned char,unsigned char,unsigned char); // 带地址写一个字符,参数:列位置,行数,字符 //
void lcd16_writen(unsigned char,unsigned char,unsigned char); // 带地址写一个数字,参数:列位置,行数,数字 //
void lcd16_fill(unsigned char cf); // 整屏写 cf 中字符 //
void lcd16_display(unsigned char sx,unsigned char sy,unsigned char *sc); //带地址写一个字符串,参数:列位置,行数,字符串//
void lcd16_delay(unsigned int x); //延时 x 毫秒
//--------------------------------------------------------------------------//

// P2口16X2字符液晶8Bit -- 函数 //
//--------------------------------------------------------------------------//
void lcd16_ctrl(unsigned char c) //指令写入函数//
{
unsigned char i;
while ((lcd16_readc()) > 0x7f) {if (--i == 0) break;} //检测忙信号//
LCD16_RS = 0; //CS = 1 RS = 0 RW = 0代表写入指令//
LCD16_RW = 0;
LCD16_VD = c;LCD16_E = 1;LCD16_E = 0;
LCD16_VD = 0xff;
}

//--------------------------------------------------------------------------//
void lcd16_ctrln(unsigned char c) //指令写入函数,不检测忙信号//
{LCD16_RS = 0; //CS = 1 RS = 0 RW = 0代表写入指令//
LCD16_RW = 0;
LCD16_VD = c;LCD16_E = 1;LCD16_E = 0;
LCD16_VD = 0xff;
}

//--------------------------------------------------------------------------//
void lcd16_wd(unsigned char d) //数据和指令参数写入函数//
{
unsigned char i;
while ((lcd16_readc()) > 0x7f) {if (--i == 0) break;} //检测忙信号//
LCD16_RS = 1; //CS = 1 RS = 1 RW = 0代表写入数据或指令参数//
LCD16_RW = 0;
LCD16_VD = d;LCD16_E = 1;LCD16_E = 0;
LCD16_VD = 0xff;
}

//--------------------------------------------------------------------------//
unsigned char lcd16_readc(void) //状态和地址读出函数//
{unsigned char rc;

#ifdef DEBUG
rc=0; //防止出现rc未调用的警告
return(rc);
#endif
LCD16_RS = 0; //RS为1代表读数据,RS为0代表读状态标志和光标地址//
LCD16_RW = 1;
LCD16_VD = 0xff; //把P2置为高电平,只有置为高电平才能正确读入数据//
LCD16_E = 1;rc = LCD16_VD;LCD16_E = 0;
return(rc);
}

/*
//--------------------------------------------------------------------------//
unsigned char lcd16_readd(void) //数据读出函数//
{unsigned char rd;
LCD16_RS = 1; //RS为1代表读数据,RS为0代表读状态标志和光标地址//
LCD16_RW = 1;
LCD16_VD = 0xff; //把P2置为高电平,只有置为高电平才能正确读入数据//
LCD16_E = 1;rd = LCD16_VD;LCD16_E = 0;
return(rd);
}
*/

//--------------------------------------------------------------------------//
void lcd16_reset(void) // LCD复位 //
{
lcd16_delay(15);
lcd16_ctrln(0x38); //显示模式设置(不检测忙信号)//
lcd16_delay(5); //共三次,确保可靠复位 //
lcd16_ctrln(0x38);
lcd16_delay(5);
lcd16_ctrln(0x38);
lcd16_delay(5);
lcd16_ctrl(0x38); //显示模式设置(以后均检测忙信号)//
lcd16_ctrl(0x08); // 显示关闭 //
lcd16_ctrl(0x01); // 显示清屏 //
lcd16_ctrl(0x06); // 显示光标移动设置 //
lcd16_ctrl(0x0c); // 显示开及光标设置 //
// lcd16_initcg();
}

//--------------------------------------------------------------------------//
void lcd16_wdh(unsigned char d) //1位16进制数字写入函数//
{
lcd16_wd(lcd16_tab_hex[(d & 0x0f)]);
}

//--------------------------------------------------------------------------//
void lcd16_wdhh(unsigned char d) //2位16进制数字写入函数//
{
lcd16_wd(lcd16_tab_hex[(d >> 4)]);
lcd16_wd(lcd16_tab_hex[(d & 0x0f)]);
}

//--------------------------------------------------------------------------//
void lcd16_initcg(void) //初始化自定义字符 //
{
unsigned char i;
lcd16_ctrl(0x40);
for (i=0;i<64;i++)
{
lcd16_wd(lcd16_tab_cg);
}
}

//--------------------------------------------------------------------------//
void lcd16_writecg(unsigned char x,unsigned char y,unsigned char n) //显示自定义字符 //
{
unsigned char i;
lcd16_ctrl(0x40 + x * 8); //写CGRAM的0~7单元(第 1 个字符)
for (i=0;i<7;i++)
{
lcd16_wd(lcd16_tab_cg[n * 8 + i]);
}
lcd16_pos(x,y);
lcd16_wd(x);
}

//--------------------------------------------------------------------------//
void lcd16_pos(unsigned char xpos,unsigned char ypos)
{ // 计算并写入地址,参数:列位置,第几行 //
unsigned char lcd16_add;
xpos &= 0x0f;
ypos &= 0x01;
if
(ypos != 0) lcd16_add = ((xpos+0x40)|0x80);
else
lcd16_add = xpos|0x80;
lcd16_ctrl(lcd16_add);
}

//--------------------------------------------------------------------------//
void lcd16_write(unsigned char x,unsigned char y,unsigned char c)
{ // 带地址写一个字符,参数:列位置,行数,字符//
lcd16_pos(x,y);
lcd16_wd(c);
}

//--------------------------------------------------------------------------//
void lcd16_writen(unsigned char x,unsigned char y,unsigned char c)
{ // 带地址写一个字符,参数:列位置,行数,字符//
lcd16_pos(x,y);
if ((c & 0xf0) != 0) lcd16_wdh(c >> 4);
lcd16_wdh(c & 0x0f);
}

//--------------------------------------------------------------------------//
void lcd16_fill(unsigned char cf) // 整屏写 cf 中字符 //
{
unsigned char x = 0;
unsigned char y = 0;
for (y = 0;y < 2;y++)
{
lcd16_pos(0,y);
for (x = 0;x < 16;x++) lcd16_wd(cf);
}
}

//--------------------------------------------------------------------------//
void lcd16_display(unsigned char sx,unsigned char sy,unsigned char *sc)
{ //带地址写一个字符串,参数:列位置,行数,字符串//
lcd16_pos(sx,sy);
while((*sc != 0x00) && (sx < 16))
{
lcd16_wd(*sc++);
sx++;
}
}

//--------------------------------------------------------------------------//
void lcd16_delay(unsigned int x) //延时 x 毫秒
{
// 延时机器周期数: j=10时:6+50*x j=100时:6+410*x 即6+(10+4*j)*x
unsigned char j;
do {
for (j=0; j<230; j++) _nop_(); //j=(11159KHz/12-10)/4
}while(--x);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电赛Altium Designer原件大全,原理图+PCB封装 AD603, AD603_2, AD8009, AD831, AD8314, AD8361, AD8367, ADF4351, ADL5536, ADS1293, ADS1293_Module, ADXL345, AH101, AMS1117, AT24C1024, Battery, Beep, BNC, Cap, Cap_Pol, CC2541-MOD, CH340G, Diode, Diode_Z, GND, Header 10, Header 10H, Header 10X2, Header 10X2A, Header 10X2H, Header 11, Header 11H, Header 11X2, Header 11X2A, Header 11X2H, Header 12, Header 12H, Header 12X2, Header 12X2A, Header 12X2H, Header 13, Header 13H, Header 13X2, Header 13X2A, Header 13X2H, Header 14, Header 14H, Header 14X2, Header 14X2A, Header 14X2H, Header 15, Header 15H, Header 15X2, Header 15X2A, Header 15X2H, Header 16, Header 16H, Header 16X2, Header 16X2A, Header 16X2H, Header 17, Header 17H, Header 17X2, Header 17X2A, Header 17X2H, Header 18, Header 18H, Header 18X2, Header 18X2H, Header 19, Header 19H, Header 19X2, Header 19X2H, Header 2, Header 20, Header 20H, Header 20X2, Header 20X2H, Header 22, Header 22H, Header 22X2, Header 22X2H, Header 24, Header 24H, Header 24X2, Header 24X2H, Header 25, Header 25H, Header 25X2, Header 25X2H, Header 2H, Header 2X2, Header 2X2H, Header 3, Header 30, Header 30X2, Header 3H, Header 3X2, Header 3X2A, Header 3X2H, Header 4, Header 4H, Header 4X2, Header 4X2A, Header 4X2H, Header 5, Header 5H, Header 5X2, Header 5X2A, Header 5X2H, Header 6, Header 6H, Header 6X2, Header 6X2A, Header 6X2H, Header 7, Header 7H, Header 7X2, Header 7X2A, Header 7X2H, Header 8, Header 8H, Header 8X2, Header 8X2A, Header 8X2H, Header 9, Header 9H, Header 9X2, Header 9X2A, Header 9X2H, HeadphoneSocket, HMC470, HMC472A, INA333, Ind, JTAG, LED, LM317, LM358, MB506, MC34063, MHDR1X10, MHDR1X11, MHDR1X12, MHDR1X13, MHDR1X14, MHDR1X15, MHDR1X16, MHDR1X17, MHDR1X18, MHDR1X19, MHDR1X2, MHDR1X20, MHDR1X3, MHDR1X4, MHDR1X5, MHDR1X6, MHDR1X7, MHDR1X8, MHDR1X9, MHDR2X10, MHDR2X11, MHDR2X12, MHDR2X13, MHDR2X14, MHDR2X15, MHDR2X16, MHDR2X17, MHDR2X18, MHDR2X19, MHDR2X2, MHDR2X20, MHDR2X3, MHDR2X4, MHDR2X5, MHDR2X6, MHDR2X7, MHDR2X8, MHDR2X9, MIC5219-3.3, MPU6050, MPU6050_module, NE5532, NPN, NPN_SOT23, nrf58122, OPA2333, OPA695, OPA847, PE4302, PNP, PNP_SOT23, PW2, PW3, PW4, Res, Res_8P4R, Res_pot, SMA, STC12C5A60S2, STC15F2K60S2, STM32F103RDT6, SW, SW_BTN, SW_DIP_4, SW_DIP_5, SW_DIP_6, SW_DIP_8, SW_PB, SX1308, Test, Test_6, THS3201, tlv3501, TP4056, TP5400, USB, USB_M, VCA810, VCA821, XC6206, XL6009, XTAL, XTAL_SMD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值