液晶LCD1602显示字符和数字程序源代码
/***********************液晶LCD1602测试程序源代码*************************
单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:
液晶LCD1602显示字符和倒计时。
**************************************************************************/
#include "stc15.h" //包含头文件stc15.h
#include <intrins.h> //包含头文件intrins.h
#define Busy 0x80 //LCD忙
sbit LCD_D0 = P0^0; //LCD_D0对应P0.0
sbit LCD_D1 = P0^1; //LCD_D1对应P0.1
sbit LCD_D2 = P0^2; //LCD_D2对应P0.2
sbit LCD_D3 = P0^3; //LCD_D3对应P0.3
sbit LCD_D4 = P0^4; //LCD_D4对应P0.4
sbit LCD_D5 = P0^5; //LCD_D5对应P0.5
sbit LCD_D6 = P0^6; //LCD_D6对应P0.6
sbit LCD_D7 = P0^7; //LCD_D7对应P0.7
sbit LCD_RS = P1^0; //LCD_RS对应P1.0
sbit LCD_RW = P1^1; //LCD_RW对应P1.1
sbit LCD_EN = P3^4; //LCD_EN对应P3.4
void delay(unsigned int t); //delay延时函数
void delay_us(unsigned int t); //delay_us延时函数
void delay_ms(unsigned int t); //delay_ms延时函数
void Delay5Ms(void); //5Ms延时函数
void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数
void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数
void LCDInit(void); //LCD初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
//LCD显示一个字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
//LCD显示一个字符串
unsigned char code welcome[] = {"Hello My Friends"};
//液晶LCD1602显示Hello My Friends
unsigned char code countdown[] = {"CountDown: S"};
//液晶LCD1602显示CountDown: S
void delay(unsigned int t) //delay延时函数
{while(t--);}
void delay_us(unsigned int t) //delay_us延时函数
{
unsigned char i;
while(t--)
{
i=3;
while(i--)delay(1);
}
}
void delay_ms(unsigned int t) //delay_ms延时函数
{
while(t--)
{delay_us(t);}
}
void Delay5Ms(void) //5ms延时函数
{
unsigned int TempCyc = 3552;
while(TempCyc--);
}
void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{
P0M1 = P3M1&0x00;
P0M0 = P3M0&0x00;
P1M1 = P3M1&0xfc;
P1M0 = P3M0&0xfc;
P3M1 = P4M1&0xef;
P3M0 = P4M0&0xef;
}
unsigned char ReadStatusLCD(void) //测试LCD忙碌状态
{
LCD_D7 = 1; //LCD的D7置1
LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1;  //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号
return(Busy);  //表示当前忙
}
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if(BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_EN = 0; //LCD管脚E设置成低电平
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
源代码1080p在线LCD_RS = 0; //LCD管脚RS设置成低电平
LCD_RW = 0;  //LCD管脚RW设置成低电平
_nop_(); //空操作,延时
_nop_(); //空操作,延时
P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_EN = 1; //E置高电平
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_EN = 0;
/
/当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数
{
ReadStatusLCD(); //读取LCD状态
LCD_EN = 0; //LCD管脚E设置成低电平
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_RS = 1; //LCD管脚RS设置成高电平
LCD_RW = 0;  //LCD管脚RW设置成低电平
P0 = WDLCD;
//将数据送入P0口,即将数据写入液晶模块
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_EN = 1; //E置高电平
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
_nop_(); //空操作,延时
LCD_EN = 0;
//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
void LCDInit(void) //LCD初始化
{
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置
}
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1  if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据
}
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
void main(void)
{
GPIO_1602_Configuration(); //LCD1602液晶IO口初始化
delay_ms(10); //延时
LCDInit(); //LCD1602初始化
delay_ms(10); //延时
DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时
DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时
DisplayOneChar(14,1,0x39);  //LCD1602显示9
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x38);  //LCD1602显示8
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x37);  //LCD1602显示7
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x36);  //LCD1602显示6
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x35);  //LCD1602显示5
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x34);  //LCD1602显示4
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x33);  //LCD1602显示3
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x32);  //LCD1602显示2
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x31);  //LCD1602显示1
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时DisplayOneChar(14,1,0x30);  //LCD1602显示0
delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);  //延时
while(1)
{;}
}

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