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

📄 1602_main.s

📁 atmega32 +1602显示+ key控制 + ad转化电路都在一起测试通过
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module _1602_main.c
	.area text(rom, con, rel)
	.dbfile F:\tem\1602AN~1/1602.h
	.dbfunc e delay_us _delay_us fV
;              i -> R20,R21
;              n -> R16,R17
	.even
_delay_us::
	xcall push_gset1
	.dbline -1
	.dbline 12
; #include <iom16v.h>
; #include "1602.h"
; //void delay_ms(unsigned int us);
; //void delay_us(unsigned int uu);
; unsigned char key_read(void);
; unsigned char get_key(void);
; unsigned int get_ad(void);
; unsigned char lcd_process(void);
; int key,disp_num1;
; float disp_num2;
; /*
; void delay_us(unsigned int uu)  //90us
	.dbline 14
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 14
L3:
	.dbline 14
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 14
;  {unsigned int ii; 
;   for(ii=0;ii<uu;ii++)
	cp R20,R16
	cpc R21,R17
	brlo L2
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              a -> R20,R21
;              b -> R22,R23
;              i -> R16,R17
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 17
;    ;  
;   }
; 
	.dbline 19
; 
; void delay_ms(unsigned int us)   //1ms
	ldi R20,1
	ldi R21,0
	xjmp L10
L7:
	.dbline 20
;  {unsigned int ii; 
	ldi R22,1
	ldi R23,0
	xjmp L14
L11:
	.dbline 21
L12:
	.dbline 20
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 20
	cpi R22,232
	ldi R30,3
	cpc R23,R30
	brlo L11
L8:
	.dbline 19
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 19
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 i
	.dbsym r b 22 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e LCD_write_com _LCD_write_com fV
;            com -> R20
	.even
_LCD_write_com::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 26
;   for(ii=0;ii<us;ii++)
;    delay_us(100);  
;   } 
; */
; /*
; 键盘扫描函数
	.dbline 28
;  读取当前键盘的状态
;  有按键按下返回相应按键值
	cbi 0x1b,2
	.dbline 29
;  无按键按下返回"0x00"
	cbi 0x1b,1
	.dbline 30
; */
	sbi 0x1b,0
	.dbline 31
; unsigned char key_read(void){
	out 0x18,R20
	.dbline 32
;  unsigned char k;
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 33
;  
	cbi 0x1b,0
	.dbline -2
L15:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r com 20 c
	.dbend
	.dbfunc e LCD_write_data _LCD_write_data fV
;           data -> R20
	.even
_LCD_write_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 36
; 
; 
;  //非常经典的键盘控制例子
	.dbline 37
;  DDRD = 0x00;/*获取列地址*/   
	sbi 0x1b,2
	.dbline 38
;  PORTD = 0x0F;
	cbi 0x1b,1
	.dbline 39
;  DDRD = 0xF0;
	sbi 0x1b,0
	.dbline 40
;  delay_ms(10);
	out 0x18,R20
	.dbline 41
;  k = PIND;
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 42
;  
	cbi 0x1b,0
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_clear _LCD_clear fV
	.even
_LCD_clear::
	.dbline -1
	.dbline 45
;  DDRD = 0x00;/*获取行地址*/
;  PORTD = 0xF0;
;  DDRD = 0x0F;
	.dbline 46
;  delay_ms(10);
	ldi R16,1
	xcall _LCD_write_com
	.dbline 47
;  k |= PIND;
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_str _LCD_write_str fV
;              s -> R20,R21
;              y -> R10
;              x -> R22
	.even
_LCD_write_str::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 50
;  
;  DDRD = 0x00;/*输出复位*/
;  PORTD = 0xFF;
	.dbline 52
;  
;  
	tst R10
	brne L19
	.dbline 52
	.dbline 53
;  switch (k) {/*将按键码转换成键值*/
	mov R16,R22
	subi R16,128    ; addi 128
	xcall _LCD_write_com
	.dbline 54
; //  case  0x00: return 0x00;
	xjmp L22
L19:
	.dbline 55
;   case  0xEE: return 1;
	.dbline 56
;   case  0xDE: return 2;
	mov R16,R22
	subi R16,64    ; addi 192
	xcall _LCD_write_com
	.dbline 57
;   case  0xBE: return 3;
	xjmp L22
L21:
	.dbline 59
	.dbline 60
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_data
	.dbline 61
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 62
L22:
	.dbline 59
;   case  0x7E: return 4;
;   case  0xED: return 5;
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L21
	.dbline -2
L18:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r y 10 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           data -> y+4
;              y -> R22
;              x -> R20
	.even
_LCD_write_char::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 65
;   case  0xDD: return 6;
;   case  0xBD: return 7;
;   case  0x7D: return 8;
;   case  0xEB: return 9;
;   case  0xDB: return 44;
;   case  0xBB: return 55;
	.dbline 67
;   case  0x7B: return 66;
;   case  0xE7: return 77;
	tst R22
	brne L25
	.dbline 67
	.dbline 68
;   case  0xD7: return 88;
	mov R16,R20
	subi R16,128    ; addi 128
	xcall _LCD_write_com
	.dbline 69
;   case  0xB7: return 99;
	xjmp L26
L25:
	.dbline 70
;   case  0x77: return 100;
	.dbline 71
;   default : return 0x00;
	mov R16,R20
	subi R16,64    ; addi 192
	xcall _LCD_write_com
	.dbline 72
;   } 
L26:
	.dbline 74
; }
; 
	ldd R16,y+4
	xcall _LCD_write_data
	.dbline -2
