📄 main.lst
字号:
020D C068 RJMP 0x0276
020E 3D4D CPI R20,0xDD
020F E0E0 LDI R30,0
0210 075E CPC R21,R30
0211 F409 BNE 0x0213
0212 C05B RJMP 0x026E
0213 3D4E CPI R20,0xDE
0214 E0E0 LDI R30,0
0215 075E CPC R21,R30
0216 F409 BNE 0x0218
0217 C04E RJMP 0x0266
0218 ED8E LDI R24,0xDE
0219 E090 LDI R25,0
021A 1784 CP R24,R20
021B 0795 CPC R25,R21
021C F164 BLT 0x0249
021D 3747 CPI R20,0x77
021E E0E0 LDI R30,0
021F 075E CPC R21,R30
0220 F409 BNE 0x0222
0221 C060 RJMP 0x0282
0222 374B CPI R20,0x7B
0223 E0E0 LDI R30,0
0224 075E CPC R21,R30
0225 F409 BNE 0x0227
0226 C053 RJMP 0x027A
0227 374D CPI R20,0x7D
0228 E0E0 LDI R30,0
0229 075E CPC R21,R30
022A F409 BNE 0x022C
022B C046 RJMP 0x0272
022C 374E CPI R20,0x7E
022D E0E0 LDI R30,0
022E 075E CPC R21,R30
022F F409 BNE 0x0231
0230 C039 RJMP 0x026A
0231 3747 CPI R20,0x77
0232 E0E0 LDI R30,0
0233 075E CPC R21,R30
0234 F40C BGE 0x0236
0235 C04E RJMP 0x0284
0236 3B47 CPI R20,0xB7
0237 E0E0 LDI R30,0
0238 075E CPC R21,R30
0239 F409 BNE 0x023B
023A C045 RJMP 0x0280
023B 3B4B CPI R20,0xBB
023C E0E0 LDI R30,0
023D 075E CPC R21,R30
023E F409 BNE 0x0240
023F C038 RJMP 0x0278
0240 3B4D CPI R20,0xBD
0241 E0E0 LDI R30,0
0242 075E CPC R21,R30
0243 F161 BEQ 0x0270
0244 3B4E CPI R20,0xBE
0245 E0E0 LDI R30,0
0246 075E CPC R21,R30
0247 F101 BEQ 0x0268
0248 C03B RJMP 0x0284
0249 3E47 CPI R20,0xE7
024A E0E0 LDI R30,0
024B 075E CPC R21,R30
024C F179 BEQ 0x027C
024D 3E4B CPI R20,0xEB
024E E0E0 LDI R30,0
024F 075E CPC R21,R30
0250 F119 BEQ 0x0274
0251 3E4D CPI R20,0xED
0252 E0E0 LDI R30,0
0253 075E CPC R21,R30
0254 F0B9 BEQ 0x026C
0255 3E4E CPI R20,0xEE
0256 E0E0 LDI R30,0
0257 075E CPC R21,R30
0258 F059 BEQ 0x0264
0259 3E47 CPI R20,0xE7
025A E0E0 LDI R30,0
025B 075E CPC R21,R30
025C F13C BLT 0x0284
025D 3F4F CPI R20,0xFF
025E E0E0 LDI R30,0
025F 075E CPC R21,R30
0260 F009 BEQ 0x0262
0261 C022 RJMP 0x0284
(0027) {
(0028) case 0xff:return 0x00;
0262 2700 CLR R16
0263 C021 RJMP 0x0285
(0029) case 0xee:return '0';
0264 E300 LDI R16,0x30
0265 C01F RJMP 0x0285
(0030) case 0xde:return '1';
0266 E301 LDI R16,0x31
0267 C01D RJMP 0x0285
(0031) case 0xbe:return '2';
0268 E302 LDI R16,0x32
0269 C01B RJMP 0x0285
(0032) case 0x7e:return '3';
026A E303 LDI R16,0x33
026B C019 RJMP 0x0285
(0033) case 0xed:return '4';
026C E304 LDI R16,0x34
026D C017 RJMP 0x0285
(0034) case 0xdd:return '5';
026E E305 LDI R16,0x35
026F C015 RJMP 0x0285
(0035) case 0xbd:return '6';
0270 E306 LDI R16,0x36
0271 C013 RJMP 0x0285
(0036) case 0x7d:return '7';
0272 E307 LDI R16,0x37
0273 C011 RJMP 0x0285
(0037) case 0xeb:return '8';
0274 E308 LDI R16,0x38
0275 C00F RJMP 0x0285
(0038) case 0xdb:return '9';
0276 E309 LDI R16,0x39
0277 C00D RJMP 0x0285
(0039) case 0xbb:return 'A';
0278 E401 LDI R16,0x41
0279 C00B RJMP 0x0285
(0040) case 0x7b:return 'B';
027A E402 LDI R16,0x42
027B C009 RJMP 0x0285
(0041) case 0xe7:return 'C';
027C E403 LDI R16,0x43
027D C007 RJMP 0x0285
(0042) case 0xd7:return 'D';
027E E404 LDI R16,0x44
027F C005 RJMP 0x0285
(0043) case 0xb7:return 'E';
0280 E405 LDI R16,0x45
0281 C003 RJMP 0x0285
(0044) case 0x77:return 'F';
0282 E406 LDI R16,0x46
0283 C001 RJMP 0x0285
(0045) default:return 0x00;
0284 2700 CLR R16
0285 940E0460 CALL pop_gset1
0287 9508 RET
_get_key:
i --> R20
0288 940E045D CALL push_gset1
(0046) }
(0047) }
(0048)
(0049) unsigned char get_key(void)
(0050) {
(0051) unsigned char i;
(0052) static unsigned char j;//按键记录
(0053)
(0054) i=key_read();
028A DF63 RCALL _key_read
028B 2F40 MOV R20,R16
(0055) if(i==0x00) //无有效按键按下
028C 2300 TST R16
028D F429 BNE 0x0293
(0056) {
(0057) j=0x00; //清除按键记录
028E 2422 CLR R2
028F 92200230 STS j,R2
(0058) return 0x00; //程序退出
0291 2700 CLR R16
0292 C011 RJMP 0x02A4
(0059) }
(0060) if(j==0x00) //为新按键
0293 90200230 LDS R2,j
0295 2022 TST R2
0296 F461 BNE 0x02A3
(0061) {
(0062) j=i; //保存本次结果
0297 93400230 STS j,R20
(0063) delay_nms(10); //延时去抖动
0299 E00A LDI R16,0xA
029A E010 LDI R17,0
029B DEB6 RCALL _delay_nms
(0064) i=key_read();
029C DF51 RCALL _key_read
029D 2F40 MOV R20,R16
(0065) if(i==j)
029E 90200230 LDS R2,j
02A0 1502 CP R16,R2
02A1 F409 BNE 0x02A3
(0066) return i;
02A2 C001 RJMP 0x02A4
(0067) }
(0068) return 0x00;
02A3 2700 CLR R16
02A4 940E0460 CALL pop_gset1
02A6 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\uart.h
(0001)
(0002)
(0003) #define BAUDRATE 9600 //波特率
(0004) #define F_CPU 8000000
(0005)
(0006) void init_USART(void);
(0007) void put_c(unsigned char c);
(0008) void put_s(unsigned char *ptr);
(0009) unsigned char get_c(void);
(0010) #ifndef __uart_h
(0011) #define __uart_h
(0012) void put_c(unsigned char c)
(0013) {
(0014) while( !(UCSRA & (1<<UDRE)) );
_put_c:
c --> R16
02A7 9B5D SBIS 0x0B,5
02A8 CFFE RJMP _put_c
(0015) UDR=c;
02A9 B90C OUT 0x0C,R16
02AA 9508 RET
_put_s:
ptr --> R20
02AB 940E045D CALL push_gset1
02AD 01A8 MOVW R20,R16
(0016) }
(0017)
(0018) void put_s(unsigned char *ptr)
(0019) {
02AE C004 RJMP 0x02B3
(0020) while (*ptr)
(0021) {
(0022) put_c(*ptr++);
02AF 01FA MOVW R30,R20
02B0 9101 LD R16,Z+
02B1 01AF MOVW R20,R30
02B2 DFF4 RCALL _put_c
02B3 01FA MOVW R30,R20
02B4 8020 LDD R2,Z+0
02B5 2022 TST R2
02B6 F7C1 BNE 0x02AF
(0023) }
(0024) put_c(0x0D); //换行
02B7 E00D LDI R16,0xD
02B8 DFEE RCALL _put_c
(0025) put_c(0x0A); //回车
02B9 E00A LDI R16,0xA
02BA DFEC RCALL _put_c
02BB 940E0460 CALL pop_gset1
02BD 9508 RET
(0026) }
(0027)
(0028) unsigned char get_c(void)
(0029) { while(!(UCSRA&(1<<RXC)));
_get_c:
02BE 9B5F SBIS 0x0B,7
02BF CFFE RJMP _get_c
(0030) return UDR;
02C0 B10C IN R16,0x0C
02C1 9508 RET
(0031) }
(0032)
(0033) void init_USART(void)//USART 初始化
(0034) {
(0035)
(0036) //USART 9600 8, n,1 超级终端等也要设成同样的设置才能通讯
(0037) UCSRC = (1<<URSEL) | 0x06;
_init_USART:
02C2 E886 LDI R24,0x86
02C3 BD80 OUT 0x20,R24
(0038) //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0039) UBRRL= (F_CPU/BAUDRATE/16-1)%256;
02C4 E383 LDI R24,0x33
02C5 B989 OUT 0x09,R24
(0040) UBRRH= (F_CPU/BAUDRATE/16-1)/256;
02C6 2422 CLR R2
02C7 BC20 OUT 0x20,R2
(0041) UCSRA = 0x00;
02C8 B82B OUT 0x0B,R2
(0042) UCSRB = (1<<RXEN)|(1<<TXEN); //使能接收,使能发送
02C9 E188 LDI R24,0x18
02CA B98A OUT 0x0A,R24
02CB 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602.h"
(0004) #include "key.h"
(0005) #include "uart.h"
(0006)
(0007)
(0008)
(0009)
(0010) /**************************************************************
(0011) * 主函数 *
(0012) **************************************************************/
(0013)
(0014)
(0015) void main(void)
(0016) {
(0017) LCD_init();
_main:
02CC DE94 RCALL _LCD_init
(0018) init_USART();
02CD DFF4 RCALL _init_USART
(0019) ShowMenu(); //欢迎界面显示
02CE 940E02E7 CALL _ShowMenu
02D0 C004 RJMP 0x02D5
(0020) while(1)
(0021) {
(0022) Menu_Change(get_key());
02D1 DFB6 RCALL _get_key
02D2 2711 CLR R17
02D3 940E033A CALL _Menu_Change
02D5 CFFB RJMP 0x02D1
02D6 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\menu.c
(0001)
(0002)
(0003) #define Null 0
(0004)
(0005)
(0006) /***********************
(0007) * 函数声明 *
(0008) ***********************/
(0009) void ShowMenu(void);
(0010) void Menu_Change(unsigned char KeyNum);
(0011)
(0012) /***********************
(0013) * 按键功能键宏定义 *
(0014) ***********************/
(0015) #define UP '3'
(0016) #define Down '7'
(0017) #define Esc 'B'
(0018) #define Enter 'F'
(0019) #define Reset '0'
(0020)
(0021)
(0022) /**********************
(0023) * 目录结构体定义 *
(0024) **********************/
(0025) struct MenuItem
(0026) {
(0027) unsigned char MenuCount; //当前层节点数
(0028) unsigned char *DisplayString; //菜单标题
(0029) void (*Subs)(); //节点函数
(0030) struct MenuItem *ChildrenMenus; //子节点
(0031) struct MenuItem *ParentMenus; //父节点
(0032) };
(0033)
(0034) /***********************
(0035) * 调用子函数区 *
(0036) ***********************/
(0037) void NullSubs(void)
(0038) {
_NullSubs:
02D7 9508 RET
(0039) }
(0040) //----------------------以下为例子,请根据实际情况修改---------------------------
(0041)
(0042) void TimeSet(void)
(0043) {
(0044) put_s("TimeSet");
_TimeSet:
02D8 E208 LDI R16,0x28
02D9 E012 LDI R17,2
02DA 940E02AB CALL _put_s
02DC 9508 RET
(0045) }
(0046)
(0047) void DateSet(void)
(0048) {
(0049) put_s("DateSet");
_DateSet:
02DD E200 LDI R16,0x20
02DE E012 LDI R17,2
02DF 940E02AB CALL _put_s
02E1 9508 RET
(0050) }
(0051)
(0052) void AlertSet (void)
(0053) {
(0054) put_s("AlertSet");
_AlertSet:
02E2 E107 LDI R16,0x17
02E3 E012 LDI R17,2
02E4 940E02AB CALL _put_s
02E6 9508 RET
_ShowMenu:
n --> R20
02E7 940E045D CALL push_gset1
02E9 9722 SBIW R28,2
(0055) }
(0056) //------------------------------------------------------------------------------
(0057)
(0058)
(0059)
(0060)
(0061)
(0062)
(0063) /***********************
(0064) * 结构体区 *
(0065) ***********************/
(0066) //----------------------以下为例子,请根据实际情况修改---------------------------
(0067) struct MenuItem TimeMenu[4];
(0068) struct MenuItem FlashMenu[5];
(0069) struct MenuItem VoiceMenu[5];
(0070) struct MenuItem RobotMenu[5];
(0071) struct MenuItem MainMenu[5];
(0072)
(0073) struct MenuItem TimeMenu[4]=
(0074) { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
(0075) {4, "1.Time Set", TimeSet, Null, MainMenu},
(0076) {4, "2.Date Set", DateSet, Null, MainMenu},
(0077) {4, "3.AlertSet", AlertSet, Null, MainMenu},
(0078) {4, "4.Back", NullSubs, MainMenu, MainMenu},
(0079) };
(0080)
(0081) struct MenuItem FlashMenu[5]=
(0082) { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
(0083) {5, "1.Flash Record", NullSubs, Null, MainMenu},
(0084) {5, "2.Play", NullSubs, Null, MainMenu},
(0085) {5, "3.Pause", NullSubs, Null, MainMenu},
(0086) {5, "4.Flash Delete", NullSubs, Null, MainMenu},
(0087) {5, "5.Back", NullSubs, MainMenu, MainMenu},
(0088) };
(0089)
(0090) struct MenuItem VoiceMenu[5]=
(0091) { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
(0092) {5, "1.Voice Record" , NullSubs, Null, MainMenu},
(0093) {5, "2.Play", NullSubs, Null, MainMenu},
(0094) {5, "3.Pause", NullSubs, Null, MainMenu},
(0095) {5, "4.Voice Delete", NullSubs, Null, MainMenu},
(0096) {5, "5.Back", NullSubs, MainMenu, MainMenu},
(0097) };
(0098)
(0099) struct MenuItem RobotMenu[5]=
(0100) { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
(0101) {5, "1.Turn Left", NullSubs, Null, MainMenu},
(0102) {5, "2.Turn Right", NullSubs, Null, MainMenu},
(0103) {5, "3.Go Ahead", NullSubs, Null, MainMenu},
(0104) {5, "4.Go Back", NullSubs, Null, MainMenu},
(0105) {5, "5.Back", NullSubs, MainMenu, MainMenu},
(0106) };
(0107)
(0108)
(0109) struct MenuItem MainMenu[5]=
(0110) { //MenuCount DisplayString Subs ChildrenMenus ParentMenus
(0111) {5, "1.Time Set" , NullSubs, TimeMenu, Null},
(0112) {5, "2.Voice Center", NullSubs, VoiceMenu, Null},
(0113) {5, "3.Robot Control", NullSubs, RobotMenu, Null},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -