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

📄 test_1602.lst

📁 atmega32 +1602显示+ key控制 + ad转化电路都在一起测试通过
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    0046 E5CF      LDI	R28,0x5F
    0047 E0D4      LDI	R29,4
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E7E1      LDI	R30,0x71
    0050 E0F0      LDI	R31,0
    0051 E010      LDI	R17,0
    0052 37EA      CPI	R30,0x7A
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E7EA      LDI	R30,0x7A
    0059 E0F0      LDI	R31,0
    005A E6A0      LDI	R26,0x60
    005B E0B0      LDI	R27,0
    005C E010      LDI	R17,0
    005D 38EB      CPI	R30,0x8B
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E042F  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
_delay_us:
  i                    --> R20
  n                    --> R16
    0067 940E0529  CALL	push_gset1
FILE: F:\tem\1602AN~1\1602.h
(0001) #include <iom16v.h>
(0002) //#include "lcd1602.h"
(0003) //PortA(0.1.2) for control pin and PortB for data and com
(0004) 
(0005) #define RS_CLR PORTA &= ~(1 << PA2)
(0006) #define RS_SET PORTA |= (1 << PA2)
(0007) #define RW_CLR PORTA &= ~(1 << PA1)
(0008) #define RW_SET PORTA |= (1 << PA1)
(0009) #define EN_CLR PORTA &= ~(1 << PA0)
(0010) #define EN_SET PORTA |= (1 << PA0)
(0011) /*延时函数*/
(0012) void delay_us(unsigned int n) {
(0013)  unsigned int i;
(0014) for(i=0;i<n;i++);
    0069 2744      CLR	R20
    006A 2755      CLR	R21
    006B C002      RJMP	0x006E
    006C 5F4F      SUBI	R20,0xFF
    006D 4F5F      SBCI	R21,0xFF
    006E 1740      CP	R20,R16
    006F 0751      CPC	R21,R17
    0070 F3D8      BCS	0x006C
    0071 940E052C  CALL	pop_gset1
    0073 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    0074 940E0527  CALL	push_gset2
(0015) }
(0016) /*延时函数*/
(0017) void delay_ms(unsigned int i) {
(0018)  unsigned int a, b;
(0019)  for (a = 1; a < i; a++) 
    0076 E041      LDI	R20,1
    0077 E050      LDI	R21,0
    0078 C00B      RJMP	0x0084
(0020)   for (b = 1; b<1000; b++) 
    0079 E061      LDI	R22,1
    007A E070      LDI	R23,0
    007B C002      RJMP	0x007E
    007C 5F6F      SUBI	R22,0xFF
    007D 4F7F      SBCI	R23,0xFF
    007E 3E68      CPI	R22,0xE8
    007F E0E3      LDI	R30,3
    0080 077E      CPC	R23,R30
    0081 F3D0      BCS	0x007C
    0082 5F4F      SUBI	R20,0xFF
    0083 4F5F      SBCI	R21,0xFF
    0084 1740      CP	R20,R16
    0085 0751      CPC	R21,R17
    0086 F390      BCS	0x0079
    0087 940E051B  CALL	pop_gset2
    0089 9508      RET
_LCD_write_com:
  com                  --> R20
    008A 940E0529  CALL	push_gset1
    008C 2F40      MOV	R20,R16
(0021)    ;  
(0022) }
(0023) 
(0024) 
(0025) /*显示屏命令写入函数*/
(0026) void LCD_write_com(unsigned char com) {
(0027)  
(0028)  RS_CLR;
    008D 98DA      CBI	0x1B,2
(0029)  RW_CLR;
    008E 98D9      CBI	0x1B,1
(0030)  EN_SET;
    008F 9AD8      SBI	0x1B,0
(0031)  PORTB = com;
    0090 BB48      OUT	0x18,R20
(0032)  delay_us(5);
    0091 E005      LDI	R16,5
    0092 E010      LDI	R17,0
    0093 DFD3      RCALL	_delay_us
(0033)  EN_CLR;
    0094 98D8      CBI	0x1B,0
    0095 940E052C  CALL	pop_gset1
    0097 9508      RET
_LCD_write_data:
  data                 --> R20
    0098 940E0529  CALL	push_gset1
    009A 2F40      MOV	R20,R16
(0034) }
(0035) /*显示屏命令写入函数*/
(0036) void LCD_write_data(unsigned char data) {
(0037)  RS_SET;
    009B 9ADA      SBI	0x1B,2
(0038)  RW_CLR;
    009C 98D9      CBI	0x1B,1
(0039)  EN_SET;
    009D 9AD8      SBI	0x1B,0
(0040)  PORTB = data;
    009E BB48      OUT	0x18,R20
(0041)  delay_us(5);
    009F E005      LDI	R16,5
    00A0 E010      LDI	R17,0
    00A1 DFC5      RCALL	_delay_us
(0042)  EN_CLR;
    00A2 98D8      CBI	0x1B,0
    00A3 940E052C  CALL	pop_gset1
    00A5 9508      RET
(0043) }
(0044) /*显示屏清空显示*/
(0045) void LCD_clear(void) {
(0046)  LCD_write_com(0x01);
_LCD_clear:
    00A6 E001      LDI	R16,1
    00A7 DFE2      RCALL	_LCD_write_com
(0047)  delay_ms(5);
    00A8 E005      LDI	R16,5
    00A9 E010      LDI	R17,0
    00AA DFC9      RCALL	_delay_ms
    00AB 9508      RET
_LCD_write_str:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    00AC 940E0525  CALL	push_gset3
    00AE 2EA2      MOV	R10,R18
    00AF 2F60      MOV	R22,R16
    00B0 814E      LDD	R20,Y+6
    00B1 815F      LDD	R21,Y+7
(0048) }
(0049) /*显示屏字符串写入函数*/
(0050) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0051)  
(0052)     if (y == 0) {
    00B2 20AA      TST	R10
    00B3 F421      BNE	0x00B8
(0053)      LCD_write_com(0x80 + x);
    00B4 2F06      MOV	R16,R22
    00B5 5800      SUBI	R16,0x80
    00B6 DFD3      RCALL	_LCD_write_com
(0054)      }
    00B7 C009      RJMP	0x00C1
