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

📄 prj.lst

📁 ATMEGA128控制4×6矩阵键盘,LCD1602 使用protues软件可仿真 附带图片可观看效果
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
      63 EFCF      LDI	R28,0xFF
      64 E1D0      LDI	R29,0x10
      65 BFCD      OUT	0x3D,R28
      66 BFDE      OUT	0x3E,R29
      67 53CC      SUBI	R28,0x3C
      68 40D0      SBCI	R29,0
      69 EA0A      LDI	R16,0xAA
      6A 8308      STD	Y+0,R16
      6B 2400      CLR	R0
      6C E3EA      LDI	R30,0x3A
      6D E0F1      LDI	R31,1
      6E E011      LDI	R17,1
      6F 33EA      CPI	R30,0x3A
      70 07F1      CPC	R31,R17
      71 F011      BEQ	0x0074
      72 9201      ST	R0,Z+
      73 CFFB      RJMP	0x006F
      74 8300      STD	Z+0,R16
      75 E8EC      LDI	R30,0x8C
      76 E0F0      LDI	R31,0
      77 E0A0      LDI	R26,0
      78 E0B1      LDI	R27,1
      79 E010      LDI	R17,0
      7A E000      LDI	R16,0
      7B BF0B      OUT	0x3B,R16
      7C 3CE6      CPI	R30,0xC6
      7D 07F1      CPC	R31,R17
      7E F021      BEQ	0x0083
      7F 95C8      LPM
      80 9631      ADIW	R30,1
      81 920D      ST	R0,X+
      82 CFF9      RJMP	0x007C
      83 940E 01E7 CALL	_main
_exit:
      85 CFFF      RJMP	_exit
