您的位置 首页 编程

LCD1602的C8051驱动

——————–lcd1602c——————————******************************************

//——————–lcd1602.c——————————

//**********************************************
// 功用:C8051F(330) LCD1602(4线驱动
//**********************************************
#include
#include “delay.h”
//
//12 345678910 11 12 13 1415 16
// |||||||
//|—| |||||———————| |–|
//VSS VDD VL RS RW ED0 D1 D2 D3 D4 D5 D6 D7 B+ B-

//
//衔接:
//RS->P0.1
//RW->P0.2
//E->P0.3
//D4~D7->P1.4~P1.7
//VL依据不同类型,可能要接VSS或VDD
//B+/B–>+5/GND
//VSS/VDD->GND/+3.3

sbit lcd_rs=P0^1;
sbit lcd_rw=P0^2;
sbit lcd_e=P0^3;
#define LCD_DAT P1
//HD44780指令
#define LCD_CLEAR 0x01

//清屏
#define LCD_HOME 0x02
//光标复位
#define LCD_SET_INPUT 0x06
//输入形式:AC+1,显现不移
#define LCD_DISPLAY_OFF 0x80
#define LCD_DISPLAY_ON 0x0c
#define LCD_SHIFT 0x14
//显现屏和光标移动:AC+1,光标右移1格
#define LCD_MODE_8 0x38
#define LCD_MODE_4 0x28
//unsigned char lcd_add=0x00;
void lcd_write_cmd(unsigned char dat)
{
lcd_rs=0;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
void lcd_sendchar(unsigned char dat)
{
lcd_rs=1;
lcd_rw=0;
lcd_e=1;
LCD_DAT=dat;
delay_us(1);
lcd_e=0;
//delay_us(50);
delay_us(1);
lcd_e=1;
LCD_DAT=dat<<4;
delay_us(1);
lcd_e=0;
delay_us(50);
}
//
//void lcd_wait_busy(void)
//{
//lcd_rs=0;
//lcd_rw=1;
//lcd_e=1;
//while(LCD_DAT&0x80);
//lcd_e=0;
//delay_us(50);
//}

void lcd_init(void)
{
lcd_e=0;
delay_ms(15);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
delay_ms(5);
lcd_write_cmd(LCD_MODE_8);
lcd_write_cmd(LCD_MODE_4);
//delay_us(50);
lcd_write_cmd(LCD_DISPLAY_ON);
//delay_us(50);
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_SET_INPUT);
//delay_us(50);
}
void lcd_reset(void)
{
lcd_write_cmd(LCD_CLEAR);
delay_ms(2);
lcd_write_cmd(LCD_HOME);
delay_ms(2);
}
void lcd_setadd(unsigned char add)
{
if(add>0x0f)add+=0x30;
lcd_write_cmd(add|0x80);
}
void lcd_sendstr(unsigned char add,unsigned char *dat)
{
lcd_setadd(add);
while(*dat)
{
lcd_sendchar(*dat++);
}
}
//—————————————————————–
//———————-lcd1602.h———————————
#ifndef _LCD_1602
#define _LCD_1602
extern void lcd_write_cmd(unsigned char dat);
extern void lcd_sendchar(unsigned char dat);
extern void lcd_wait_busy(void);
extern void lcd_init(void);
extern void lcd_sendstr(unsigned char add,unsigned char *dat);
extern void lcd_setadd(unsigned char add);
extern void lcd_reset(void);
#endif
//——————————————————————-
//—————-delay.c——————————————-
//**********************************************
// 功用:C8051F(330)准确延时 24.5M
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最终更新:2008-12-31
// 尊重劳动成果,引证请勿删去本信息谢谢!
//**********************************************
#include
#include
//———————————————-
//—————————-
// 微秒级准确延时
// 仿真:(24.5M)
// delay_us(1); //1.72us
// delay_us(10);//10.89us
// delay_us(100); //102.74us
//—————————-
void delay_us(unsigned char k)
{
while(k–)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
}
//———————————————-
// 毫秒级准确延时
// 仿真:(24.5M)
// delay_ms(1); //1001.75us
// delay_ms(10);//10.008ms
// delay_ms(100); //老机太慢出不来鸟~自己测吧:)
//———————————————-
void delay_1ms()
{
unsigned int j ;
for(j=3060;j>0;j–);
}
void delay_ms(unsigned int i)
{
for(;i>0;i–)delay_1ms();
}
//——————————————
//—————-delay.h—————–
#ifndef _DELAY_H
#define _DELAY_H
extern void delay_us(unsigned char k);
extern void delay_ms(unsigned int i);
#endif
//—————————————
//———————main.c————–
//**********************************************
// 功用:C8051F(330)准确延时+UART0+LCD1602(4线)
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最终更新:2009-5-12
// 尊重劳动成果,引证请勿删去本信息谢谢!
//**********************************************
//

