lcd_disp.c

来自「关键字:步进电机,调速,C语言,51单片机程序,通过调试」· C语言 代码 · 共 153 行

C
153
字号
/**********************************************************************************
*                                                                                 *
*    文 件 名:lcd_disp.c                                                         *
*    MCU Type:STC89C51  Fosc:11.0592MHz                                          *
*    功    能:1602液晶屏显示                                                     *
*    创 建 者:www.eldiy.net                                                      *
*    创建日期:2006-11-10                                                         *
*    其他说明:在YH51-I单片机学习开发板上验证通过                                 *
*              有什么问题欢迎来我们的学习论坛讨论,祝你成功!                      *
**********************************************************************************/

#include <reg51.h>  // 引用头文件,里面包含了一些对51单片机内部寄存器的定义
#include <string.h>

#define uchar unsigned char  //定义unsigned int为uint
#define uint unsigned int  //定义unsigned uchar为uchar


sbit LCD_RS = P2^0 ;             
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6;  //定义74HC164数据线为P2.6端口
sbit D_SCL = P2^7;  //定义74HC164数据线为P2.7端口

uchar str_forward[] = {"Forward "};
uchar str_backward[] = {"Backward"};
uchar str_stop[] = {"Stop    "};

extern bit forward_flag;
extern bit backward_flag;
extern bit ring_flag;
extern uchar speed_set_value;
extern void delay_ms(uint s);



//========= 送出一个字节给74HC164(实现串并转换) ==========
void send_out(unsigned char out)//传送一个字节8位
{
	uchar i;
	D_SCL = 0;
	for (i=8;i>=1;i--)
	{  
		D_SDA = out&0x80;   //送数据到数据口
		D_SCL = 1;  //时钟线置1             
		D_SCL = 0;  //送一时钟
		out<<=1;   //左移
	}      
}  
                                                                                                         
//========= 写命令函数 ==========
void lcd_wcmd(uchar cmd)
{                          
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0; 
    send_out(cmd);
    LCD_EN = 1;
    LCD_EN = 0 ;  
} 

//========= 写数据函数 ==========
void lcd_wdat(uchar dat) 
{                          
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    send_out(dat);
    LCD_EN = 1;
    LCD_EN = 0; 
}

void lcd_wstr(uchar *p,addr,len)
{	
	while(len!=0)
	{
		lcd_wcmd(addr);
		delay_ms(1);
		lcd_wdat(*p);
		p++;
		len--;
		addr++;
		delay_ms(1);
	}
} 


void renew_speed_value()
{
	uchar addr;
	addr = 0x80 + 0x4b;
	lcd_wcmd(addr);
	delay_ms(1);
	lcd_wdat(speed_set_value + 0x30); //写入数据 
}

void renew_work_status()
{
	uchar addr,len;
	addr = 0x80 + 0x00;

	if(!ring_flag)
	{
		len = 8;
		lcd_wstr(str_stop, addr, len);
	}

	else
	{
		if(forward_flag)
		{
			len =8;
			lcd_wstr(str_forward,addr,len);
		}

		else if(backward_flag)
		{
			len = 8;
			lcd_wstr(str_backward,addr,len);
		}
	}
}


void renew_lcd_disp()
{
	renew_speed_value();
	renew_work_status();
}

//========= LCD初始化函数 ==========
void lcd_init()
{      
	uchar addr,len;    
	uchar s_speed[] = "Speed set: 0";              
    lcd_wcmd(0x38);         
	delay_ms(1);
	lcd_wcmd(0x0c);  //显示开,关光标
	delay_ms(1);
    lcd_wcmd(0x06);  //向右移动光标
	delay_ms(1);
    lcd_wcmd(0x01);  //清除LCD显示屏
	delay_ms(1); 

	addr = 0x40 | 0x80;
	len = 12;
	lcd_wstr(s_speed,addr,len);
	renew_lcd_disp();
}  



									 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?