FILE: D:\ICCAVR~1\模块化~1\src\delay.c
(0001) #define DELAY_C
(0002) #include "common.h"
(0003) #define XTAL 1    //晶振频率,单位MHz
(0004) void delay_1us(void)                 //1us延时函数
(0005)   {
(0006)    asm("nop");
_delay_1us:
      86 0000      NOP
      87 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R10
      88 940E 024A CALL	push_xgset300C
      8A 0158      MOVW	R10,R16
(0007)   }
(0008) 
(0009) void delay_nus(unsigned int n)       //N us延时函数
(0010)   {
(0011)    unsigned int i=0;
      8B 2744      CLR	R20
      8C 2755      CLR	R21
(0012)    for (i=0;i<n;i++)
      8D C003      RJMP	0x0091
(0013)    delay_1us();
      8E DFF7      RCALL	_delay_1us
      8F 5F4F      SUBI	R20,0xFF
      90 4F5F      SBCI	R21,0xFF
      91 154A      CP	R20,R10
      92 055B      CPC	R21,R11
      93 F3D0      BCS	0x008E
      94 940C 024F JMP	pop_xgset300C
(0014)   }
(0015)   
(0016) void delay_1ms(void)                 //1ms延时函数
(0017)   {
(0018)    unsigned int i;
(0019)    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
  i                    --> R16
      96 2700      CLR	R16
      97 2711      CLR	R17
      98 C002      RJMP	0x009B
      99 5F0F      SUBI	R16,0xFF
      9A 4F1F      SBCI	R17,0xFF
      9B E88D      LDI	R24,0x8D
      9C E090      LDI	R25,0
      9D 1708      CP	R16,R24
      9E 0719      CPC	R17,R25
      9F F3C8      BCS	0x0099
      A0 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
      A1 940E 024A CALL	push_xgset300C
      A3 0158      MOVW	R10,R16
(0020)   }
(0021)   
(0022) void delay_nms(unsigned int n)       //N ms延时函数
(0023)   {
(0024)    unsigned int i=0;
      A4 2744      CLR	R20
      A5 2755      CLR	R21
(0025)    for (i=0;i<n;i++)
      A6 C003      RJMP	0x00AA
(0026)    {
(0027)       delay_1ms();
      A7 DFEE      RCALL	_delay_1ms
      A8 5F4F      SUBI	R20,0xFF
      A9 4F5F      SBCI	R21,0xFF
      AA 154A      CP	R20,R10
      AB 055B      CPC	R21,R11
      AC F3D0      BCS	0x00A7
      AD 940C 024F JMP	pop_xgset300C
_key_scan:
  keynum               --> R12
  x                    --> R20
  keytemp              --> R10
  y                    --> R22
      AF 940E 0270 CALL	push_xgsetF03C
FILE: D:\ICCAVR~1\模块化~1\src\key.c
(0001) #include "common.h"
(0002) 
(0003) unsigned char key_scan(void);
(0004) 
(0005) /********************************************************************************************
(0006) * 函数名称:key_scan()
(0007) * 功    能:返回用户按下的键盘所对应的键盘号
(0008) * 入口参数:无
(0009) * 出口参数:返回0表示没有键盘被按动,返回1~24对应被按动的键盘
(0010) * 说    明:用户可根据自己的键盘编号修改该函数
(0011) *********************************************************************************************/
(0012) unsigned char key_scan(void)
(0013) {
(0014) 	unsigned char x,y;
(0015) 	unsigned char keynum;
(0016) 	unsigned char keytemp;
(0017) 	for(x=0;x<4;x++)
      B1 2744      CLR	R20
      B2 C027      RJMP	0x00DA
(0018) 	{
(0019) 		PORTB=~(1<<x);
      B3 E001      LDI	R16,1
      B4 2F14      MOV	R17,R20
      B5 940E 0282 CALL	lsl8
      B7 2E20      MOV	R2,R16
      B8 9420      COM	R2
      B9 BA28      OUT	0x18,R2
(0020) 		keytemp=PINE;
      BA B0A1      IN	R10,0x01
(0021) 		for(y=0;y<4;y++)
      BB 2766      CLR	R22
      BC C01A      RJMP	0x00D7
(0022) 		{
(0023) 			if(((keytemp>>y)&0x01)!=0)
      BD 2D0A      MOV	R16,R10
      BE 2F16      MOV	R17,R22
      BF 940E 0288 CALL	lsr8
      C1 2F80      MOV	R24,R16
      C2 7081      ANDI	R24,1
      C3 F091      BEQ	0x00D6
(0024) 			{
(0025) 				delay_nms(5);
      C4 E005      LDI	R16,5
      C5 E010      LDI	R17,0
      C6 940E 00A1 CALL	_delay_nms
(0026) 				if(((keytemp>>y)&0x01)!=0)
      C8 2D0A      MOV	R16,R10
      C9 2F16      MOV	R17,R22
      CA 940E 0288 CALL	lsr8
      CC 2F80      MOV	R24,R16
      CD 7081      ANDI	R24,1
      CE F039      BEQ	0x00D6
(0027) 				{	
(0028) 					keynum=6*x+y;
      CF E086      LDI	R24,6
      D0 9F84      MUL	R24,R20
      D1 2CC0      MOV	R12,R0
      D2 0EC6      ADD	R12,R22
(0029) 					return (keynum+1);
      D3 2D0C      MOV	R16,R12
      D4 5F0F      SUBI	R16,0xFF
      D5 C006      RJMP	0x00DC
      D6 9563      INC	R22
      D7 3064      CPI	R22,4
      D8 F320      BCS	0x00BD
      D9 9543      INC	R20
      DA 3044      CPI	R20,4
      DB F2B8      BCS	0x00B3
      DC 940C 0279 JMP	pop_xgsetF03C
FILE: D:\ICCAVR~1\模块化~1\src\LCD.c
(0001) // ************************************************
(0002) // *** LCD_4BIT Driver V1.1 ***
(0003) // *** LCD.C ***
(0004) // ************************************************
(0005) #include "common.h"
(0006) 
(0007) #define LCD_C
(0008) // ***** Define I/O pins ***** //
(0009) #define BIT7 0x80
(0010) #define BIT6 0x40
(0011) #define BIT5 0x20
(0012) #define BIT4 0x10
(0013) #define BIT3 0x08
(0014) #define BIT2 0x04
(0015) #define BIT1 0x02
(0016) #define BIT0 0x01
(0017) // *** Set port for LCD Data Bus 8 bit mode *** //
(0018) #define LCD_OP_PORT PORTD
(0019) #define LCD_IP_PORT PIND
(0020) #define LCD_DIR_PORT DDRD
(0021) // *** Set LCD Enable Port and Bit values *** //
(0022) //#define LCD_EN LCD_OP_PORT.2
(0023) // *** Set LCD Register Select Port and Bit values *** //
(0024) //#define LCD_RS LCD_OP_PORT.0
(0025) // *** Set LCD Read/Write Port and Bit values *** //
(0026) //#define LCD_RW LCD_OP_PORT.1
(0027) /****************************************************************/
(0028)  
(0029)  #define LCD_EN  (1 << 2)     //引脚定义
(0030)  #define LCD_RS (1 << 0)
(0031)  #define LCD_RW (1 << 1)
(0032)  
(0033)  #define lcd_set_e()  (LCD_OP_PORT |= LCD_EN)   //置位与清零
(0034)  #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS)
(0035)  #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW)
(0036)  #define lcd_clear_e()  (LCD_OP_PORT &= ~LCD_EN)
(0037)  #define lcd_clear_rs() (LCD_OP_PORT &= ~LCD_RS)
(0038)  #define lcd_clear_rw() (LCD_OP_PORT &= ~LCD_RW)
(0039) /****************************************************************/
(0040) 
(0041) #define LCD_ON 0x0C
(0042) #define LCD_CURS_ON 0x0D
(0043) #define LCD_OFF 0x08
(0044) #define LCD_HOME 0x02
(0045) #define LCD_CLEAR 0x01
(0046) #define LCD_NEW_LINE 0xC0
(0047) #define LCD_FUNCTION_SET 0x28
(0048) #define LCD_MODE_SET  0x06
(0049) 
(0050) 
(0051) void LCD_INIT(void)
(0052) {
(0053) LCD_DIR_PORT = 0xff; // LCD port output
_LCD_INIT:
      DE EF8F      LDI	R24,0xFF
      DF BB81      OUT	0x11,R24
(0054) LCD_OP_PORT = 0x30; // Load high-data to port
      E0 E380      LDI	R24,0x30
      E1 BB82      OUT	0x12,R24
(0055) lcd_clear_rw(); // Set LCD to write
      E2 9891      CBI	0x12,1
(0056) lcd_clear_rs(); // Set LCD to command
      E3 9890      CBI	0x12,0
(0057) lcd_set_e(); // Write data to LCD
      E4 9A92      SBI	0x12,2
(0058) asm("nop");
      E5 0000      NOP
(0059) asm("nop");
      E6 0000      NOP
(0060) lcd_clear_e(); // Disable LCD
      E7 9892      CBI	0x12,2
(0061) delay_nus(40);
      E8 E208      LDI	R16,0x28
      E9 E010      LDI	R17,0
      EA 940E 0088 CALL	_delay_nus
(0062) lcd_clear_rw() ; // Set LCD to write
      EC 9891      CBI	0x12,1
(0063) lcd_clear_rs(); // Set LCD to command
      ED 9890      CBI	0x12,0
(0064) lcd_set_e(); // Write data to LCD
      EE 9A92      SBI	0x12,2
(0065) asm("nop");
      EF 0000      NOP
(0066) asm("nop");
      F0 0000      NOP
(0067) lcd_clear_e(); // Disable LCD
      F1 9892      CBI	0x12,2
(0068) delay_nus(40);
      F2 E208      LDI	R16,0x28
      F3 E010      LDI	R17,0
      F4 940E 0088 CALL	_delay_nus
(0069) lcd_set_e(); // Write data to LCD
      F6 9A92      SBI	0x12,2
(0070) asm("nop");
      F7 0000      NOP
(0071) asm("nop");
      F8 0000      NOP
(0072) lcd_clear_e(); // Disable LCD
      F9 9892      CBI	0x12,2
(0073) delay_nus(40);
      FA E208      LDI	R16,0x28
      FB E010      LDI	R17,0
      FC 940E 0088 CALL	_delay_nus
(0074) LCD_OP_PORT = 0x20;
      FE E280      LDI	R24,0x20
      FF BB82      OUT	0x12,R24
(0075) lcd_set_e(); // Write data to LCD
     100 9A92      SBI	0x12,2
(0076) asm("nop");
     101 0000      NOP
(0077) asm("nop");
     102 0000      NOP
(0078) lcd_clear_e(); // Disable LCD
     103 9892      CBI	0x12,2
(0079) delay_nus(40);
     104 E208      LDI	R16,0x28
     105 E010      LDI	R17,0
     106 940E 0088 CALL	_delay_nus
     108 9508      RET
_LCD_Busy:
  low                  --> R12
  high                 --> R10
  temp                 --> R20
     109 940E 0262 CALL	push_xgset303C
(0080) }
(0081) //*****************************************************//
(0082) // This routine will return the busy flag from the LCD //
(0083) //*****************************************************//
(0084) void LCD_Busy ( void )
(0085) {
(0086) unsigned char temp,high;
(0087) unsigned char low;
(0088) LCD_DIR_PORT = 0x0f; // Make I/O Port input
     10B E08F      LDI	R24,0xF
     10C BB81      OUT	0x11,R24
(0089) do
(0090) {

⌨️ 快捷键说明

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