用C语言写一个LCD1602驱动显示程序

发布时间:2023-01-30  

#define MAIN_Fosc 22118400L

#include "STC15Fxxxx.H"

sbit P_HC595_SER = P4^0;

sbit P_HC595_RCLK = P5^4;

sbit P_HC595_SRCLK = P4^3;

u8 hour,minute,second;

void DisplayRTC(void);

void RTC(void);

void delay_ms(u8 ms);

void DisableHC595(void);

void Initialize_LCD(void);

void Write_AC(u8 hang,u8 lie);

void Write_DIS_Data(u8 DIS_Data);

void ClearLine(u8 row);

u8 BIN_ASCII(u8 tmp);

void PutString(u8 row, u8 column, u8 *puts);

void WriteChar(u8 row, u8 column, u8 dat);

void main(void)

{

P0M1 = 0; P0M0 = 0; //设置为准双向口

P1M1 = 0; P1M0 = 0; //设置为准双向口

P2M1 = 0; P2M0 = 0; //设置为准双向口

P3M1 = 0; P3M0 = 0; //设置为准双向口

P4M1 = 0; P4M0 = 0; //设置为准双向口

P5M1 = 0; P5M0 = 0; //设置为准双向口

P6M1 = 0; P6M0 = 0; //设置为准双向口

P7M1 = 0; P7M0 = 0; //设置为准双向口

Initialize_LCD();

ClearLine(0);

ClearLine(1);

P2M1 &= ~(1<<4);

P2M0 |= (1<<4);

P24 = 1;

DisableHC595();

PutString(0,0,"---Clock demo---");

hour = 12;

minute = 0;

second = 0;

DisplayRTC();

while(1)

{

delay_ms(250);

delay_ms(250);

delay_ms(250);

delay_ms(250);

RTC();

DisplayRTC();

}

}

void delay_ms(u8 ms)

{

unsigned int i;

do{

i = MAIN_Fosc / 13000;

while(--i) ;

}while(--ms);

}

void DisableHC595(void)

{

u8 i;

P_HC595_SER = 1;

for(i=0; i<20; i++)

{

P_HC595_SRCLK = 1;

P_HC595_SRCLK = 0;

}

P_HC595_RCLK = 1;

P_HC595_RCLK = 0;

P_HC595_RCLK = 1;

P_HC595_RCLK = 0;

}

void DisplayRTC(void)

{

if(hour >= 10) WriteChar(1,4,hour / 10 + '0');

else WriteChar(1,4,' ');

WriteChar(1,5,hour % 10 +'0');

WriteChar(1,6,'-');

WriteChar(1,7,minute / 10+'0');

WriteChar(1,8,minute % 10+'0');

WriteChar(1,9,'-');

WriteChar(1,10,second / 10 +'0');

WriteChar(1,11,second % 10 +'0');

}

void RTC(void)

{

if(++second >= 60)

{

second = 0;

if(++minute >= 60)

{

minute = 0;

if(++hour >= 24) hour = 0;

}

}

}

#define LineLength 16

sfr LCD_BUS = 0x80;

sbit LCD_B7 = LCD_BUS^7;

sbit LCD_B6 = LCD_BUS^6;

sbit LCD_B5 = LCD_BUS^5;

sbit LCD_B4 = LCD_BUS^4;

sbit LCD_B3 = LCD_BUS^3;

sbit LCD_B2 = LCD_BUS^2;

sbit LCD_B1 = LCD_BUS^1;

sbit LCD_B0 = LCD_BUS^0;

sbit LCD_ENA = P2^7;

sbit LCD_RW = P2^6;

sbit LCD_RS = P2^5;

#define C_CLEAR 0x01

#define C_HOME 0x02

#define C_CUR_L 0x04

#define C_RIGHT 0x05

#define C_CUR_R 0x06

#define C_LEFT 0x07

#define C_OFF 0x08

#define C_ON 0x0C

#define C_FLASH 0x0D

#define C_CURSOR 0x0E

#define C_FLASH_ALL 0x0F

#define C_CURSOR_LEFT 0x10

#define C_CURSOR_RIGHT 0x10

#define C_PICTURE_LEFT 0x10

#define C_PICTURE_RIGHT 0x10

#define C_BIT8 0x30

#define C_BIT4 0x20

#define C_L1DOT7 0x30

#define C_L1DOT10 0x34

#define C_L2DOT7 0x38

#define C_4bitL2DOT7 0x28

#define C_CGADDRESS0 0x40

#define C_DDADDRESS0 0x80

#define LCD_DelayNop() NOP(15)

#define LCD_BusData(dat) LCD_BUS = dat

