📄 hjmcu.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 + -