No.1 51单片机1602液晶显示C程序
/*1602LCD演示程序*//*目标器件:STC89C52*/
/*晶振:12MHz*/
/*编译环境:Keil 7.50A*/
/***************************************************************************/
/*********************************包含头文件********************************/
#include <reg51.h>
#include <intrins.h>
/*********************************端口定义**********************************/
sbit rs= P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
/********************************显示数据表*********************************/
unsigned char code dis1[] = {"welcome"};
unsigned char code dis2[] = {"lcd 1602"};
/
*****************************************************************************
函数功能:LCD延时子程序
入口参数:ms
出口参数:
*****************************************************************************/
void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*****************************************************************************/
bit lcd_bz()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
/*****************************************************************************
函数功能:写指令数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());//判断LCD是否忙碌
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//判断LCD是否忙碌
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void lcd_init()
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
void main(void)
{
unsigned char i;
lcd_init();// 初始化LCD
delay(10);
lcd_pos(0x01);//设置显示位置
i = 0;
while(dis1 != '\0')
{
lcd_wdat(dis1);//显示字符
i++;
}
lcd_pos(0x42);// 设置显示位置
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2);// 显示字符
i++;
}
while(1);
}
No.2 lcd  1602 C语言源代码
/*
*************************************************************************************
: LCD1602显示程序头文件,到时在主程序里包含这个头文件后,
就可以直接调用里面的函数了
: V1.0
完成日期: 2008.5.5
: ZHOUSFE
*************************************************************************************
修改日期:
:
*************************************************************************************
*/
include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#define Port P0 //数据端口
/*定义端口*********************************************************/
sbit Rs = P1^0;
sbit Rw = P1^1;
sbit En = P1^2;
/*定义LCD控制字*****************************************************/
//清屏及光标归位
#define LCD_CLEAR 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回左上角
//显示开关控制指令
#define LCD_SCREEN_ON 0x0C //显示开
#define LCD_SCREEN_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //显示光标
#define LCD_CURSOR_OFF 0x08 //无光标
#define LCD_C_FLASH_ON 0x09 //光标闪动
#define LCD_C_FLASH_OFF 0x08 //光标不闪动
//进入模式设置指令
#define LCD_AC_UP 0x06 //新数据后光标右移
#define LCD_AC_DOWN 0x04 //新数据后光标左移
#define LCD_S_MOVE_ON 0x05 // 画面可平移
#define LCD_S_MOVE_OFF 0x04 //画面不可平移
//设定显示屏或光标移动方向指令
#define LCD_C_LEFT 0x10 //光标左移1格,且AC值减1
#define LCD_C_RIGHT 0x11 //光标右移1格,且AC值加1
#define LCD_CHAR_LEFT 0x18 //显示器上字符全部左移一格,但光标不动
#define LCD_CHAR_RIGHT 0x1C //显示器上字符全部右移一格,但光标不动
uchar code number[10]={"0123456789"};
/*所有函数声明*********************************************************/
void LCD_init(void);
void LCD_wdata(uchar wdata);
void LCD_wcommand(uchar lcd_cmd,busy_f);
void LCD_gotoxy(uchar x,uchar y);
void Disp_char(uchar *str);
void Disp_number(unsigned int num);
uchar Rstatus(void);
uchar LCD_rdata(void);
/*
********************************************************************
函数名称:LCD_wcommand()
功能描述:LCD写指令
入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位
返回值:
********************************************************************
*/
void LCD_wcommand(uchar lcd_cmd,busy_f)
{
if (busy_f) Rstatus(); //不忙才执行下个程序
Port = lcd_cmd;
Rs = 0;
Rw = 0;
En = 0;
En = 0;
En = 1;
}
/*********************************************************************
函数名称:LCD_wdata()
功能描述:LCD写数据
入口参数:uchar wdata:所写数据
返回值:
*********************************************************************/
void LCD_wdata(uchar wdata)
{
Rstatus();
Port = wdata;
Rs = 1;
Rw = 0;
En = 0; //若晶振速度太高可以在这后加小的延时
En = 0; //延时
En = 1;
}
/
*********************************************************************
函数名称:LCD_rdata()
功能描述:LCD读数据
入口参数:
返回值:所读数据
*********************************************************************/
uchar LCD_rdata(void)
{
Rs = 1;
Rw = 1;
En = 0;
En = 0;
En = 1;
return Port;
}
/
*********************************************************************
函数名称:Rstatus()
功能描述:LCD读忙状态
入口参数:
返回值:若忙,则等待,不忙则返回Port
*********************************************************************/
uchar Rstatus(void)
{
Port = 0xFF;
Rs = 0;
Rw = 1;
En = 0;
En = 0;
En = 1;
while (Port & 0x80); //检测忙信号,不忙则退出等待
write的返回值return(Port);
}
/*********************************************************************
函数名称:LCD_init()
功能描述:LCD初始化
入口参数:
返回值:
*********************************************************************/
void LCD_init(void)
{
Port = 0;
LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,0);
delay_ms(3);
LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。