王健带你征服avr单片机仿真第一课.docx

上传人:b****4 文档编号:6016892 上传时间:2023-05-09 格式:DOCX 页数:19 大小:50.75KB
下载 相关 举报
王健带你征服avr单片机仿真第一课.docx_第1页
第1页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第2页
第2页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第3页
第3页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第4页
第4页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第5页
第5页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第6页
第6页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第7页
第7页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第8页
第8页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第9页
第9页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第10页
第10页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第11页
第11页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第12页
第12页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第13页
第13页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第14页
第14页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第15页
第15页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第16页
第16页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第17页
第17页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第18页
第18页 / 共19页
王健带你征服avr单片机仿真第一课.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

王健带你征服avr单片机仿真第一课.docx

《王健带你征服avr单片机仿真第一课.docx》由会员分享,可在线阅读,更多相关《王健带你征服avr单片机仿真第一课.docx(19页珍藏版)》请在冰点文库上搜索。

王健带你征服avr单片机仿真第一课.docx

王健带你征服avr单片机仿真第一课

王健带你征服AVR单片机仿真第一课

 

 

/*用法:

LCD_init();

LCD_write_string(列,行,"字符串");

LCD_write_char(列,行,'字符');

---------------------------------------------------------------

下面是AVR与LCD连接信息

PA2->RS

PA3->EN

地->RW

PA4->D4

PA5->D5

PA6->D6

PA7->D7

要使用本驱动,改变下面配置信息即可

-----------------------------------------------------------------*/

#defineLCD_EN_PORTPORTA//以下2个要设为同一个口

#defineLCD_EN_DDRDDRA

#defineLCD_RS_PORTPORTA//以下2个要设为同一个口

#defineLCD_RS_DDRDDRA

#defineLCD_DATA_PORTPORTA//以下3个要设为同一个口

#defineLCD_DATA_DDRDDRA//一定要用高4位

#defineLCD_DATA_PINPINA

#defineLCD_RS(1<

#defineLCD_EN(1<

#defineLCD_DATA((1<

/*--------------------------------------------------------------------------------------------------

函数说明

--------------------------------------------------------------------------------------------------*/

voidLCD_init(void);

voidLCD_en_write(void);

voidLCD_write_command(unsignedcharcommand);

voidLCD_write_data(unsignedchardata);

voidLCD_set_xy(unsignedcharx,unsignedchary);

voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s);

voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedchardata);

#ifndef__1602_h

#define__1602_h

//-----------------------------------------------------------------------------------------

#include"delay.h"

voidLCD_init(void)//液晶初始化

{

LCD_DATA_DDR|=LCD_DATA;//数据口方向为输出

LCD_EN_DDR|=LCD_EN;//设置EN方向为输出

LCD_RS_DDR|=LCD_RS;//设置RS方向为输出

LCD_write_command(0x28);

LCD_en_write();

delay_nus(40);

LCD_write_command(0x28);//4位显示

LCD_write_command(0x0c);//显示开

LCD_write_command(0x01);//清屏

delay_nms

(2);

}

voidLCD_en_write(void)//液晶使能

{

LCD_EN_PORT|=LCD_EN;

delay_nus

(1);

LCD_EN_PORT&=~LCD_EN;

}

voidLCD_write_command(unsignedcharcommand)//写指令

{

delay_nus(16);

LCD_RS_PORT&=~LCD_RS;//RS=0

LCD_DATA_PORT&=0X0f;//清高四位

LCD_DATA_PORT|=command&0xf0;//写高四位

LCD_en_write();

command=command<<4;//低四位移到高四位

LCD_DATA_PORT&=0x0f;//清高四位

LCD_DATA_PORT|=command&0xf0;//写低四位

LCD_en_write();

}

voidLCD_write_data(unsignedchardata)//写数据

{

delay_nus(16);

LCD_RS_PORT|=LCD_RS;//RS=1

LCD_DATA_PORT&=0X0f;//清高四位

LCD_DATA_PORT|=data&0xf0;//写高四位

LCD_en_write();

data=data<<4;//低四位移到高四位

LCD_DATA_PORT&=0X0f;//清高四位

LCD_DATA_PORT|=data&0xf0;//写低四位

LCD_en_write();

}

 

voidLCD_set_xy(unsignedcharx,unsignedchary)//写地址函数

