📄 lc.lst
字号:
__start:
__text_start:
0055 E5CF LDI R28,0x5F
0056 E0D4 LDI R29,4
0057 BFCD OUT 0x3D,R28
0058 BFDE OUT 0x3E,R29
0059 51C0 SUBI R28,0x10
005A 40D0 SBCI R29,0
005B EA0A LDI R16,0xAA
005C 8308 STD Y+0,R16
005D 2400 CLR R0
005E E9E4 LDI R30,0x94
005F E0F0 LDI R31,0
0060 E010 LDI R17,0
0061 39EC CPI R30,0x9C
0062 07F1 CPC R31,R17
0063 F011 BEQ 0x0066
0064 9201 ST R0,Z+
0065 CFFB RJMP 0x0061
0066 8300 STD Z+0,R16
0067 E7E6 LDI R30,0x76
0068 E0F0 LDI R31,0
0069 E6A0 LDI R26,0x60
006A E0B0 LDI R27,0
006B E010 LDI R17,0
006C 3AEA CPI R30,0xAA
006D 07F1 CPC R31,R17
006E F021 BEQ 0x0073
006F 95C8 LPM
0070 9631 ADIW R30,1
0071 920D ST R0,X+
0072 CFF9 RJMP 0x006C
0073 940E010C CALL _main
_exit:
0075 CFFF RJMP _exit
FILE: E:\资料文件\MCU\myLC\LCD.h
(0001) #ifndef __LCD_h
(0002) #define __LCD_h
(0003)
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006)
(0007) #define LCD_EN_PORT PORTC
(0008) #define LCD_RW_PORT PORTC
(0009) #define LCD_RS_PORT PORTC
(0010) #define LCD_DATA_PORT PORTA
(0011) #define LCD_DATA_DDR DDRA
(0012) #define LCD_DATA_PIN PINA
(0013) #define LCD_EN 0x02
(0014) #define LCD_RS 0x01
(0015) #define LCD_DATA 0xf0
(0016)
(0017) extern void delay_nus(unsigned char n);
(0018) extern void delay_nms(unsigned char n);
(0019)
(0020) void LCD_en_write(void) //液晶使能
(0021) {
(0022) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0076 9AA9 SBI 0x15,1
(0023) delay_nus(5);
0077 E005 LDI R16,5
0078 D3C4 RCALL _delay_nus
(0024) LCD_EN_PORT&=~LCD_EN;
0079 98A9 CBI 0x15,1
007A 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
007B 940E04F7 CALL push_gset4
007D 0169 MOVW R12,R18
007E 0158 MOVW R10,R16
(0025) }
(0026)
(0027) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0028) {
(0029) unsigned command_temp,data_temp;
(0030) command_temp=command;
007F 01A5 MOVW R20,R10
(0031) data_temp=data;
0080 01B6 MOVW R22,R12
(0032) delay_nus(20);
0081 E104 LDI R16,0x14
0082 D3BA RCALL _delay_nus
(0033) if(command==0)
0083 3040 CPI R20,0
0084 0745 CPC R20,R21
0085 F511 BNE 0x00A8
(0034) {
(0035) LCD_RS_PORT|=LCD_RS; //RS=1
0086 9AA8 SBI 0x15,0
(0036) LCD_DATA_PORT&=0x0f;
0087 B38B IN R24,0x1B
0088 708F ANDI R24,0xF
0089 BB8B OUT 0x1B,R24
(0037) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
008A 01CB MOVW R24,R22
008B 7F80 ANDI R24,0xF0
008C 7090 ANDI R25,0
008D B22B IN R2,0x1B
008E 2433 CLR R3
008F 2A28 OR R2,R24
0090 2A39 OR R3,R25
0091 BA2B OUT 0x1B,R2
(0038) LCD_en_write();
0092 DFE3 RCALL _LCD_en_write
(0039) data_temp=data_temp<<4;
0093 0F66 LSL R22
0094 1F77 ROL R23
0095 0F66 LSL R22
0096 1F77 ROL R23
0097 0F66 LSL R22
0098 1F77 ROL R23
0099 0F66 LSL R22
009A 1F77 ROL R23
(0040) LCD_DATA_PORT&=0x0f;
009B B38B IN R24,0x1B
009C 708F ANDI R24,0xF
009D BB8B OUT 0x1B,R24
(0041) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
009E 01CB MOVW R24,R22
009F 7F80 ANDI R24,0xF0
00A0 7090 ANDI R25,0
00A1 B22B IN R2,0x1B
00A2 2433 CLR R3
00A3 2A28 OR R2,R24
00A4 2A39 OR R3,R25
00A5 BA2B OUT 0x1B,R2
(0042) LCD_en_write();
00A6 DFCF RCALL _LCD_en_write
(0043) }
00A7 C021 RJMP 0x00C9
(0044) else
(0045) {
(0046) LCD_RS_PORT&=~LCD_RS; //RS=0
00A8 98A8 CBI 0x15,0
(0047) LCD_DATA_PORT&=0x0f;
00A9 B38B IN R24,0x1B
00AA 708F ANDI R24,0xF
00AB BB8B OUT 0x1B,R24
(0048) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
00AC 01CA MOVW R24,R20
00AD 7F80 ANDI R24,0xF0
00AE 7090 ANDI R25,0
00AF B22B IN R2,0x1B
00B0 2433 CLR R3
00B1 2A28 OR R2,R24
00B2 2A39 OR R3,R25
00B3 BA2B OUT 0x1B,R2
(0049) LCD_en_write();
00B4 DFC1 RCALL _LCD_en_write
(0050) command_temp=command_temp<<4;
00B5 0F44 LSL R20
00B6 1F55 ROL R21
00B7 0F44 LSL R20
00B8 1F55 ROL R21
00B9 0F44 LSL R20
00BA 1F55 ROL R21
00BB 0F44 LSL R20
00BC 1F55 ROL R21
(0051) LCD_DATA_PORT&=0x0f;
00BD B38B IN R24,0x1B
00BE 708F ANDI R24,0xF
00BF BB8B OUT 0x1B,R24
(0052) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
00C0 01CA MOVW R24,R20
00C1 7F80 ANDI R24,0xF0
00C2 7090 ANDI R25,0
00C3 B22B IN R2,0x1B
00C4 2433 CLR R3
00C5 2A28 OR R2,R24
00C6 2A39 OR R3,R25
00C7 BA2B OUT 0x1B,R2
(0053) LCD_en_write();
00C8 DFAD RCALL _LCD_en_write
(0054) }
00C9 940E04EF CALL pop_gset4
00CB 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00CC 940E04FB CALL push_gset2
00CE 2F42 MOV R20,R18
00CF 2F60 MOV R22,R16
(0055) }
(0056)
(0057) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0058) {
(0059) unsigned char address;
(0060) if (y == 0) address = 0x80 + x;
00D0 2344 TST R20
00D1 F419 BNE 0x00D5
00D2 2F46 MOV R20,R22
00D3 5840 SUBI R20,0x80
00D4 C002 RJMP 0x00D7
(0061) else
(0062) address = 0xc0 + x;
00D5 2F46 MOV R20,R22
00D6 5440 SUBI R20,0x40
(0063) LCD_write_char( address, 0 );
00D7 2722 CLR R18
00D8 2733 CLR R19
00D9 2F04 MOV R16,R20
00DA 2711 CLR R17
00DB DF9F RCALL _LCD_write_char
00DC 940E04E9 CALL pop_gset2
00DE 9508 RET
(0064) }
(0065)
(0066) void LCD_init(void) //液晶初始化
(0067) {
(0068) delay_nms(30);
_LCD_init:
00DF E10E LDI R16,0x1E
00E0 D373 RCALL _delay_nms
(0069) LCD_write_char(0x28,0); //4位显示
00E1 2722 CLR R18
00E2 2733 CLR R19
00E3 E208 LDI R16,0x28
00E4 E010 LDI R17,0
00E5 DF95 RCALL _LCD_write_char
(0070) LCD_write_char(0x0c,0); //显示开
00E6 2722 CLR R18
00E7 2733 CLR R19
00E8 E00C LDI R16,0xC
00E9 E010 LDI R17,0
00EA DF90 RCALL _LCD_write_char
(0071) LCD_write_char(0x01,0); //清屏
00EB 2722 CLR R18
00EC 2733 CLR R19
00ED E001 LDI R16,1
00EE E010 LDI R17,0
00EF DF8B RCALL _LCD_write_char
(0072) delay_nms(30);
00F0 E10E LDI R16,0x1E
00F1 D362 RCALL _delay_nms
00F2 9508 RET
_LCD_write_string:
s --> R20
y --> R10
x --> R22
00F3 940E04F9 CALL push_gset3
00F5 2EA2 MOV R10,R18
00F6 2F60 MOV R22,R16
00F7 814E LDD R20,Y+6
00F8 815F LDD R21,Y+7
(0073) }
(0074)
(0075) void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)
(0076) {
(0077) LCD_set_xy( x, y); //写地址
00F9 2D2A MOV R18,R10
00FA 2F06 MOV R16,R22
00FB DFD0 RCALL _LCD_set_xy
00FC C008 RJMP 0x0105
(0078)
(0079) while (*s) // 写显示字符
(0080) {
(0081) LCD_write_char(0, *s);
00FD 01FA MOVW R30,R20
00FE 8120 LDD R18,Z+0
00FF 2733 CLR R19
0100 2700 CLR R16
0101 2711 CLR R17
0102 DF78 RCALL _LCD_write_char
(0082) s++;
0103 5F4F SUBI R20,0xFF
0104 4F5F SBCI R21,0xFF
0105 01FA MOVW R30,R20
0106 8020 LDD R2,Z+0
0107 2022 TST R2
0108 F7A1 BNE 0x00FD
0109 940E04EC CALL pop_gset3
010B 9508 RET
FILE: E:\资料文件\MCU\myLC\LC.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include <stdlib.h>
(0004) #include "LCD.h"
(0005)
(0006) #define C1 1 //C1=1uF
(0007) #define L1 100 //L1=100uH
(0008)
(0009) unsigned int last_TCNT1,Cx,Lx;
(0010) unsigned int Cn; //分布电容,单位pf
(0011) unsigned char buf[8]="";
(0012)
(0013) /*------------------------------函数原型声明------------------------------*/
(0014) void delay_nus (unsigned char n);
(0015) void delay_nms (unsigned char n);
(0016) void timer1_init (void);
(0017) void timer2_init (void);
(0018) void calc_Cn (void);
(0019) void calc_Cx (void);
(0020) void calc_Lx (void);
(0021) /*------------------------------------------------------------------------*/
(0022)
(0023) void main(void)
(0024) {
(0025) unsigned char k=5;
_main:
k --> R20
010C E045 LDI R20,5
(0026) /*----取消-----
(0027) OSCCAL=0xA9;
(0028) -------------*/
(0029)
(0030) DDRA|=LCD_DATA; // 数据为输出
010D B38A IN R24,0x1A
010E 6F80 ORI R24,0xF0
010F BB8A OUT 0x1A,R24
(0031) DDRC|=LCD_RS|LCD_EN; //置位RS和EN
0110 B384 IN R24,0x14
0111 6083 ORI R24,3
0112 BB84 OUT 0x14,R24
(0032) DDRD=0x00;
0113 2422 CLR R2
0114 BA21 OUT 0x11,R2
(0033) PORTD=0xFF;
0115 EF8F LDI R24,0xFF
0116 BB82 OUT 0x12,R24
(0034) LCD_init();
0117 DFC7 RCALL _LCD_init
0118 C002 RJMP 0x011B
(0035)
(0036) while (--k)
(0037) delay_nms(100);
0119 E604 LDI R16,0x64
011A D339 RCALL _delay_nms
011B 2F84 MOV R24,R20
011C 5081 SUBI R24,1
011D 2F48 MOV R20,R24
011E 2388 TST R24
011F F7C9 BNE 0x0119
(0038)
(0039) CLI(); //disable all interrupts
0120 94F8 BCLR 7
(0040) timer1_init();
0121 D086 RCALL _timer1_init
(0041) timer2_init();
0122 D08D RCALL _timer2_init
(0042) MCUCR = 0x00;
0123 2422 CLR R2
0124 BE25 OUT 0x35,R2
(0043) GICR = 0x00;
0125 BE2B OUT 0x3B,R2
(0044) TIMSK = 0x40; //timer interrupt sources
0126 E480 LDI R24,0x40
0127 BF89 OUT 0x39,R24
(0045) SEI();
0128 9478 BSET 7
(0046)
(0047) LCD_write_char(0x01,0);
0129 2722 CLR R18
012A 2733 CLR R19
012B E001 LDI R16,1
012C E010 LDI R17,0
012D DF4D RCALL _LCD_write_char
(0048) delay_nms(2);
012E E002 LDI R16,2
012F D324 RCALL _delay_nms
(0049) while(1);
0130 CFFF RJMP 0x0130
0131 9508 RET
_timer2_ovf_isr:
0132 940E0556 CALL push_lset
0134 9722 SBIW R28,2
(0050) }
(0051)
(0052) #pragma interrupt_handler timer2_ovf_isr:5
(0053) void timer2_ovf_isr(void)
(0054) {
(0055) TCCR2 = 0x00; //stop Timer1
0135 2422 CLR R2
0136 BC25 OUT 0x25,R2
(0056) TCCR1B= 0x00; //stop Timer2
0137 BC2E OUT 0x2E,R2
(0057) last_TCNT1=TCNT1;
0138 B42C IN R2,0x2C
0139 B43D IN R3,0x2D
013A 9230009B STS last_TCNT1+1,R3
013C 9220009A STS last_TCNT1,R2
(0058)
(0059) if((PIND|0xFE)==0xFE) //PORTD.0为0,校准模式,不接Cx和Lx
013E B380 IN R24,0x10
013F 6F8E ORI R24,0xFE
0140 3F8E CPI R24,0xFE
0141 F599 BNE 0x0175
(0060) {
(0061) LCD_write_char(0x01,0);
0142 2722 CLR R18
0143 2733 CLR R19
0144 E001 LDI R16,1
0145 E010 LDI R17,0
0146 DF34 RCALL _LCD_write_char
(0062) delay_nms(2);
0147 E002 LDI R16,2
0148 D30B RCALL _delay_nms
(0063) LCD_set_xy(0,0);
0149 2722 CLR R18
014A 2700 CLR R16
014B DF80 RCALL _LCD_set_xy
(0064)
(0065) LCD_write_char(0,'C');
014C E423 LDI R18,0x43
014D E030 LDI R19,0
014E 2700 CLR R16
014F 2711 CLR R17
0150 DF2A RCALL _LCD_write_char
(0066) LCD_write_char(0,'n');
0151 E62E LDI R18,0x6E
0152 E030 LDI R19,0
0153 2700 CLR R16
0154 2711 CLR R17
0155 DF25 RCALL _LCD_write_char
(0067) LCD_write_char(0,'=');
0156 E32D LDI R18,0x3D
0157 E030 LDI R19,0
0158 2700 CLR R16
0159 2711 CLR R17
015A DF20 RCALL _LCD_write_char
(0068) calc_Cn();
015B D05C RCALL _calc_Cn
(0069)
(0070) LCD_write_string(0,1,"TCNT1=");
015C E688 LDI R24,0x68
015D E090 LDI R25,0
015E 8399 STD Y+1,R25
015F 8388 STD Y+0,R24
0160 E021 LDI R18,1
0161 2700 CLR R16
0162 DF90 RCALL _LCD_write_string
(0071) LCD_write_string(1,1,itoa(buf,last_TCNT1,10));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -