微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LCD1602的C8051驱动

LCD1602的C8051驱动

时间:11-23 来源:互联网 点击:

//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

//-------------------------------------

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top