当前位置:首页 > 单片机 > 单片机
[导读]//FileName:delay.h#ifndef __LZP_DELAY_H_#define __LZP_DELAY_H_#define TRUE 1#define FALSE 0//设置波特率#define OSC_FREQ 11059200L#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255#defin

//FileName:delay.h
#ifndef __LZP_DELAY_H_
#define __LZP_DELAY_H_

#define TRUE 1
#define FALSE 0
//设置波特率
#define OSC_FREQ 11059200L


#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254
#define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244
// Timer2
#define RCAP2_50us 65536L - OSC_FREQ/240417L
#define RCAP2_1ms 65536L - OSC_FREQ/12021L


void delay_ms(unsigned int num);
void delay_50us(unsigned char num);
void delay_us(unsigned char num);


#endif


//FileName:delay.c
/********************************************
** start51 study board
** delay function implementation
** author:bluehacker
** QQ:282074921
**********************************************/
#include "delay.h"
#include "reg52.h"



void delay_ms(unsigned int num)
{
RCAP2H = (RCAP2_1ms>>8);
RCAP2L=(RCAP2_1ms&0x00ff);
TH2=(RCAP2_1ms>>8);;
TL2=(RCAP2_1ms&0x00ff);;

ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer

while (num--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
}


void delay_50us(unsigned char num)
{
RCAP2H=(RCAP2_50us>>8);
RCAP2L=(RCAP2_50us&0x00ff);
TH2=(RCAP2_50us>>8);
TL2=(RCAP2_50us&0x00ff);
ET2=0;
T2CON=0x04;
while(num--)
{
while(!TF2)
TF2=FALSE;
}
TR2=FALSE;
}


void delay_us(unsigned char num)
{
unsigned char i;
for (i=0;i {
}
}


//FileName:lcd.h


#ifndef __LZP_LCD_H_
#define __LZP_LCD_H_
#include "reg52.h"
/////////////////////////////
//定义LCD控制引脚
////////////////////////////
sbit LCDRS="P2"^0;
sbit LCDRW="P2"^1;
sbit LCDE="P2"^2;


void lcd_write_cmd(unsigned char cmd);
void lcd_write_data(unsigned char dat);
void lcd_clear(void);
void lcd_init(void);
unsigned char lcd_status(void);
void lcd_set_mode(unsigned charcursor, unsigned char text);
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);
void lcd_write_char(unsigned char x,unsigned char y, unsigned char d);
#endif


//FileName:lcd.c
/********************************************************
**本开发板支持1602 字符型LCD
**这种LCD的接口资料可以用google找到很多
**引脚定义:
* 1---GND
* 2---VDD
* 3---VLCD:对比度调节
* 4---RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
* 5---R/W:读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平
RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
* 6---E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
* 7~14---DB0~DB7数据线、
* 15---A:背光引脚,"A"接正
* 16---K:背光引脚,"K"接负

*********************************************************/
#include "lcd.h"
#include "delay.h"
#include "intrins.h"


/*向LCD写入命令*/
void lcd_write_cmd(unsigned char cmd)
{
unsigned char status;
P0=cmd;
LCDRS="0";
LCDRW="0";
LCDE="0";
delay_us(5);
do{
status="lcd"_status();
}while(status&0x80);

LCDE="1";

}


void lcd_write_data(unsigned char dat)
{
unsigned char status;


P0=dat;
LCDRS="1";
LCDRW="0";
LCDE="0";
delay_us(5);
do{
status="lcd"_status();
}while(status&0x80);

LCDE="1";

}


void lcd_clear(void)
{
lcd_write_cmd(0x01);
}



/*显示屏字符串写入函数*/
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s)
{

if (y == 0) {
lcd_write_cmd(0x80 + x);
}
else {
lcd_write_cmd(0xC0 + x);
}

while (*s) {
lcd_write_data( *s);
s ++;
}

/*
unsigned char i;
for(i=0;i<16&&s!=0;i++)
{
lcd_write_char(x+i,y,s);
}
*/
}


void lcd_write_char(unsigned char x,unsigned char y, unsigned char d)
{
if(y==0)
{
lcd_write_cmd(0x80+x);
}
else
{
lcd_write_cmd(0xc0+x);
}
lcd_write_data(d);
}
//光标复位
void lcd_reset_cursor(void)
{
lcd_write_cmd(0x02);
}



//设置显示模式
void lcd_set_mode(unsigned charcursor, unsigned char text)
{
unsigned char mode="0x04";
if(cursor){//光标右移
mode|=0x02;
}
else{//光标左移
mode|=0x00;
}
if(text){//文字移动
mode|=0x01;
}
else{//文字不移动
mode|=0;
}
lcd_write_cmd(mode);
}



void lcd_init(void)
{
P0=0;
LCDE="1";
delay_ms(500);
lcd_clear();
lcd_write_cmd(0x38);//设置lcd功能:8位总线,双行显示,5X7点阵字符
lcd_write_cmd(0x0f);//显示开关控制:显示ON,光标ON,闪烁ON
lcd_write_cmd(0x06);//光标输入方式增量移位
lcd_write_cmd(0x80);
//lcd_write_cmd(0x0c);
//lcd_clear();
}
//读取状态,是否忙
unsigned char lcd_status(void)
{
unsigned char tmp="0";
P0=0xff;
LCDRS="0";
LCDRW="1";
LCDE="0";
_nop_();
LCDE="1";
//_nop_();
tmp="P0";
return tmp;
}


//FileName:test.c
/*******************************
** Start51 study board test software
** test 1602LCD
** author: bluehacker
** QQ:282074921
***********************************/


#include "lcd.h"
#include "delay.h"
#include "intrins.h"



void main(void)
{
//初始化串口
SCON="0x50";/*mode 1,1 start bit ,8 data bit ,1 stop bit,enable receive*/
PCON="0x80";/*SMOD=1, Baud Rate twice*/
TMOD="0x21";/*timer 0--mode 1 and timer 1 ---mode2*/
//set baud rate,use timer 1 as baud rate generator
TH1=BAUD_19200;
TL1=TH1;
TR1=TRUE;
ET1=FALSE;//disable timer 1 interrupt
EA="0";


//delay_ms(400);
lcd_init();
// lcd_set_mode(1,0);
//lcd_reset_cursor();
// lcd_write_char(3,1,'c');
lcd_write_str(2,0,"bluehacker");
lcd_write_str(2,1,"QQ:282074921");
while(1)
{
}
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的...

关键字: C51 数据类型 扩充定义

数据元(Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

▼点击下方名片,关注公众号▼大家好,很高兴和各位一起分享我的第16篇原创文章,喜欢和支持我的工程师,一定记得给我点赞、收藏、分享。加微信[xyzn3333]与作者沟通交流,免费获取更多单片机与嵌入式的海量电子资料。很多初...

关键字: 51单片机 C51

常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。

关键字: C51 单片机 误区 注意事项

简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。

关键字: C51 编程规范 文件配置

如果你用 Keil C51 进行编译,记住一点:它不区分大小写!!!卧槽,今天编程序那个调错啊,就因为一个数组名和一个变量名完全一样,只是大小写不一样罢了,标准 C 我怎么记得这样可以啊……上网一查,卧槽,Keil C5...

关键字: C51 单片机 编程要点
关闭
关闭