登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 浅尝1602整屏移动及多.c文件

[复制链接]
发表于 2022-2-9 10:25:23 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 学习多.c文件并用1602整屏移动尝试
开始时间: 2022-02-07
结束时间: 2022-02-08
在此章节,我明白了上个1602程序出现的问题,也就是时序问题,因为我们的单片机速度较快,所以要把使能E的高电平的一段延时到读取数据的那段时间,并再次使用延时函数延长E的高电平时间,让DB的数据完全被读取。然后学习整屏移动的程序,和LED点阵有些像。在学习多.c文件后用1602整屏移动进行尝试。


程序:


1602整屏移动(完整程序)


#include<reg52.h>


#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P1^2;


bit flag500ms = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char code str1[] = " Xin   Bao ";
unsigned char code str2[] = "I Love You!";


void ConfigTimer0(unsigned int ms);
void InitLcd1602();
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len);
void delay()
{
unsigned int i;
i=5;
while(--i);
}


void main()
{
unsigned char i;
unsigned char index = 0;
unsigned char pdata bufMove1[16+sizeof(str1)+16];
unsigned char pdata bufMove2[16+sizeof(str2)+16];


EA = 1;
ConfigTimer0(10);
InitLcd1602();
for(i=0;i<16;i++)
{
bufMove1 = ' ';
bufMove2 = ' ';
}
for(i=0;i<(sizeof(str1)-1);i++)
{
bufMove1[16+i] = str1;
bufMove2[16+i] = str2;
}
for(i=(16+sizeof(str1)-1);i<sizeof(bufMove1);i++)
{
bufMove1 = ' ';
bufMove2 = ' ';
}
while(1)
{
if(flag500ms)
{
flag500ms = 0;
LcdShowStr(0,0,bufMove1+index,16);
LcdShowStr(0,1,bufMove2+index,16);
index++;
if(index>=(16+sizeof(str1)-1))
{
index = 0;
}
}
}
}


void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;


tmp = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 13;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}


void LcdWaitReady()
{
unsigned char sta;


LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta&0x80);
}


void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}


void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}


void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;


if(y == 0)
addr = 0x00+x;
else
addr = 0x40+x;
LcdWriteCmd(addr | 0x80);
}


void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len)
{
LcdSetCursor(x,y);
while(len--)
{
LcdWriteDat(*str++);
}
}


void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}


void InterruptTimer0() interrupt 1
{
static unsigned char tmr500ms = 0;


TH0 = T0RH;
TL0 = T0RL;
tmr500ms++;
if(tmr500ms>=50)
{
tmr500ms = 0;
flag500ms = 1;
}
}



多.c文件(1602整屏移动)


nn2.c(LCD1602)


#include<reg52.h>

#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P1^2;

void delay()
{
unsigned int i;
i=5;
while(--i);
}

void LcdWaitReady()
{
unsigned char sta;

LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do{
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta&0x80);
}

void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
delay();
LCD1602_E = 1;
delay();
LCD1602_E = 0;
}

void LcdSetCursor(unsigned char x,unsigned char y)
{
unsigned char addr;

if(y == 0)
addr = 0x00+x;
else
addr = 0x40+x;
LcdWriteCmd(addr | 0x80);
}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len)
{
LcdSetCursor(x,y);
while(len--)
{
LcdWriteDat(*str++);
}
}

void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}

nn1,c(主函数)

#include<reg52.h>

bit flag500ms = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char code str1[] = " Xin   Bao ";
unsigned char code str2[] = "I Love You!";

void ConfigTimer0(unsigned int ms);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str,unsigned char len);

void main()
{
unsigned char i;
unsigned char index = 0;
unsigned char pdata bufMove1[16+sizeof(str1)+16];
unsigned char pdata bufMove2[16+sizeof(str2)+16];

EA = 1;
ConfigTimer0(10);
InitLcd1602();
for(i=0;i<16;i++)
{
bufMove1 = ' ';
bufMove2 = ' ';
}
for(i=0;i<(sizeof(str1)-1);i++)
{
bufMove1[16+i] = str1;
bufMove2[16+i] = str2;
}
for(i=(16+sizeof(str1)-1);i<sizeof(bufMove1);i++)
{
bufMove1 = ' ';
bufMove2 = ' ';
}
while(1)
{
if(flag500ms)
{
flag500ms = 0;
LcdShowStr(0,0,bufMove1+index,16);
LcdShowStr(0,1,bufMove2+index,16);
index++;
if(index>=(16+sizeof(str1)-1))
{
index = 0;
}
}
}
}

void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;

tmp = 32768000/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
tmp = tmp + 13;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
}

void InterruptTimer0() interrupt 1
{
static unsigned char tmr500ms = 0;

TH0 = T0RH;
TL0 = T0RL;
tmr500ms++;
if(tmr500ms>=50)
{
tmr500ms = 0;
flag500ms = 1;
}
}


好懒~~不想说~~~
发表于 2022-2-12 13:35:38 | 显示全部楼层
为什么是浅尝?
好懒~~不想说~~~
 楼主| 发表于 2022-2-12 14:08:39 | 显示全部楼层

简单学一下
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表