📄 test_1602.lst
字号:
__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 + -