//AVR/AVR32群:78613373
//C8051F/STC/MPC群:78614293
//Cortex-M3/M0(STM32)群:78612895
//PIC/PIC32群:78614030
//LabWindows/CVI群:20328398
//WinCE/C#群:74373749
//
//运用F330,串口为P0.4(TX0),P0.5(RX0);
#include
//#include
#include “uart0.h”
#include “delay.h”
#include “lcd1602.h”
void SYSCLK_Init(void);
void PORT_Init(void);

void main(void)
{
unsigned char dat=0x20;
unsigned char address=0;
PCA0MD&=~0x40 ;
// 制止看门狗
PORT_Init();
// 初始化端口I/O
SYSCLK_Init();
// 初始化体系时钟
UART0_Init();
// 串口初始化

EA=1 ;
ES0=1 ;
P0|=0x01;
lcd_init();
lcd_reset();
lcd_sendstr(0,”1234567890abcdef”);
lcd_sendstr(16,”ghijklmnopqrstuv”);
sendstr(“Welcome to Julys Hut!”);
while(1)
{
delay_ms(200);
P0^=0x01;
Uart0_Transmit(dat);
lcd_setadd(address++);
if(address>31)address=0;
lcd_sendchar(dat++);
if(dat>=0x7f)dat=0x20;
//Uart0_Transmit(0x00);
}
}
//—————————————————————————–
// 端口初始化
//—————————————————————————–
//
// 装备交叉开关和通用IO
//
// P0.4 – UART TX0
// P0.5 – UART RX0
void PORT_Init(void)
{
P0MDOUT|=0x10 ;
// 使能 UTX 为推挽输出
P0MDOUT|=0x01;
XBR0=0x01 ;
// 使能 UART0 占用 P0.4(TXD) 和 P0.5(RXD)
XBR1=0x40 ;
//使能交叉开关
}
//—————————————————————————–
// 体系时钟初始化
//—————————————————————————–
void SYSCLK_Init(void)
{
OSCICN|=0x03 ;
// 装备内部振荡器的的最大频率
RSTSRC=0x04 ;
// 使能一直丢掉检测寄存器
}
//—————————————————-
//————-main.h———————-
#ifndef _MAIN_H
#define _MAIN_H
// 体系作业频率
#define SYSCLK 24500000
// 串口作业波特率
#define BAUDRATE 9600
#endif
//—————————————-
//———-uart0.c———————–
//**********************************************
// 功用:C8051F(330) UART0
// 作者:July
// Blog: http://blog.sina.com.cn/mcuworld
// 最终更新:2009-5-12
// 尊重劳动成果,引证请勿删去本信息谢谢!
//**********************************************
#include
#include “main.h”
unsigned char temp ;
void UART0_Init(void);
void Uart0_Transmit(unsigned char tmp);
void sendstr(unsigned char*tmp);
//—————————————————————————–
// 串口UART0初始化
//—————————————————————————–
void UART0_Init(void)
{
SCON0=0x10 ;
if(SYSCLK/BAUDRATE/2/256<1)
{
TH1=-(SYSCLK/BAUDRATE/2);
CKCON&=~0x0B ;
CKCON|=0x08 ;
}
else if(SYSCLK/BAUDRATE/2/256<4)
{
TH1=-(SYSCLK/BAUDRATE/2/4);
CKCON&=~0x0B ;
CKCON|=0x09 ;
}
else if(SYSCLK/BAUDRATE/2/256<12)
{
TH1=-(SYSCLK/BAUDRATE/2/12);
CKCON&=~0x0B ;
}
else
{
TH1=-(SYSCLK/BAUDRATE/2/48);
CKCON&=~0x0B ;
CKCON|=0x02 ;
}

TL1=TH1 ;
TMOD&=~0xf0 ;
TMOD|=0x20 ;
TR1=1 ;
// TI0 = 1;
}
//———————————————————–
// 串口UART0中止
//———————————————————–
//中止向量0x0023
void UATR0_ISR(void)interrupt 4
{
//Rx、Tx共用中止
//接纳中止
if(!TI0)
{
RI0=0 ;
temp=SBUF0 ;
Uart0_Transmit(temp);
}
//发送中止
else TI0=0 ;
}
//———————————————————–
// 串口UART0发送
//———————————————————–
void Uart0_Transmit(unsigned char tmp)
{
ES0=0 ;
//关UART0中止
EA=0 ;
//关大局中止
SBUF0=tmp ;
while(TI0==0);
//TI0=0 ;
ES0=1 ;
//开UART0中止
EA=1 ;
//开大局中止

}
//———————————————————–
// 发送字符串
//———————————————————–
void sendstr(unsigned char*tmp)
{
while(*tmp)
{
Uart0_Transmit(*tmp++);
}
}

//———————————–
//———————–uart0.h——————-
#ifndef _UART0_H
#define _UART0_H
extern void UART0_Init(void);
extern void Uart0_Transmit(unsigned char tmp);
extern void sendstr(unsigned char*tmp);
#endif

//————————————-

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/261304.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部