(0055)     else {
(0056)      LCD_write_com(0xC0 + x);
    00B8 2F06      MOV	R16,R22
    00B9 5400      SUBI	R16,0x40
    00BA DFCF      RCALL	_LCD_write_com
(0057)      }
    00BB C005      RJMP	0x00C1
(0058)     
(0059)     while (*s) {
(0060)      LCD_write_data( *s);
    00BC 01FA      MOVW	R30,R20
    00BD 8100      LDD	R16,Z+0
    00BE DFD9      RCALL	_LCD_write_data
(0061)      s ++;
    00BF 5F4F      SUBI	R20,0xFF
    00C0 4F5F      SBCI	R21,0xFF
    00C1 01FA      MOVW	R30,R20
    00C2 8020      LDD	R2,Z+0
    00C3 2022      TST	R2
    00C4 F7B9      BNE	0x00BC
    00C5 940E051E  CALL	pop_gset3
    00C7 9508      RET
_LCD_write_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    00C8 940E0527  CALL	push_gset2
    00CA 2F62      MOV	R22,R18
    00CB 2F40      MOV	R20,R16
(0062)      }
(0063) }
(0064) /*显示屏单字符写入函数*/
(0065) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0066)  
(0067)     if (y == 0) {
    00CC 2366      TST	R22
    00CD F421      BNE	0x00D2
(0068)      LCD_write_com(0x80 + x);
    00CE 2F04      MOV	R16,R20
    00CF 5800      SUBI	R16,0x80
    00D0 DFB9      RCALL	_LCD_write_com
(0069)      }
    00D1 C003      RJMP	0x00D5
(0070)     else {
(0071)      LCD_write_com(0xC0 + x);
    00D2 2F04      MOV	R16,R20
    00D3 5400      SUBI	R16,0x40
    00D4 DFB5      RCALL	_LCD_write_com
(0072)      }
(0073)     
(0074)     LCD_write_data( data);  
    00D5 810C      LDD	R16,Y+4
    00D6 DFC1      RCALL	_LCD_write_data
    00D7 940E051B  CALL	pop_gset2
    00D9 9508      RET
_LCD_write_num:
  data_num             --> Y+4
  y                    --> R22
  x                    --> R20
    00DA 940E0527  CALL	push_gset2
    00DC 2F62      MOV	R22,R18
    00DD 2F40      MOV	R20,R16
(0075) }
(0076) /*显示数字函数*/
(0077) void LCD_write_num(unsigned char x,unsigned char y,unsigned char data_num) {
(0078)  
(0079)     if (y == 0) {
    00DE 2366      TST	R22
    00DF F421      BNE	0x00E4
(0080)      LCD_write_com(0x80 + x);
    00E0 2F04      MOV	R16,R20
    00E1 5800      SUBI	R16,0x80
    00E2 DFA7      RCALL	_LCD_write_com
(0081)      }
    00E3 C003      RJMP	0x00E7
(0082)     else {
(0083)      LCD_write_com(0xC0 + x);
    00E4 2F04      MOV	R16,R20
    00E5 5400      SUBI	R16,0x40
    00E6 DFA3      RCALL	_LCD_write_com
(0084)      }
(0085)     
(0086)     LCD_write_data( 48+data_num);  
    00E7 810C      LDD	R16,Y+4
    00E8 5D00      SUBI	R16,0xD0
    00E9 DFAE      RCALL	_LCD_write_data
    00EA 940E051B  CALL	pop_gset2
    00EC 9508      RET
(0087) }
(0088) /*显示屏初始化函数*/
(0089) 
(0090) void LCD_init(void) {
(0091)  
(0092)  DDRB = 0xFF;      /*I/O口方向设置*/
_LCD_init:
    00ED EF8F      LDI	R24,0xFF
    00EE BB87      OUT	0x17,R24
(0093)  DDRA |= (1 << PA0) | (1 << PA1) | (1 << PA2);
    00EF B38A      IN	R24,0x1A
    00F0 6087      ORI	R24,7
    00F1 BB8A      OUT	0x1A,R24
(0094) // DDRB = 0xFF;
(0095)  
(0096)  LCD_write_com(0x38);    /*显示模式设置*/
    00F2 E308      LDI	R16,0x38
    00F3 DF96      RCALL	_LCD_write_com
(0097)  delay_ms(5);
    00F4 E005      LDI	R16,5
    00F5 E010      LDI	R17,0
    00F6 DF7D      RCALL	_delay_ms
(0098)  LCD_write_com(0x38);
    00F7 E308      LDI	R16,0x38
    00F8 DF91      RCALL	_LCD_write_com
(0099)  delay_ms(5);
    00F9 E005      LDI	R16,5
    00FA E010      LDI	R17,0
    00FB DF78      RCALL	_delay_ms
(0100)  LCD_write_com(0x38);
    00FC E308      LDI	R16,0x38
    00FD DF8C      RCALL	_LCD_write_com
(0101)  delay_ms(5);
    00FE E005      LDI	R16,5
    00FF E010      LDI	R17,0
    0100 DF73      RCALL	_delay_ms
(0102)  LCD_write_com(0x38);
    0101 E308      LDI	R16,0x38
    0102 DF87      RCALL	_LCD_write_com
(0103)  
(0104)  LCD_write_com(0x08);    /*显示关闭*/
    0103 E008      LDI	R16,0x8
    0104 DF85      RCALL	_LCD_write_com
(0105)  LCD_write_com(0x01);    /*显示清屏*/
    0105 E001      LDI	R16,1
    0106 DF83      RCALL	_LCD_write_com
(0106)  LCD_write_com(0x06);    /*显示光标移动设置*/
    0107 E006      LDI	R16,6
    0108 DF81      RCALL	_LCD_write_com
(0107)  delay_ms(5);
    0109 E005      LDI	R16,5
    010A E010      LDI	R17,0
    010B DF68      RCALL	_delay_ms
(0108)  LCD_write_com(0x0C);    /*显示开及光标设置*/
    010C E00C      LDI	R16,0xC
    010D DF7C      RCALL	_LCD_write_com
    010E 9508      RET
_key_read:
  k                    --> R20
    010F 940E0529  CALL	push_gset1
FILE: F:\tem\1602AN~1\1602_main.c
(0001) #include <iom16v.h>
(0002) #include "1602.h"
(0003) //void delay_ms(unsigned int us);
(0004) //void delay_us(unsigned int uu);
(0005) unsigned char key_read(void);
(0006) unsigned char get_key(void);
(0007) unsigned int get_ad(void);
(0008) unsigned char lcd_process(void);
(0009) int key,disp_num1;
(0010) float disp_num2;
(0011) /*
(0012) void delay_us(unsigned int uu)  //90us
(0013)  {unsigned int ii; 
(0014)   for(ii=0;ii<uu;ii++)
(0015)    ;  
(0016)   }
(0017) 
(0018) 
(0019) void delay_ms(unsigned int us)   //1ms
(0020)  {unsigned int ii; 
(0021)   for(ii=0;ii<us;ii++)
(0022)    delay_us(100);  
(0023)   } 
(0024) */
(0025) /*
(0026) 键盘扫描函数
(0027)  读取当前键盘的状态
(0028)  有按键按下返回相应按键值
(0029)  无按键按下返回"0x00"
(0030) */
(0031) unsigned char key_read(void){
(0032)  unsigned char k;
(0033)  
(0034) 
(0035) 
(0036)  //非常经典的键盘控制例子
(0037)  DDRD = 0x00;/*获取列地址*/   
    0111 2422      CLR	R2
    0112 BA21      OUT	0x11,R2
(0038)  PORTD = 0x0F;
    0113 E08F      LDI	R24,0xF
    0114 BB82      OUT	0x12,R24
(0039)  DDRD = 0xF0;
    0115 EF80      LDI	R24,0xF0
    0116 BB81      OUT	0x11,R24
(0040)  delay_ms(10);
    0117 E00A      LDI	R16,0xA
    0118 E010      LDI	R17,0
    0119 DF5A      RCALL	_delay_ms
(0041)  k = PIND;
    011A B340      IN	R20,0x10
(0042)  
(0043)  DDRD = 0x00;/*获取行地址*/
    011B 2422      CLR	R2
    011C BA21      OUT	0x11,R2
(0044)  PORTD = 0xF0;
    011D EF80      LDI	R24,0xF0
    011E BB82      OUT	0x12,R24
(0045)  DDRD = 0x0F;
    011F E08F      LDI	R24,0xF
    0120 BB81      OUT	0x11,R24
(0046)  delay_ms(10);
    0121 E00A      LDI	R16,0xA
    0122 E010      LDI	R17,0
    0123 DF50      RCALL	_delay_ms
(0047)  k |= PIND;
    0124 B220      IN	R2,0x10
    0125 2942      OR	R20,R2
(0048)  
(0049)  DDRD = 0x00;/*输出复位*/
    0126 2422      CLR	R2
    0127 BA21      OUT	0x11,R2
(0050)  PORTD = 0xFF;
    0128 EF8F      LDI	R24,0xFF
    0129 BB82      OUT	0x12,R24
(0051)  
(0052)  
(0053)  switch (k) {/*将按键码转换成键值*/
    012A 2755      CLR	R21
    012B 3B47      CPI	R20,0xB7
    012C E0E0      LDI	R30,0
    012D 075E      CPC	R21,R30
    012E F409      BNE	0x0130
    012F C06B      RJMP	0x019B
    0130 3B4B      CPI	R20,0xBB
    0131 E0E0      LDI	R30,0
    0132 075E      CPC	R21,R30
    0133 F409      BNE	0x0135
    0134 C05E      RJMP	0x0193
    0135 3B4D      CPI	R20,0xBD
    0136 E0E0      LDI	R30,0
    0137 075E      CPC	R21,R30
    0138 F409      BNE	0x013A
    0139 C051      RJMP	0x018B
    013A 3B4E      CPI	R20,0xBE
    013B E0E0      LDI	R30,0
    013C 075E      CPC	R21,R30
    013D F409      BNE	0x013F
    013E C044      RJMP	0x0183

⌨️ 快捷键说明

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