{

unsignedcharaddress;

if(y==0)address=0x80+x;

elseaddress=0xc0+x;

LCD_write_command(address);

}

voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s)//列x=0~15,行y=0,1

{

LCD_set_xy(X,Y);//写地址

while(*s)//写显示字符

{

LCD_write_data(*s);

s++;

}

}

voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedchardata)//列x=0~15,行y=0,1

{

LCD_set_xy(X,Y);//写地址

LCD_write_data(data);

}

#endif

/*--------------------------------------------------------------------

---

延时函数

编译器:

ICC-AVRv6.31A

目标芯片:

M16

时钟:

8.0000Mhz

---------------------------------------------------*/

voiddelay_nus(unsignedintn);

voiddelay_nms(unsignedintn);

voiddelay_1us(void);

voiddelay_1ms(void);

#ifndef__delay_h

#define__delay_h

voiddelay_1us(void)//1us延时函数

{

asm("nop");

}

voiddelay_nus(unsignedintn)//Nus延时函数

{

unsignedinti=0;

for(i=0;i

delay_1us();

}

voiddelay_1ms(void)//1ms延时函数

{

unsignedinti;

for(i=0;i<1140;i++);

}

voiddelay_nms(unsignedintn)//Nms延时函数

{

unsignedinti=0;

for(i=0;i

delay_1ms();

}

#endif

//函数说明

//--------------------------------

unsignedcharget_key(void);

//--------------------------------

#ifndef__key_h

#define__key_h

unsignedcharkey_read(void)

{

unsignedchari;

/*获取列地址*/

DDRB=0xf0;//高4位输出,低4位输入

PORTB=0x0f;//高4位输出0,低4位带上拉输入

delay_nms

(1);

i=PINB&0x0f;

/*获取行地址*/

DDRB=0x0f;//高4位输入,低4位输出

PORTB=0xf0;//低4位输出0,高4位带上拉输入

delay_nms

(1);

i|=PINB&0xf0;

switch(i)

{

case0xff:

return0x00;

case0xee:

return'0';

case0xde:

return'1';

case0xbe:

return'2';

case0x7e:

return'3';

case0xed:

return'4';

case0xdd:

return'5';

case0xbd:

return'6';

case0x7d:

return'7';

case0xeb:

return'8';

case0xdb:

return'9';

case0xbb:

return'A';

case0x7b:

return'B';

case0xe7:

return'C';

case0xd7:

return'D';

case0xb7:

return'E';

case0x77:

return'F';

default:

return0x00;

}

}

unsignedcharget_key(void)

{

unsignedchari;

staticunsignedcharj;//按键记录

i=key_read();

if(i==0x00)//无有效按键按下

{

j=0x00;//清除按键记录

return0x00;//程序退出

}

if(j==0x00)//为新按键

{

j=i;//保存本次结果

delay_nms(10);//延时去抖动

i=key_read();

if(i==j)

returni;

}

return0x00;

}

#endif

#include

#include

#include"1602.h"

#include"key.h"

#include"uart.h"

 

/**************************************************************

*主函数*

**************************************************************/

 

voidmain(void)

{

LCD_init();

init_USART();

ShowMenu();//欢迎界面显示

while

(1)

{

Menu_Change(get_key());

}

}

 

#defineNull0

 

/***********************

*函数声明*

***********************/

voidShowMenu(void);

voidMenu_Change(unsignedcharKeyNum);

/***********************

*按键功能键宏定义*

***********************/

#defineUP'3'

#defineDown'7'

#defineEsc'B'

#defineEnter'F'

#defineReset'0'

 

/**********************

*目录结构体定义*

**********************/

structMenuItem

{

unsignedcharMenuCount;//当前层节点数

unsignedchar*DisplayString;//菜单标题

void(*Subs)();//节点函数

structMenuItem*ChildrenMenus;//子节点

structMenuItem*ParentMenus;//父节点

};

/***********************

*调用子函数区*

***********************/

voidNullSubs(void)

{

}

//----------------------以下为例子,请根据实际情况修改---------------------------

voidTimeSet(void)

{

put_s("TimeSet");

}

voidDateSet(void)

{

put_s("DateSet");

}

voidAlertSet(void)

{

put_s("AlertSet");

}

//------------------------------------------------------------------------------

 

/***********************

*结构体区*

***********************/

//----------------------以下为例子,请根据实际情况修改---------------------------

structMenuItemTimeMenu[4];

structMenuItemFlashMenu[5];

structMenuItemVoiceMenu[5];

structMenuItemRobotMenu[5];

structMenuItemMainMenu[5];

structMenuItemTimeMenu[4]=

{//MenuCountDisplayStringSubsChildrenMenusParentMenus

{4,"1.TimeSet",TimeSet,Null,MainMenu},

{4,"2.DateSet",DateSet,Null,MainMenu},

{4,"3.AlertSet",AlertSet,Null,MainMenu},

{4,"4.Back",NullSubs,MainMenu,MainMenu},

};

structMenuItemFlashMenu[5]=

{//MenuCountDisplayStringSubsChildrenMenusParentMenus

{5,"1.FlashRecord",NullSubs,Null,MainMenu},

{5,"2.Play",NullSubs,Null,MainMenu},

{5,"3.Pause",NullSubs,Null,MainMenu},

{5,"4.FlashDelete",NullSubs,Null,MainMenu},

{5,"5.Back",NullSubs,MainMenu,MainMenu},

};

structMenuItemVoiceMenu[5]=

{//MenuCountDisplayStringSubsChildrenMenusParentMenus

{5,"1.VoiceRecord",NullSubs,Null,MainMenu},

{5,"2.Play",NullSubs,Null,MainMenu},

{5,"3.Pause",NullSubs,Null,MainMenu},

{5,"4.VoiceDelete",NullSubs,Null,MainMenu},

{5,"5.Back",NullSubs,MainMenu,MainMenu},

};

structMenuItemRobotMenu[5]=

{//MenuCountDisplayStringSubsChildrenMenusParentMenus

{5,"1.TurnLeft",NullSubs,Null,MainMenu},

{5,"2.TurnRight",NullSubs,Null,MainMenu},

{5,"3.GoAhead",NullSubs,Null,MainMenu},

{5,"4.GoBack",NullSubs,Null,MainMenu},

{5,"5.Back",NullSubs,MainMenu,MainMenu},

};

 

structMenuItemMainMenu[5]=

{//MenuCountDisplayStringSubsChildrenMenusParentMenus

{5,"1.TimeSet",NullSubs,TimeMenu,Null},

{5,"2.VoiceCenter",NullSubs,VoiceMenu,Null},

{5,"3.RobotControl",NullSubs,RobotMenu,Null},

{5,"4.FlashOption",NullSubs,FlashMenu,Null},

{5,"5.Back",NullSubs,MainMenu,MainMenu},

};

//------------------------------------------------------------------------------

 

/***********************

*全局变量声明区*

***********************/

structMenuItem(*MenuPoint)=MainMenu;//结构体指针,指向结构体后由内部函数指针指向功能函数

unsignedcharDisplayStart=0;//显示时的第一个菜单项

unsignedcharUserChoose=0;//用户所选菜单项

unsignedcharDisplayPoint=0;//显示指针

unsignedMaxItems;//同级最大菜单数

unsignedcharShowCount=2;//同屏显示菜单数

 

/***********************

*显示函数区*

***********************/

voidShowMenu(void)

{

unsignedcharn;

MaxItems=MenuPoint[0].MenuCount;//定义最大同级菜单

DisplayPoint=DisplayStart;

for(n=0;DisplayPoint

{if(DisplayPoint==UserChoose)

LCD_write_string(0,n,"->");

LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);

}

}

voidMenu_Change(unsignedcharKeyNum)

{

if(KeyNum)

{

switch(KeyNum)

{

caseUP:

UserChoose--;

if(UserChoose==255)

{

UserChoose=0;//上翻截至,如果要回滚赋值MaxItems-1

}

break;

caseEsc:

if(MenuPoint[UserChoose].ParentMenus!

=Null)

{

MenuPoint=MenuPoint[UserChoose].ParentMenus;

UserChoose=0;

DisplayStart=0;

}

break;

caseDown:

UserChoose++;

if(UserChoose==MaxItems)

{

UserChoose=MaxItems-1;//下翻截至,如要回滚赋值为0

}

break;

caseEnter:

if(MenuPoint[UserChoose].Subs!

=NullSubs)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2