L24:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data 4 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_write_num _LCD_write_num fV
;       data_num -> y+4
;              y -> R22
;              x -> R20
	.even
_LCD_write_num::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 77
; /*
; 按键获取函数
;  获取按键信号,其中包含有状态记录及按键去颤抖。
	.dbline 79
;  有正确按键按下返回相应按键值
;  无正确按键按下返回"0x00"
	tst R22
	brne L28
	.dbline 79
	.dbline 80
; */
	mov R16,R20
	subi R16,128    ; addi 128
	xcall _LCD_write_com
	.dbline 81
; unsigned char get_key(void){
	xjmp L29
L28:
	.dbline 82
;  unsigned char i;
	.dbline 83
;  static unsigned char j;/*按键记录*/
	mov R16,R20
	subi R16,64    ; addi 192
	xcall _LCD_write_com
	.dbline 84
;  i = key_read();
L29:
	.dbline 86
;  if (i == 0x00){/*无有效按键按下*/
;   j = 0x00;/*清除按键记录*/
	ldd R16,y+4
	subi R16,208    ; addi 48
	xcall _LCD_write_data
	.dbline -2
L27:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data_num 4 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 90
;   return 0x00;/*程序退出*/
;   }
;  if (j == 0x00) {/*为新按键*/
;   j = i;/*保存本次采样结果*/
	.dbline 92
;   delay_ms(10);/*去按键颤抖*/
;   i = key_read();
	ldi R24,255
	out 0x17,R24
	.dbline 93
;   if(i == j) {
	in R24,0x1a
	ori R24,7
	out 0x1a,R24
	.dbline 96
;    return i;
;    }
;   }
	ldi R16,56
	xcall _LCD_write_com
	.dbline 97
;  return 0x00;
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline 98
; }
	ldi R16,56
	xcall _LCD_write_com
	.dbline 99
; 
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline 100
; 
	ldi R16,56
	xcall _LCD_write_com
	.dbline 101
