📄 ad.lst
字号:
__text_start:
__start:
002B E5CF LDI R28,0x5F
002C E0D4 LDI R29,4
002D BFCD OUT 0x3D,R28
002E BFDE OUT 0x3E,R29
002F 51C0 SUBI R28,0x10
0030 40D0 SBCI R29,0
0031 EA0A LDI R16,0xAA
0032 8308 STD Y+0,R16
0033 2400 CLR R0
0034 E6E1 LDI R30,0x61
0035 E0F0 LDI R31,0
0036 E010 LDI R17,0
0037 36E5 CPI R30,0x65
0038 07F1 CPC R31,R17
0039 F011 BEQ 0x003C
003A 9201 ST R0,Z+
003B CFFB RJMP 0x0037
003C 8300 STD Z+0,R16
003D E5E4 LDI R30,0x54
003E E0F0 LDI R31,0
003F E6A0 LDI R26,0x60
0040 E0B0 LDI R27,0
0041 E010 LDI R17,0
0042 35E5 CPI R30,0x55
0043 07F1 CPC R31,R17
0044 F021 BEQ 0x0049
0045 95C8 LPM
0046 9631 ADIW R30,1
0047 920D ST R0,X+
0048 CFF9 RJMP 0x0042
0049 940E014F CALL _main
_exit:
004B CFFF RJMP _exit
_delay:
i --> R20
n --> R16
004C 940E017B CALL push_gset1
FILE: H:\bbi项目源程序\AD转换\adc_16\lcd.h
(0001)
(0002) unsigned char ADtmp,ADbz=0;
(0003) #define LCD_DATAL PORTA&=~BIT(1)
(0004) #define LCD_DATAH PORTA|=BIT(1)
(0005) #define LCD_CLKL PORTA&=~BIT(3)
(0006) #define LCD_CLKH PORTA|=BIT(3)
(0007) void delay(unsigned char n)
(0008) {
(0009) unsigned char i;
(0010) for(i=0;i<n;i++) //延时
004E 2744 CLR R20
004F C002 RJMP 0x0052
(0011) {asm("nop");}
0050 0000 NOP
0051 9543 INC R20
0052 1740 CP R20,R16
0053 F3E0 BCS 0x0050
0054 940E017E CALL pop_gset1
0056 9508 RET
_lcd_out:
s --> Y+1
i --> R20
send_byte --> R22
0057 940E0179 CALL push_gset2
0059 2F60 MOV R22,R16
(0012) }
(0013) //*************************************************************************
(0014)
(0015) //***************************************************************************
(0016) void lcd_out(unsigned char send_byte)
(0017) {
(0018) unsigned char i,s;
(0019) for (i=0;i<8;i++)
005A 2744 CLR R20
005B C009 RJMP 0x0065
(0020) {
(0021) if((send_byte&0x80)==0)
005C FD67 SBRC R22,7
005D C002 RJMP 0x0060
(0022) {
(0023) LCD_DATAL;
005E 98D9 CBI 0x1B,1
(0024) }
005F C001 RJMP 0x0061
(0025) else
(0026) {
(0027) LCD_DATAH;
0060 9AD9 SBI 0x1B,1
(0028) } //送数据
(0029) LCD_CLKL;
0061 98DB CBI 0x1B,3
(0030) LCD_CLKH;
0062 9ADB SBI 0x1B,3
(0031) send_byte=send_byte<<1;
0063 0F66 LSL R22
0064 9543 INC R20
0065 3048 CPI R20,0x8
0066 F3A8 BCS 0x005C
(0032) }
(0033) delay(256);
0067 E000 LDI R16,0
0068 DFE3 RCALL _delay
0069 940E016D CALL pop_gset2
006B 9508 RET
_WR_dat:
s --> R20
dat --> R22
006C 940E0179 CALL push_gset2
006E 2F60 MOV R22,R16
(0034) }
(0035) //***************************************************************************
(0036)
(0037) void WR_dat(unsigned char dat)
(0038) {
(0039) unsigned char s;
(0040) s=dat&0xf0;
006F 2F46 MOV R20,R22
0070 7F40 ANDI R20,0xF0
(0041) lcd_out(0xfa);
0071 EF0A LDI R16,0xFA
0072 DFE4 RCALL _lcd_out
(0042) lcd_out(s);
0073 2F04 MOV R16,R20
0074 DFE2 RCALL _lcd_out
(0043) s=dat&0x0f;
0075 2F46 MOV R20,R22
0076 704F ANDI R20,0xF
(0044) s<<=4;
0077 2F84 MOV R24,R20
0078 708F ANDI R24,0xF
0079 9582 SWAP R24
007A 2F48 MOV R20,R24
(0045) lcd_out(s);
007B 2F08 MOV R16,R24
007C DFDA RCALL _lcd_out
007D 940E016D CALL pop_gset2
007F 9508 RET
_WR_control:
s --> R20
dat --> R22
0080 940E0179 CALL push_gset2
0082 2F60 MOV R22,R16
(0046) }
(0047) //**************************************************************************
(0048) void WR_control(unsigned char dat)
(0049) {
(0050) unsigned char s;
(0051) s=dat&0xf0;
0083 2F46 MOV R20,R22
0084 7F40 ANDI R20,0xF0
(0052) lcd_out(0xf8);
0085 EF08 LDI R16,0xF8
0086 DFD0 RCALL _lcd_out
(0053) lcd_out(s);
0087 2F04 MOV R16,R20
0088 DFCE RCALL _lcd_out
(0054) s=dat&0x0f;
0089 2F46 MOV R20,R22
008A 704F ANDI R20,0xF
(0055) s<<=4;
008B 2F84 MOV R24,R20
008C 708F ANDI R24,0xF
008D 9582 SWAP R24
008E 2F48 MOV R20,R24
(0056) lcd_out(s);
008F 2F08 MOV R16,R24
0090 DFC6 RCALL _lcd_out
0091 940E016D CALL pop_gset2
0093 9508 RET
(0057) }
(0058) //**************************************************************************
(0059) void lcd_control()
(0060) {
(0061) WR_control(0x30);
_lcd_control:
0094 E300 LDI R16,0x30
0095 DFEA RCALL _WR_control
(0062) WR_control(0x0c);
0096 E00C LDI R16,0xC
0097 DFE8 RCALL _WR_control
0098 9508 RET
_lcd_clear:
i --> R20
0099 940E017B CALL push_gset1
(0063) }
(0064) //**************************************************************************
(0065) void lcd_clear()
(0066) {
(0067) int i;
(0068) WR_control(0x01);
009B E001 LDI R16,1
009C DFE3 RCALL _WR_control
(0069) for(i=0;i<5000;i++) // 延时5ms
009D 2744 CLR R20
009E 2755 CLR R21
(0070) {
(0071) asm("nop");
009F 0000 NOP
(0072) asm("nop");
00A0 0000 NOP
00A1 5F4F SUBI R20,0xFF
00A2 4F5F SBCI R21,0xFF
00A3 3848 CPI R20,0x88
00A4 E1E3 LDI R30,0x13
00A5 075E CPC R21,R30
00A6 F3C4 BLT 0x009F
00A7 940E017E CALL pop_gset1
00A9 9508 RET
_LCD_address:
address --> R20
y --> R22
x --> R20
00AA 940E0179 CALL push_gset2
00AC 2F62 MOV R22,R18
00AD 2F40 MOV R20,R16
(0073) }
(0074) }
(0075) /*******************************************************/
(0076) /****** 函数名称: LCD_set_xy() ******/
(0077) /****** 功 能: 设置LCD显示坐标 ******/
(0078) /****** 参 数: 显示字符串的位置,X:0-15,Y:0-1*****/
(0079) /****** 返回值 : 无 ******/
(0080) /*******************************************************/
(0081) void LCD_address( unsigned char x, unsigned char y )
(0082) {
(0083) unsigned char address;
(0084) switch(x)
00AE 2755 CLR R21
00AF 3040 CPI R20,0
00B0 0745 CPC R20,R21
00B1 F069 BEQ 0x00BF
00B2 3041 CPI R20,1
00B3 E0E0 LDI R30,0
00B4 075E CPC R21,R30
00B5 F061 BEQ 0x00C2
00B6 3042 CPI R20,2
00B7 E0E0 LDI R30,0
00B8 075E CPC R21,R30
00B9 F059 BEQ 0x00C5
00BA 3043 CPI R20,3
00BB E0E0 LDI R30,0
00BC 075E CPC R21,R30
00BD F051 BEQ 0x00C8
00BE C00C RJMP 0x00CB
(0085) {
(0086) case 0:
(0087) address = 0x80 + y; //计算显示地址
00BF 2F46 MOV R20,R22
00C0 5840 SUBI R20,0x80
(0088) break;
00C1 C00B RJMP 0x00CD
(0089) case 1:
(0090) address = 0x90 + y; //计算显示地址
00C2 2F46 MOV R20,R22
00C3 5740 SUBI R20,0x70
(0091) break;
00C4 C008 RJMP 0x00CD
(0092) case 2:
(0093) address = 0x88 + y; //计算显示地址
00C5 2F46 MOV R20,R22
00C6 5748 SUBI R20,0x78
(0094) break;
00C7 C005 RJMP 0x00CD
(0095) case 3:
(0096) address = 0x98 + y; //计算显示地址
00C8 2F46 MOV R20,R22
00C9 5648 SUBI R20,0x68
(0097) break;
00CA C002 RJMP 0x00CD
(0098) default:address = 0x80 + y;
00CB 2F46 MOV R20,R22
00CC 5840 SUBI R20,0x80
(0099) }
(0100) WR_control( address); //写地址命令
00CD 2F04 MOV R16,R20
00CE DFB1 RCALL _WR_control
00CF 940E016D CALL pop_gset2
00D1 9508 RET
_LCD_Write_string:
s --> R20
Y --> R10
X --> R22
00D2 940E0177 CALL push_gset3
00D4 2EA2 MOV R10,R18
00D5 2F60 MOV R22,R16
00D6 814E LDD R20,Y+6
00D7 815F LDD R21,Y+7
(0101) }
(0102) //**************************************************************************
(0103) /*******************************************************/
(0104) /****** 函数名称: LCD_write_string() ******/
(0105) /****** 功 能: 中英文字符串显示函数 ******/
(0106) /****** 参 数: *s--英文字符串指针 ******/
(0107) /****** X、Y--显示字符串的位置 ******/
(0108) /****** 返回值 : 无 ******/
(0109) /*******************************************************/
(0110) void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0111) {
(0112)
(0113) LCD_address( X, Y ); //写显示地址
00D8 2D2A MOV R18,R10
00D9 2F06 MOV R16,R22
00DA DFCF RCALL _LCD_address
00DB C005 RJMP 0x00E1
(0114) while (*s) //是否到字符串尾
(0115) {
(0116) WR_dat (*s ); //写显示数据
00DC 01FA MOVW R30,R20
00DD 8100 LDD R16,Z+0
00DE DF8D RCALL _WR_dat
(0117) s ++; //字符串地址加1
00DF 5F4F SUBI R20,0xFF
00E0 4F5F SBCI R21,0xFF
00E1 01FA MOVW R30,R20
00E2 8020 LDD R2,Z+0
00E3 2022 TST R2
00E4 F7B9 BNE 0x00DC
00E5 940E0170 CALL pop_gset3
00E7 9508 RET
(0118) }
(0119) }
(0120)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -