51单片机模块化编程、LCD调试

1.传统方式编程和模块化编程的区别:

传统编程方式:所有的函数均放在main.c文件中,如果使用的模块比较多,则一个文件中会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。

模块化编程方式:把各个模块的代码放在不同的.c文件里,在.h(head----头文件)文件里提供外部可调用函数的声明,其中.c文件想使用其中的代码时,只需要#include即可; 使用模块化编程可极大提高代码的可阅读性。

对于比较复杂、大型的程序;可以分开成.c文件和.h文件----例如:Delay.c和Delay.h文件,Delay.h文件中只要需要放置Delay函数的声明即可;

#ifndef__DELAY_H__

#define__DELAY_H__

#endif  (还有其他的预编译代码)   称为预编译,防止重复的引用、包含。

<>   和   "  "  的区别在于:<>引用的是安装目录下的文件,是安装的时候实实在在存在的文件,而  "  "  是我们自定义的.h头文件;

2.制作LED灯闪烁的模块化编程:

其他复杂的模块化编程都如此;

main.c 文件

#include <REGX52.H>
#include "Delay.h"

void main()
{
	while(1)
	{
		P2_0=1;
		Delay(200);
		P2_0=0;
		Delay(200);
	}
}

Delay.c 文件

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}

Delay.h 文件

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);
#endif

3.LCD1602调试

LCD1602对应到51单片机上;对应右上角的排针插入的LCD屏幕;

使用之间需要进行初始化一次;

4.矩阵键盘

原理图和51单片机的实物图如图所示:

 在LED屏上打印出HelloWorld;需要注意采用模块化编程,编写头文件Delay.h和LCD1605.h;

#include <REGX52.H>
#include "Delay.h"
#include "LCD1605.h"

void main()
{
	LCD_Init();//LED屏初始化
	LCD_ShowString(1,1,'HelloWorld');
	while(1)//在LED屏上打印出HelloWorld
	{
		
	}
}

 5.  通过矩阵按键在LED1602上显示按键对应的数字:      

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		i=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}

unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
}

P1=0XFF;全部高电位;单独让每一列低电位0,然后 if 判断语句,while查看按键状态,KeyNumber按照原理图的标号进行选择;

6. 定时器:

定时器用于计时系统,可以实现软件计时,使程序每隔一固定时间完成一项操作;

定时器可以代替长时间的Delay,提高CPU的运行效率和处理速度;

系统时钟也就是晶振周期,本开发板上的晶振为12MHZ;

中断系统是为了使CPU具有对外界紧急情况的实时处理能力而设置的;

寄存器是连接软硬件的媒介;寄存器是一段特殊的RAM存储器,可以存储和读取数据,也可以控制电路的连接方式;

符号:TCON-----定时器控制寄存器;地址:88H;复位值:0000 0000B;

符号:TMOD-----定时器模式寄存器;地址:89H;复位值:0000 0000B;

符号:TL0(定时器0)-----Timer Low 0;地址:8AH;复位值:0000 0000B;

符号:TL1(定时器1)-----Timer Low 1;地址:8BH;复位值:0000 0000B;

符号:TH0(定时器0)-----Timer High 0;地址:8CH;复位值:0000 0000B;

符号:TH1(定时器1)-----Timer High 1;地址:8DH;复位值:0000 0000B;

7. 定时器实现流水灯左右移;

main.c

KeyNum是独立按键;LEDMODE是流水灯模式;在此定义流水灯模式为 0 1 0 1 循环,也就是说一个模式左移,另一个模式实现流水灯右移;

#include <REGX52.H>
#include <Timer0.h>
#include <Key.h>
#include <INTRINS.H>

unsigned char	KeyNum,LEDMODE;
void main()
{
	P2=0xFE;
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();
		if(KeyNum)
		{
			if(KeyNum==1)
			{
				LEDMODE++;
				if(LEDMODE>=2)
					LEDMODE=0;
				
			}
		
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TH0=64535/256;
	TL0=64535%256;
	T0Count++;
	if(T0Count>=500)
	{
		T0Count=0;
		if(LEDMODE==0)
			P2=_crol_(P2,1);//左移
		if(LEDMODE==1)
			P2=_cror_(P2,1);//右移
	}
}

Delay.c

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);
#endif

Timer0.c

#include <REGX52.H>



void Timer0_Init(void)
{
	TMOD=0x01;
//	TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不变;
//	TMOD=TMOD|0x01;//把MOD的低四位置1,高四位保持不变;
	TF0=0;//清除TF0标志
	TR0=1;//定时器0开始计时
	TH0=64535/256;//设置定时初值
	TL0=64535%256;//设置定时初值
	ET0=1;//允许中断
	EA=1;
	PT0=0;//中断优先级
}

Timer.h

#ifndef __TIMER0_H__
#define __TIMER0_H__



void Timer0_Init(void);

#endif

Key.c

#include <REGX52.H>
#include <Delay.h>

unsigned char Key()
{
	unsigned char KeyNumber=0;
	
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
	
	return KeyNumber;
}

 Key.h

#ifndef __KEY_H__
#define __KEY_H__



unsigned char Key();

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值