; /*ADC采样函数,采样第7通道信号,采样分辨率256*/
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline 102
;  unsigned int get_ad(void) {         //3.69KHZ
	ldi R16,56
	xcall _LCD_write_com
	.dbline 104
;  unsigned char hh,ll;
;  unsigned int num=0;
	ldi R16,8
	xcall _LCD_write_com
	.dbline 105
; // _CLI();
	ldi R16,1
	xcall _LCD_write_com
	.dbline 106
;   asm("cli");
	ldi R16,6
	xcall _LCD_write_com
	.dbline 107
;   DDRA = 0x00;    /*方向输入*/
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline 108
;   PORTA = 0x7F;    /*打开上拉*/
	ldi R16,12
	xcall _LCD_write_com
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile F:\tem\1602AN~1\1602_main.c
	.dbfunc e key_read _key_read fc
;              k -> R20
	.even
_key_read::
	xcall push_gset1
	.dbline -1
	.dbline 31
	.dbline 37
	clr R2
	out 0x11,R2
	.dbline 38
	ldi R24,15
	out 0x12,R24
	.dbline 39
	ldi R24,240
	out 0x11,R24
	.dbline 40
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 41
	in R20,0x10
	.dbline 43
	clr R2
	out 0x11,R2
	.dbline 44
	ldi R24,240
	out 0x12,R24
	.dbline 45
	ldi R24,15
	out 0x11,R24
	.dbline 46
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 47
	in R2,0x10
	or R20,R2
	.dbline 49
	clr R2
	out 0x11,R2
	.dbline 50
	ldi R24,255
	out 0x12,R24
	.dbline 53
	clr R21
	cpi R20,183
	ldi R30,0
	cpc R21,R30
	brne X1
	xjmp L49
X1:
	cpi R20,187
	ldi R30,0
	cpc R21,R30
	brne X2
	xjmp L45
X2:
	cpi R20,189
	ldi R30,0
	cpc R21,R30
	brne X3
	xjmp L41
X3:
	cpi R20,190
	ldi R30,0
	cpc R21,R30
	brne X4
	xjmp L37
X4:
	ldi R24,190
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L52
L51:
	cpi R20,119
	ldi R30,0
	cpc R21,R30
	brne X5
	xjmp L50
X5:
	cpi R20,123
	ldi R30,0
	cpc R21,R30
	brne X6
	xjmp L46
X6:
	cpi R20,125
	ldi R30,0
	cpc R21,R30
	brne X7
	xjmp L42
X7:
	cpi R20,126
	ldi R30,0
	cpc R21,R30
	breq L38
	xjmp L32
L52:
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	brne X8
	xjmp L48
X8:
	cpi R20,219
	ldi R30,0
	cpc R21,R30
	breq L44
	cpi R20,221
	ldi R30,0
	cpc R21,R30
	breq L40
	cpi R20,222
	ldi R30,0
	cpc R21,R30
	breq L36
	cpi R20,215
	ldi R30,0
	cpc R21,R30
	brge X9
	xjmp L32
X9:
L53:
	cpi R20,231
	ldi R30,0
	cpc R21,R30
	breq L47
	cpi R20,235
	ldi R30,0
	cpc R21,R30
	breq L43
	cpi R20,237
	ldi R30,0
	cpc R21,R30
	breq L39
	cpi R20,238
	ldi R30,0
	cpc R21,R30
	breq L35
	xjmp L32
X0:
	.dbline 53
L35:
	.dbline 55
	ldi R16,1
	xjmp L31
L36:
	.dbline 56
	ldi R16,2
	xjmp L31
L37:
	.dbline 57
	ldi R16,3
	xjmp L31
L38:
	.dbline 58
	ldi R16,4
	xjmp L31
L39:
	.dbline 59
	ldi R16,5
	xjmp L31
L40:
	.dbline 60
	ldi R16,6
	xjmp L31
L41:
	.dbline 61
	ldi R16,7
	xjmp L31
L42:
	.dbline 62
	ldi R16,8
	xjmp L31
L43:
	.dbline 63
	ldi R16,9
	xjmp L31
L44:
	.dbline 64
	ldi R16,44
	xjmp L31
L45:
	.dbline 65
	ldi R16,55
	xjmp L31
L46:
	.dbline 66
	ldi R16,66
	xjmp L31
L47:
	.dbline 67
	ldi R16,77
	xjmp L31
L48:
	.dbline 68
	ldi R16,88
	xjmp L31
L49:
	.dbline 69
	ldi R16,99
	xjmp L31
L50:
	.dbline 70
	ldi R16,100
	xjmp L31
L32:
	.dbline 71
	clr R16
	.dbline -2
L31:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r k 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\tem\1602AN~1\1602_main.c
L55:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile F:\tem\1602AN~1\1602_main.c
	.dbfunc e get_key _get_key fc
	.dbsym s j L55 c
;              i -> R20
	.even
_get_key::
	xcall push_gset1
	.dbline -1
	.dbline 81
	.dbline 84
	xcall _key_read
	mov R20,R16
	.dbline 85
	tst R16
	brne L56
	.dbline 85
	.dbline 86
	clr R2
	sts L55,R2
	.dbline 87
	clr R16
	xjmp L54
L56:
	.dbline 89
	lds R2,L55
	tst R2
	brne L58
	.dbline 89
	.dbline 90
	sts L55,R20
	.dbline 91
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 92
	xcall _key_read
	mov R20,R16
	.dbline 93
	lds R2,L55
	cp R16,R2
	brne L60
	.dbline 93
	.dbline 94
	xjmp L54
L60:
	.dbline 96
L58:
	.dbline 97
	clr R16
	.dbline -2
L54:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e get_ad _get_ad fi
;             hh -> <dead>
;             ll -> R20
;            num -> R22,R23
	.even
_get_ad::
	xcall push_gset2
	.dbline -1
	.dbline 102
	.dbline 104
	clr R22
	clr R23
	.dbline 106
	cli
	.dbline 107
	clr R2
	out 0x1a,R2
	.dbline 108
	ldi R24,127
	out 0x1b,R24
	.dbline 112
; //  delay_us(1);    //10us
; 
;  
;  ADMUX = 0x47;   /*基准AVCC、10位、通道7*/
	ldi R24,71
	out 0x7,R24
	.dbline 113
;  ADCSRA = 0xC0;   /*使能、开启、4分频*/
	ldi R24,192
	out 0x6,R24
L63:
	.dbline 114
L64:
	.dbline 114
;  while(!(ADCSRA & (1 << ADIF))); /*等待*/
	sbis 0x6,4
	rjmp L63
	.dbline 115
;  ll=ADCL;
	in R20,0x4
	.dbline 116
;  num = ADCH;
	in R22,0x5
	clr R23
	.dbline 117
;  num=num*256+ll;
	ldi R16,256
	ldi R17,1
	movw R18,R22
	xcall empy16s
	movw R22,R16
	mov R2,R20
	clr R3
	add R22,R2
	adc R23,R3
	.dbline 118
;  ADCSRA &= ~(1 << ADIF);  /*清标志*/
	cbi 0x6,4
	.dbline 119
;  ADCSRA &= ~(1 << ADEN);  /*关闭转换*/
	cbi 0x6,7
	.dbline 121
;  
;  DDRA=0XFF;
	ldi R24,255
	out 0x1a,R24
	.dbline 122
;  PORTA=0X00;
	clr R2
	out 0x1b,R2
	.dbline 124
;  //SEI();
;   asm("sei");
	sei
	.dbline 125
;  return  num;
	movw R16,R22
	.dbline -2
L62:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l hh 1 c
	.dbsym r ll 20 c
	.dbsym r num 22 i
	.dbend
	.dbfunc e lcd_process _lcd_process fc
	.even
_lcd_process::
	xcall push_gset1
	sbiw R28,5
	.dbline -1
	.dbline 130
;  
; }
; 
; unsigned char lcd_process(void)
; {
	.dbline 132
; 
;   if( disp_num2<=3.3&&disp_num2>=1)
	ldi R16,<L69
	ldi R17,>L69
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	lds R4,_disp_num2+2
	lds R5,_disp_num2+2+1
	lds R2,_disp_num2
	lds R3,_disp_num2+1
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall cmp32f
	brge X10
	xjmp L67
X10:
	lds R4,_disp_num2+2
	lds R5,_disp_num2+2+1
	lds R2,_disp_num2
	lds R3,_disp_num2+1
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L70
	ldi R17,>L70

⌨️ 快捷键说明

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