王健带你征服avr单片机仿真第一课.docx
- 文档编号:6016892
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:19
- 大小:50.75KB
王健带你征服avr单片机仿真第一课.docx
《王健带你征服avr单片机仿真第一课.docx》由会员分享,可在线阅读,更多相关《王健带你征服avr单片机仿真第一课.docx(19页珍藏版)》请在冰点文库上搜索。
王健带你征服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) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 王健带 征服 avr 单片机 仿真 第一