void CheckBusy(void)

{

u16 i;

for(i=0; i<5000; i++) {if(!LCD_B7) break;}

}

void IniSendCMD(u8 cmd)

{

LCD_RW = 0;

LCD_BusData(cmd);

LCD_DelayNop();

LCD_ENA = 1;

LCD_DelayNop();

LCD_ENA = 0;

LCD_BusData(0xff);

}

void Write_CMD(u8 cmd)

{

LCD_RS = 0;

LCD_RW = 1;

LCD_BusData(0xff);

LCD_DelayNop();

LCD_ENA = 1;

CheckBusy();

LCD_ENA = 0;

LCD_RW = 0;

LCD_BusData(cmd);

LCD_DelayNop();

LCD_ENA = 1;

LCD_DelayNop();

LCD_ENA = 0;

LCD_BusData(0xff);

}

void Write_DIS_Data(u8 dat)

{

LCD_RS = 0;

LCD_RW = 1;

LCD_BusData(0xff);

LCD_DelayNop();

LCD_ENA = 1;

CheckBusy();

LCD_ENA = 0;

LCD_RW = 0;

LCD_RS = 1;

LCD_BusData(dat);

LCD_DelayNop();

LCD_ENA = 1;

LCD_DelayNop();

LCD_ENA = 0;

LCD_BusData(0xff);

}

void Initialize_LCD(void)

{

LCD_ENA = 0;

LCD_RS = 0;

LCD_RW = 0;

delay_ms(100);

IniSendCMD(C_BIT8);

delay_ms(10);

Write_CMD(C_L2DOT7);

delay_ms(6);

Write_CMD(C_CLEAR);

Write_CMD(C_CUR_R);

Write_CMD(C_ON);

}

void ClearLine(u8 row)

{

u8 i;

Write_CMD(((row & 1) << 6) | 0x80);

for(i=0; i}

void WriteChar(u8 row, u8 column, u8 dat)

{

Write_CMD((((row & 1) << 6) + column) | 0x80);

Write_DIS_Data(dat);

}

void PutString(u8 row, u8 column, u8 *puts)

{

Write_CMD((((row & 1) << 6) + column) | 0x80);

for ( ; *puts != 0; puts++)

{

Write_DIS_Data(*puts);

if(++column >= LineLength) break;

}

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    红外遥控器设计系统的控制输入模块,LCD1602液晶显示屏作为系统的输出显示模块,再利用STC89C52RC芯片通过UART协议以波特率9600波特与IR01红外收发模块进行通讯,控制IR01红外收发模块对红外遥控器的红外编码进行学习和发射。基于单片机......
    LCD1602液晶显示屏的管脚与单片机采用网络标号形式连接,PR1是10kΩ的可调电阻,通过调节可调电阻实现LCD1602液晶显示屏的对比度调节。LCD1602的D7~D0引脚是并行数据接口,与单片机......
    LCD1602引脚介绍及STM32单片机驱动LCD1602程序;  LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶......
    基于51单片机的呼出异味气体检测仪设计方案;本设计由STC89C52单片机电路+LCD1602液晶显示电路+MQ-2甲烷传感器模块电路+MQ-3酒精传感器模块电路+MQ-9 CO传感器电路+A/D......
    51单片机LCD1602液晶显示的驱动控制设计;利用串行A/D转换器TLC549对输入信号电压源进行采集转换成数字信号给51单片机,经单片机进行数据处理后给1602液晶显示。 误差小于1......
    系统框图 最终将STC89C52单片机作为系统的主控芯片,人机交互通过独立按键和LCD1602液晶显示屏来实现,并可通过独立按键来设定醉酒阈值,调节时间显示,与标准时间同步。使用MQ-3酒精......
    输出,然后接至单片机的外部中断INT0引脚,即P3.2引脚。测量时,两电路只有一个接至单片机,分别用于测量电容和电阻。   4、液晶显示电路      测量的结果要显示出来,本系统采用LCD1602作为显示......
    -连接单片机的地(串口TTL通信就需要连接这四根线);测量电压选用5V;单片机型号STC89C52,液晶显示屏型号LCD1602,电路连接按照那个测试图的;串口通信波特率9600,注意......
    DS18B20温度检测模块,利用LCD12864显示采集的温度数据,LCD12864相对于LCD1602来说能够显示文字,LCD12864显示器被称为点矩阵液晶显示模块,也称为12864,因为它是包括12864......
    基于STM32单片机的摇头风扇设计;本设计的硬件构成: STM32F103C8T6单片机最小系统板+时钟晶振电路+复位电路(上电自复位,手动复位),LCD1602显示屏电路,独立......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>