⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hjmcu.c

📁 很实用的单片机例程
💻 C
字号:
/**************************************************************************************************
*** 慧净电子1天入门、10天学会、1年精通单片机与C语言视频教程配套程序源码                         ***
*** 实验目的:HJ-1G 开发板   AVR配套实验程序                                                    ***
*** MCU: ATmega16          部分C源码可以直接用于项目开发、欢迎复制共享、功德无量、没有版权      ***
*** 作者:慧净免费助学会员  
*** 部分源码网上收集整理、如有伤害到你的利益、请来信,hjmcu@163.com 我们的免费助学会员会定期帮你删除掉         ***
*** 编译器:GCC                                                                                ***
*** 百度交流空间:http://hi.baidu.com/HJMCU      WWW.HJMCU.COM                                  ***
*** 论坛交流:http://bbs.hjmcu.com   欢迎来论坛一分钱不要下载配套的仿真电路                     ***
*** 配套的硬件学习板网址:http://shop37031453.taobao.com/                                       ***
*** 日期:2008.8.8                                                                              ***
*** 目标:用C语言写程序就这么简单、慧争祝你1天入门、10天学会、1年精通单片机与C语言、找个好工作  ***
***************************************************************************************************/

//慧净电子大学生课程设计专用实验板《HJ-1G》、直接支持AT89S52 STC89C52单片机
//加转接板后支持AVR ATmega16 32 系列单片机、是你学习单片机的得力助手 一板二用,学完51再学AVR

//HJ-1G 学习板加AVR转接板后,装上ATMETAM16 单片机实验
//HJ-1G 学习板AVR单片机实验,FM报警实验
//注意要把JTAGEN 仿真熔丝位设置成1 才能完成本实验,设置成1时不能用仿真口,只能用ISP下载接口下载程序

//头文件包含
#include <avr/io.h>        //io端口寄存器配置文件,必须包含
#include <util/delay.h>       //GCC中的延时函数头文件

//端口位定义
#define RS PD5           //数据/命令控制端 0命令,1数据
#define RW PD6           //读/写选择控制端 0写,1读
#define E PD4            //使能端          下降沿读,高电平写

//全局变量声明
unsigned char LCD_DispBuff1[]="HJ-1G AVR M16  ";
unsigned char LCD_DispBuff2[]=" WWW.HJMCU.COM";

//函数声明
void Port_Init(void);   //端口初始化
void LCD_Init(void);    //LCD初始化
void Write_Com(unsigned char LCD_Com);   //LCD写指令
void Write_Data(unsigned char LCD_Data);  //LCD写数据
void Check_Busy(void);   //读写检测函数,每次对液晶操作前都要进行读写检测

int main(void)            
{
    unsigned char Disp_Number;
   
	Port_Init();   //端口初始化
	LCD_Init();    //LCD初始化
	
/*	//在任意位置处显示字符
	Write_Com(0X80+0X05);   //发送字符显示位置指令。0x05可以换成00-0f,40-4f之间的任意值
	Write_Data('a');        //发送要显示的字符
	
		*/
	//下面这段程序演示在LCD上显示两行字符
	/*	Write_Com(0X80+0X00);
	for(Disp_Number = 0;Disp_Number < 15;Disp_Number++)
	{
		Write_Data(LCD_DispBuff1[Disp_Number]);
		_delay_ms(5);
	}
	Write_Com(0X80+0X40);
	for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
	{
		Write_Data(LCD_DispBuff2[Disp_Number]);
		_delay_ms(5);
	}

		*/

	//下面这段程序演示在LCD上显示两行字符,字符从屏幕右边移动到屏幕左边
	Write_Com(0X80+0X10);
	for(Disp_Number = 0;Disp_Number < 15;Disp_Number++)
	{
		Write_Data(LCD_DispBuff1[Disp_Number]);
		_delay_ms(5);
	}
	Write_Com(0X80+0X50);
	for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
	{
		Write_Data(LCD_DispBuff2[Disp_Number]);
		_delay_ms(5);
	}
	for(Disp_Number = 0;Disp_Number < 16;Disp_Number++)
	{
		Write_Com(0X18);
		_delay_ms(200);
	}

	
	while(1)
	{
		
	}
}

void Port_Init()
{      
	//LCD数据端口设置
	PORTA = 0X00;         //
	DDRA = 0XFF;           //配置端口PA全部为输出口,LCD数据端口
	
	//LCD控制端口设置
	PORTD = 0X00;         //
	DDRD |= (1 << RS) | (1 << RW) | (1 << E);
	//DDRD |= (1 << RS) | (1 << RW) | (1 << E);  //配置端口PD的第4、5、6为输出口
	
}

void LCD_Init()
{
	Write_Com(0X01);  //清屏
	_delay_ms(5);
	Write_Com(0X38);  //显示模式设置 16x2显示,5x7点阵,8位数据接口
	_delay_ms(5);
	//Write_Com(0X0f);  //显示开关控制,开显示,光标显示,光标闪烁
	Write_Com(0X0c);  //显示开关控制,开显示,光标不显示,光标不闪烁
	_delay_ms(5);
	Write_Com(0X06);  //光标设置,读或写一个字符后,地址指针加一,光标加一,整屏不移动
	_delay_ms(5);
}

void Write_Com(unsigned char LCD_Com)
{
//	Check_Busy();
	
	PORTD &= ~(1 << RS);     //RS=0,写命令
	PORTD &= ~(1 << RW);     //RW=0,写指令
	PORTD |= (1 << E);       //E=1,写操作
	_delay_ms(5);
	PORTA = LCD_Com;         //指令送数据端口
	PORTD &= ~(1 << E);     //E=0,停止写操作
	_delay_ms(5);
	
}

void Write_Data(unsigned char LCD_Data)
{
//	Check_Busy();

	PORTD |= (1 << RS);      //RS=1,写数据
	PORTD &= ~(1 << RW);    //RW=0,写指令
	PORTD |= (1 << E);      //E=1,写操作
	_delay_ms(5);  
	PORTA = LCD_Data;        // 数据送数据端口   
	PORTD &= ~(1 << E);    //E=0,停止写操作
	_delay_ms(5);
	
}

void Check_Busy()
{
    	
	DDRA = 0X00;             //PA口置为输入口,准备读取数据
	PORTD &= ~(1 << RS);      //RS=0,读命令
	PORTD |= (1 << RW);    //RW=1,读指令
	PORTD |= (1 << E);      //E=1,使能
	
	//while(0X80 & PINB);   //监测忙信号,直到忙信号为0,才能进行读写操作
	PORTD &= ~(1 << E);   //E=0
	DDRA = 0XFF;          //PA口置为输出口,准备向端口发送数据
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -