⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd5110.lst

📁 meg16 的所有功能实例
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0207 E5CF      LDI	R28,0x5F
    0208 E0D4      LDI	R29,4
    0209 BFCD      OUT	0x3D,R28
    020A BFDE      OUT	0x3E,R29
    020B 51C0      SUBI	R28,0x10
    020C 40D0      SBCI	R29,0
    020D EA0A      LDI	R16,0xAA
    020E 8308      STD	Y+0,R16
    020F 2400      CLR	R0
    0210 E4E9      LDI	R30,0x49
    0211 E0F1      LDI	R31,1
    0212 E011      LDI	R17,1
    0213 36E8      CPI	R30,0x68
    0214 07F1      CPC	R31,R17
    0215 F011      BEQ	0x0218
    0216 9201      ST	R0,Z+
    0217 CFFB      RJMP	0x0213
    0218 8300      STD	Z+0,R16
    0219 E2E4      LDI	R30,0x24
    021A E0F3      LDI	R31,3
    021B E6A0      LDI	R26,0x60
    021C E0B0      LDI	R27,0
    021D E014      LDI	R17,4
    021E 30ED      CPI	R30,0xD
    021F 07F1      CPC	R31,R17
    0220 F021      BEQ	0x0225
    0221 95C8      LPM
    0222 9631      ADIW	R30,1
    0223 920D      ST	R0,X+
    0224 CFF9      RJMP	0x021E
    0225 940E0243  CALL	_main
_exit:
    0227 CFFF      RJMP	_exit
