王健带你征服avr单片机仿真第一课Word格式.docx
- 文档编号:7824389
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:19
- 大小:50.75KB
王健带你征服avr单片机仿真第一课Word格式.docx
《王健带你征服avr单片机仿真第一课Word格式.docx》由会员分享,可在线阅读,更多相关《王健带你征服avr单片机仿真第一课Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
#defineLCD_EN(1<
PA3)//0x08portA3out
#defineLCD_DATA((1<
PA4)|(1<
PA5)|(1<
PA6)|(1<
PA7))//0xf0portA4/5/6/7out
/*--------------------------------------------------------------------------------------------------
函数说明
--------------------------------------------------------------------------------------------------*/
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);
//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;
//写高四位
command=command<
4;
//低四位移到高四位
=0x0f;
//写低四位
voidLCD_write_data(unsignedchardata)//写数据
LCD_RS_PORT|=LCD_RS;
//RS=1
LCD_DATA_PORT|=data&
data=data<
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_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<
n;
i++)
delay_1us();
voiddelay_1ms(void)//1ms延时函数
unsignedinti;
1140;
i++);
voiddelay_nms(unsignedintn)//Nms延时函数
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位带上拉输入
i|=PINB&
switch(i)
case0xff:
return0x00;
case0xee:
return'
0'
;
case0xde:
1'
case0xbe:
2'
case0x7e:
3'
case0xed:
4'
case0xdd:
5'
case0xbd:
6'
case0x7d:
7'
case0xeb:
8'
case0xdb:
9'
case0xbb:
A'
case0x7b:
B'
case0xe7:
C'
case0xd7:
D'
case0xb7:
E'
case0x77:
F'
default:
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<
iom16v.h>
macros.h>
1602.h"
key.h"
uart.h"
/**************************************************************
*主函数*
**************************************************************/
voidmain(void)
{
init_USART();
ShowMenu();
//欢迎界面显示
while
(1)
Menu_Change(get_key());
#defineNull0
/***********************
*函数声明*
***********************/
voidShowMenu(void);
voidMenu_Change(unsignedcharKeyNum);
*按键功能键宏定义*
#defineUP'
#defineDown'
#defineEsc'
#defineEnter'
#defineReset'
/**********************
*目录结构体定义*
**********************/
structMenuItem
unsignedcharMenuCount;
//当前层节点数
unsignedchar*DisplayString;
//菜单标题
void(*Subs)();
//节点函数
structMenuItem*ChildrenMenus;
//子节点
structMenuItem*ParentMenus;
//父节点
};
*调用子函数区*
voidNullSubs(void)
//----------------------以下为例子,请根据实际情况修改---------------------------
voidTimeSet(void)
put_s("
TimeSet"
voidDateSet(void)
put_s("
DateSet"
voidAlertSet(void)
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},
3.AlertSet"
AlertSet,Null,MainMenu},
4.Back"
NullSubs,MainMenu,MainMenu},
structMenuItemFlashMenu[5]=
{5,"
1.FlashRecord"
NullSubs,Null,MainMenu},
{5,"
2.Play"
NullSubs,Null,MainMenu},
3.Pause"
4.FlashDelete"
5.Back"
structMenuItemVoiceMenu[5]=
1.VoiceRecord"
NullSubs,Null,MainMenu},
NullSubs,Null,MainMenu},
4.VoiceDelete"
{5,"
structMenuItemRobotMenu[5]=
1.TurnLeft"
2.TurnRight"
3.GoAhead"
4.GoBack"
structMenuItemMainMenu[5]=
NullSubs,TimeMenu,Null},
2.VoiceCenter"
NullSubs,VoiceMenu,Null},
3.RobotControl"
NullSubs,RobotMenu,Null},
4.FlashOption"
NullSubs,FlashMenu,Null},
*全局变量声明区*
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<
MaxItems&
&
n<
ShowCount;
n++)
{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;
DisplayStart=0;
caseDown:
UserChoose++;
if(UserChoose==MaxItems)
UserChoose=MaxItems-1;
//下翻截至,如要回滚赋值为0
caseEnter:
if(MenuPoint[UserChoose].Subs!
=NullSubs)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 王健带 征服 avr 单片机 仿真 第一