FILE: E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16程序包\完成整理\LCD5110-华容道游戏\main.c
(0001) #include <iom16v.h>
(0002) #include <MACROS.h>
(0003) #include "Define.h"
(0004) #include "5110.h"
(0005) 
(0006) //=======================================================================
(0007) //=======================================================================
(0008) //按键I/O口定义
(0009) #define key_ddr      DDRA
(0010) #define key_port     PORTA
(0011) #define key_pin      PINA
(0012) 
(0013) //=======================================================================
(0014) //按键键值定义
(0015) #define all_key      0xF8 
(0016) 
(0017) #define Up	     0x78      //7		          
(0018) #define Right	 0xB8      //6        
(0019) #define Enter    0xD8      //5
(0020) #define Left	 0xE8      //4
(0021) #define Down	 0xF0      //3
(0022) extern const uint8 font6x8[][6];  //LCD字符显示码表声明
(0023) 
(0024) uint8 key_state;   //按键状态
(0025) uint8 key_value;   //按键返回值
(0026) uint8 key_last_value;		   //上次按键返回值
(0027) uint8 key_one;				   //处理按键后是否完成一次显示
(0028) 
(0029) uint8 X;	  //鼠标X轴
(0030) uint8 Y;	  //鼠标Y轴
(0031) 
(0032) uint16 NUM_BEST;           //最好步数
(0033) uint16 NUM_YOUR;           //走的步数
(0034) 
(0035) uint8 guanshu;			   //第几局
(0036) uint8 disp_buffer[5][4];   //显示缓存区
(0037) 
(0038) 
(0039) uint8 disp1_buffer[5][4]={ //第一局开局棋子布局
(0040) {0x11,0x41,0x41,0x13},
(0041) {0x12,0x41,0x41,0x14},
(0042) {0x21,0x31,0x31,0x24},
(0043) {0x21,0x22,0x23,0x24},
(0044) {0x00,0x22,0x23,0x00},
(0045) };
(0046) uint8 disp2_buffer[5][4]={ //第二局开局棋子布局
(0047) {0x11,0x41,0x41,0x13},
(0048) {0x12,0x41,0x41,0x14},
(0049) {0x31,0x31,0x32,0x32},
(0050) {0x33,0x33,0x34,0x34},
(0051) {0x00,0x35,0x35,0x00},
(0052) };
(0053) 
(0054) 
(0055) //=======================================================================  
(0056) //延时函数
(0057) void Delay_us(uint16 time) 
(0058) 	{while (time--)
_Delay_us:
  time                 --> R16
    0228 C001      RJMP	0x022A
(0059) 	 _WDR();
    0229 95A8      WDR
    022A 0118      MOVW	R2,R16
    022B 5001      SUBI	R16,1
    022C 4010      SBCI	R17,0
    022D 2022      TST	R2
    022E F7D1      BNE	0x0229
    022F 2033      TST	R3
    0230 F7C1      BNE	0x0229
    0231 9508      RET
_Delay_ms:
  time                 --> R20
    0232 940E12A7  CALL	push_gset1
    0234 01A8      MOVW	R20,R16
(0060) 	
(0061) 	}
(0062) void Delay_ms(uint16 time) 
(0063) 	{while (time--)
    0235 C003      RJMP	0x0239
(0064) 	 Delay_us(1200);
    0236 EB00      LDI	R16,0xB0
    0237 E014      LDI	R17,4
    0238 DFEF      RCALL	_Delay_us
    0239 011A      MOVW	R2,R20
    023A 5041      SUBI	R20,1
    023B 4050      SBCI	R21,0
    023C 2022      TST	R2
    023D F7C1      BNE	0x0236
    023E 2033      TST	R3
    023F F7B1      BNE	0x0236
    0240 940E12AA  CALL	pop_gset1
    0242 9508      RET
_main:
  i                    --> R20
  j                    --> R22
    0243 9726      SBIW	R28,6
(0065) 	}
(0066) 
(0067) 
(0068) //=======================================================================  
(0069) //主函数
(0070) void main(void)
(0071) {
(0072)  uint8 i,j;
(0073)  guanshu=1;
    0244 E081      LDI	R24,1
    0245 9380015D  STS	guanshu,R24
(0074)  NUM_BEST=100;
    0247 E684      LDI	R24,0x64
    0248 E090      LDI	R25,0
    0249 93900161  STS	NUM_BEST+1,R25
    024B 93800160  STS	NUM_BEST,R24
(0075) 
(0076)  SETBIT(DDRC,BACKLED_EN);   			//配置背光控制端口										
    024D 9AA7      SBI	0x14,7
(0077)  CLEARBIT(PORTC,BACKLED_EN);			//使能背光
    024E 98AF      CBI	0x15,7
(0078) 	
(0079)  LCD_init();          //初始化LCD模块
    024F 940E10BF  CALL	_LCD_init
    0251 C148      RJMP	0x039A
(0080) 
(0081)  while(1)			  //总循环
(0082)  {
(0083)  LCD_clear();		  //清屏
    0252 940E10DC  CALL	_LCD_clear
(0084) 
(0085)  //显示数据界面
(0086)  LCD_write_String(34,0,8,"YOUR:000",0);
    0254 2422      CLR	R2
    0255 2433      CLR	R3
    0256 823D      STD	Y+5,R3
    0257 822C      STD	Y+4,R2
    0258 E480      LDI	R24,0x40
    0259 E091      LDI	R25,1
    025A 839B      STD	Y+3,R25
    025B 838A      STD	Y+2,R24
    025C E088      LDI	R24,0x8
    025D E090      LDI	R25,0
    025E 8399      STD	Y+1,R25
    025F 8388      STD	Y+0,R24
    0260 2722      CLR	R18
    0261 2733      CLR	R19
    0262 E202      LDI	R16,0x22
    0263 E010      LDI	R17,0
    0264 940E113C  CALL	_LCD_write_String
(0087)  LCD_write_String(34,1,8,"BEST:000",0);
    0266 2422      CLR	R2
    0267 2433      CLR	R3
    0268 823D      STD	Y+5,R3
    0269 822C      STD	Y+4,R2
    026A E387      LDI	R24,0x37
    026B E091      LDI	R25,1
    026C 839B      STD	Y+3,R25
    026D 838A      STD	Y+2,R24
    026E E088      LDI	R24,0x8
    026F E090      LDI	R25,0
    0270 8399      STD	Y+1,R25
    0271 8388      STD	Y+0,R24
    0272 E021      LDI	R18,1
    0273 E030      LDI	R19,0
    0274 E202      LDI	R16,0x22
    0275 E010      LDI	R17,0
    0276 940E113C  CALL	_LCD_write_String
(0088)  LCD_write_String(34,3,8,"GUAN:001",0);
    0278 2422      CLR	R2
    0279 2433      CLR	R3
    027A 823D      STD	Y+5,R3
    027B 822C      STD	Y+4,R2
    027C E28E      LDI	R24,0x2E
    027D E091      LDI	R25,1
    027E 839B      STD	Y+3,R25
    027F 838A      STD	Y+2,R24
    0280 E088      LDI	R24,0x8
    0281 E090      LDI	R25,0
    0282 8399      STD	Y+1,R25
    0283 8388      STD	Y+0,R24
    0284 E023      LDI	R18,3
    0285 E030      LDI	R19,0
    0286 E202      LDI	R16,0x22
    0287 E010      LDI	R17,0
    0288 940E113C  CALL	_LCD_write_String
(0089)  
(0090)  NUMdisp_task(NUM_BEST,1);			   //显示最好成绩
    028A E021      LDI	R18,1
    028B E030      LDI	R19,0
    028C 91000160  LDS	R16,NUM_BEST
    028E 91100161  LDS	R17,NUM_BEST+1
    0290 940E1060  CALL	_NUMdisp_task
(0091)  NUMdisp_task(guanshu,3);			   //显示第几关
    0292 E023      LDI	R18,3
    0293 E030      LDI	R19,0
    0294 9100015D  LDS	R16,guanshu
    0296 2711      CLR	R17
    0297 940E1060  CALL	_NUMdisp_task
(0092)  
(0093)  //一切变量都重新初始化
(0094)  key_init();
    0299 D103      RCALL	_key_init
(0095)  key_state=0;
    029A 2422      CLR	R2
    029B 92200167  STS	key_state,R2
(0096)  key_value=0;
    029D 92200166  STS	key_value,R2
(0097)  key_last_value=0;
    029F 92200165  STS	key_last_value,R2
(0098)  key_one=1;
    02A1 E081      LDI	R24,1
    02A2 93800164  STS	key_one,R24
(0099)  X=0;
    02A4 92200163  STS	X,R2
(0100)  Y=0;
    02A6 92200162  STS	Y,R2
(0101)  NUM_YOUR=0;
    02A8 2433      CLR	R3
    02A9 9230015F  STS	NUM_YOUR+1,R3
    02AB 9220015E  STS	NUM_YOUR,R2
(0102)  SEI();                       //全局中断使能
    02AD 9478      BSET	7
    02AE C020      RJMP	0x02CF
(0103)  while(1)					  //选关
(0104)  {
(0105)   
(0106)   if(key_value==Down)
    02AF 91800166  LDS	R24,key_value
    02B1 3F80      CPI	R24,0xF0
    02B2 F4A1      BNE	0x02C7
(0107)     {
(0108) 	 key_value=0;
    02B3 2422      CLR	R2
    02B4 92200166  STS	key_value,R2
(0109) 	 guanshu++;
    02B6 9180015D  LDS	R24,guanshu
    02B8 5F8F      SUBI	R24,0xFF
    02B9 9380015D  STS	guanshu,R24
(0110) 	 if(guanshu==3)
    02BB 3083      CPI	R24,3
    02BC F419      BNE	0x02C0
(0111) 	    guanshu=1;
    02BD E081      LDI	R24,1
    02BE 9380015D  STS	guanshu,R24
(0112) 	 NUMdisp_task(guanshu,3);
    02C0 E023      LDI	R18,3
    02C1 E030      LDI	R19,0
    02C2 9100015D  LDS	R16,guanshu
    02C4 2711      CLR	R17
    02C5 940E1060  CALL	_NUMdisp_task
(0113) 	}
(0114)   if(key_value==Enter)		 //按确定选关完成
    02C7 91800166  LDS	R24,key_value
    02C9 3D88      CPI	R24,0xD8
    02CA F421      BNE	0x02CF
(0115)     {
(0116) 	 key_value=0;
    02CB 2422      CLR	R2
    02CC 92200166  STS	key_value,R2
(0117)      break;
    02CE C001      RJMP	0x02D0
    02CF CFDF      RJMP	0x02AF
(0118) 	}
(0119)  }
(0120) 
(0121)  //将选择的局载入显示缓存区
(0122)  if(guanshu==1)
    02D0 9180015D  LDS	R24,guanshu
    02D2 3081      CPI	R24,1
    02D3 F509      BNE	0x02F5
(0123)  {
(0124)  for(i=0;i<5;i++)
    02D4 2744      CLR	R20
    02D5 C01C      RJMP	0x02F2
(0125)  for(j=0;j<4;j++)
    02D6 2766      CLR	R22
    02D7 C017      RJMP	0x02EF
(0126)     {
(0127) 	disp_buffer[i][j]=disp1_buffer[i][j];
    02D8 E084      LDI	R24,4
    02D9 9F84      MUL	R24,R20
    02DA EF80      LDI	R24,0xF0
    02DB E090      LDI	R25,0
    02DC 0110      MOVW	R2,R0
    02DD 0E28      ADD	R2,R24
    02DE 1E39      ADC	R3,R25
    02DF 2FE6      MOV	R30,R22
    02E0 27FF      CLR	R31
    02E1 0DE2      ADD	R30,R2
    02E2 1DF3      ADC	R31,R3
    02E3 8020      LDD	R2,Z+0
    02E4 E489      LDI	R24,0x49
    02E5 E091      LDI	R25,1
    02E6 0120      MOVW	R4,R0
    02E7 0E48      ADD	R4,R24
    02E8 1E59      ADC	R5,R25
    02E9 2FE6      MOV	R30,R22
    02EA 27FF      CLR	R31
    02EB 0DE4      ADD	R30,R4
    02EC 1DF5      ADC	R31,R5
    02ED 8220      STD	Z+0,R2
    02EE 9563      INC	R22
    02EF 3064      CPI	R22,4
    02F0 F338      BCS	0x02D8
    02F1 9543      INC	R20
    02F2 3045      CPI	R20,5
    02F3 F310      BCS	0x02D6
(0128) 	}
(0129)  }
    02F4 C020      RJMP	0x0315
(0130)  else
(0131)  {
(0132)  for(i=0;i<5;i++)
    02F5 2744      CLR	R20
    02F6 C01C      RJMP	0x0313
(0133)  for(j=0;j<4;j++)
    02F7 2766      CLR	R22
    02F8 C017      RJMP	0x0310
(0134)     {
(0135) 	disp_buffer[i][j]=disp2_buffer[i][j];
    02F9 E084      LDI	R24,4
    02FA 9F84      MUL	R24,R20
    02FB E084      LDI	R24,4
    02FC E091      LDI	R25,1
    02FD 0110      MOVW	R2,R0
    02FE 0E28      ADD	R2,R24
    02FF 1E39      ADC	R3,R25
    0300 2FE6      MOV	R30,R22
    0301 27FF      CLR	R31
    0302 0DE2      ADD	R30,R2
    0303 1DF3      ADC	R31,R3
    0304 8020      LDD	R2,Z+0
    0305 E489      LDI	R24,0x49
    0306 E091      LDI	R25,1
    0307 0120      MOVW	R4,R0
    0308 0E48      ADD	R4,R24
    0309 1E59      ADC	R5,R25
    030A 2FE6      MOV	R30,R22
    030B 27FF      CLR	R31
    030C 0DE4      ADD	R30,R4
    030D 1DF5      ADC	R31,R5
    030E 8220      STD	Z+0,R2
    030F 9563      INC	R22
    0310 3064      CPI	R22,4
    0311 F338      BCS	0x02F9
    0312 9543      INC	R20
    0313 3045      CPI	R20,5
    0314 F310      BCS	0x02F7
(0136) 	}
(0137)  }
(0138)  
(0139)  //开始闯关
(0140)  for(;;)
(0141)   {
(0142)     //显示鼠标
(0143)  LCD_set_XY(Y*8+3,X);//设置初始位置
    0315 91200163  LDS	R18,X
    0317 90200162  LDS	R2,Y
    0319 E088      LDI	R24,0x8
    031A 9D82      MUL	R24,R2
    031B 2D00      MOV	R16,R0
    031C 5F0D      SUBI	R16,0xFD
    031D 940E10FD  CALL	_LCD_set_XY
(0144)  LCD_write_byte(0x3c,1);
    031F E021      LDI	R18,1
    0320 E30C      LDI	R16,0x3C
    0321 940E1216  CALL	_LCD_write_byte
(0145)  LCD_write_byte(0x3c,1);
    0323 E021      LDI	R18,1
    0324 E30C      LDI	R16,0x3C
    0325 940E1216  CALL	_LCD_write_byte
(0146)    KBOD_task();							 //按键操作处理
    0327 D0C0      RCALL	_KBOD_task
(0147)    
(0148)    if(key_value!=0)
    0328 90200166  LDS	R2,key_value
    032A 2022      TST	R2
    032B F041      BEQ	0x0334
(0149)      {
(0150) 	  
(0151) 	  key_last_value=key_value;			 //将上次的键值存起来
    032C 92200165  STS	key_last_value,R2
(0152) 	  key_value=0;						 //将当前键值清零	 
    032E 2422      CLR	R2
    032F 92200166  STS	key_value,R2
(0153) 	  key_one=1;						 //将显示打开
    0331 E081      LDI	R24,1
    0332 93800164  STS	key_one,R24
(0154) 	 }
(0155) 	 
(0156)    if(key_one==1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -