📄 pro.lst
字号:
0675 9380006C STS counter,R24
0677 3084 CPI R24,4
0678 E0E0 LDI R30,0
0679 079E CPC R25,R30
067A F060 BCS 0x0687
(0467) {
(0468) counter=0;
067B 2422 CLR R2
067C 2433 CLR R3
067D 9230006D STS counter+1,R3
067F 9220006C STS counter,R2
(0469) key_is_ok=1;
0681 E081 LDI R24,1
0682 E090 LDI R25,0
0683 93900071 STS key_is_ok+1,R25
0685 93800070 STS key_is_ok,R24
(0470) }
(0471) if(++AD_COUNT>=5)
0687 9180006A LDS R24,AD_COUNT
0689 9190006B LDS R25,AD_COUNT+1
068B 9601 ADIW R24,1
068C 9390006B STS AD_COUNT+1,R25
068E 9380006A STS AD_COUNT,R24
0690 3085 CPI R24,5
0691 E0E0 LDI R30,0
0692 079E CPC R25,R30
0693 F048 BCS 0x069D
(0472) {
(0473) AD_COUNT=0;
0694 2422 CLR R2
0695 2433 CLR R3
0696 9230006B STS AD_COUNT+1,R3
0698 9220006A STS AD_COUNT,R2
(0474) ad_is_ok=1;
069A E081 LDI R24,1
069B 93800068 STS ad_is_ok,R24
(0475) }
069D 9029 LD R2,Y+
069E BE2F OUT 0x3F,R2
069F 91E9 LD R30,Y+
06A0 9199 LD R25,Y+
06A1 9189 LD R24,Y+
06A2 9039 LD R3,Y+
06A3 9029 LD R2,Y+
06A4 9518 RETI
(0476)
(0477) }
(0478)
(0479)
(0480) void init_devices(void)
(0481) {
(0482) CLI(); //禁止所有中断
_init_devices:
06A5 94F8 BCLR 7
(0483) MCUCR = 0x00;
06A6 2422 CLR R2
06A7 BE25 OUT 0x35,R2
(0484) GICR = 0x00;
06A8 BE2B OUT 0x3B,R2
(0485) port_init();
06A9 DFA3 RCALL _port_init
(0486) Initialize_LCD();
06AA 940E0779 CALL _Initialize_LCD
(0487) timer0_init();
06AC DFAE RCALL _timer0_init
(0488) adc_init();
06AD 940E078B CALL _adc_init
(0489) SEI();//开全局中断
06AF 9478 BSET 7
06B0 9508 RET
(0490) }
(0491)
(0492) //主函数
(0493)
(0494) void main(void)
(0495) {
(0496) uint i=0,keycode=16;
_main:
keycode --> R20
i --> R20
06B1 2744 CLR R20
06B2 2755 CLR R21
06B3 E140 LDI R20,0x10
(0497) init_devices();
06B4 DFF0 RCALL _init_devices
(0498) //在这继续添加你的代码
(0499) system_init();
06B5 DA64 RCALL _system_init
(0500) DAC_DDR=0xff;
06B6 EF8F LDI R24,0xFF
06B7 BB87 OUT 0x17,R24
(0501) DAC_DATA=Set_Value;
06B8 90200076 LDS R2,Set_Value
06BA 90300077 LDS R3,Set_Value+1
06BC BA28 OUT 0x18,R2
06BD C01C RJMP 0x06DA
(0502)
(0503) while(1)
(0504) {
(0505) Display_VOL();
06BE DAAD RCALL _Display_VOL
(0506) function_DAC();
06BF DE58 RCALL _function_DAC
(0507) control();
06C0 DEE1 RCALL _control
(0508) signal_function();
06C1 DD89 RCALL _signal_function
(0509) control();
06C2 DEDF RCALL _control
(0510) if(key_is_ok)
06C3 90200070 LDS R2,key_is_ok
06C5 90300071 LDS R3,key_is_ok+1
06C7 2022 TST R2
06C8 F411 BNE 0x06CB
06C9 2033 TST R3
06CA F039 BEQ 0x06D2
(0511) {
(0512) read_keyvalue();
06CB DC3B RCALL _read_keyvalue
(0513) key_is_ok=0;
06CC 2422 CLR R2
06CD 2433 CLR R3
06CE 92300071 STS key_is_ok+1,R3
06D0 92200070 STS key_is_ok,R2
(0514) }
(0515) if(ad_is_ok)
06D2 90200068 LDS R2,ad_is_ok
06D4 2022 TST R2
06D5 F021 BEQ 0x06DA
(0516) {
(0517) ad_is_ok=0;
06D6 2422 CLR R2
06D7 92200068 STS ad_is_ok,R2
(0518) ADCSRA|=BIT(ADSC);
06D9 9A36 SBI 0x06,6
06DA CFE3 RJMP 0x06BE
06DB 9508 RET
FILE: E:\张秋伟\我的实验\数控电压源\boxing.c
(0001) //包含所需头文件
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include "delay.h"
(0005)
(0006) /*------宏定义------*/
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) #define BYTE unsigned char
(0010)
(0011) #define DAC_DATA PORTB
(0012) #define DAC_DDR DDRB
(0013)
(0014) extern uchar dec_to_bin(uchar data);
(0015)
(0016) const BYTE Sin[]={0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,
(0017) 0x0e,0x10,0x12,0x14,0x16,0x18,0x1a,
(0018) 0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,
(0019) 0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,
(0020) 0x38,0x3a,0x3c,0x3d,0x3f,0x41,0x43,
(0021) 0x45,0x47,0x49,0x4b,0x4d,0x4f,0x51,
(0022) 0x53,0x54,0x56,0x58,0x5a,0x5c,0x5e,
(0023) 0x60,0x62,0x63,0x65,0x67,0x69,0x6b,
(0024) 0x6d,0x6e,0x70,0x72,0x74,0x76,0x77,
(0025) 0x79,0x7b,0x7d,0x7e,0x80,0x82,0x84,
(0026) 0x85,0x87,0x89,0x8a,0x8c,0x8e,0x8f,
(0027) 0x91,0x93,0x94,0x96,0x98,0x99,0x9b,
(0028) 0x9c,0x9e,0x9f,0xa1,0xa3,0xa4,0xa6,
(0029) 0xa7,0xa9,0xaa,0xac,0xad,0xaf,0xb0,
(0030) 0xb1,0xb3,0xb4,0xb6,0xb7,0xb9,0xba,
(0031) 0xbb,0xbd,0xbe,0xbf,0xc1,0xc2,0xc3,
(0032) 0xc4,0xc6,0xc7,0xc8,0xc9,0xcb,0xcc,
(0033) 0xcd,0xce,0xcf,0xd1,0xd2,0xd3,0xd4,
(0034) 0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,
(0035) 0xdd,0xde,0xde,0xdf,0xe0,0xe1,0xe2,
(0036) 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe8,
(0037) 0xe9,0xea,0xeb,0xec,0xec,0xed,0xee,
(0038) 0xef,0xef,0xf0,0xf1,0xf1,0xf2,0xf3,
(0039) 0xf3,0xf4,0xf4,0xf5,0xf5,0xf6,0xf6,
(0040) 0xf7,0xf7,0xf8,0xf8,0xf9,0xf9,0xfa,
(0041) 0xfa,0xfa,0xfb,0xfb,0xfc,0xfc,0xfc,
(0042) 0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,
(0043) 0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,
(0044) 0xff,0xff,0xff,0xff,0xff,0xff};
(0045)
(0046) void saw(void)//锯齿波发生函数
(0047) {
(0048) uchar i,data;
(0049) for(i=0;i<255;i++)
_saw:
data --> Y+1
i --> R16
06DC 2700 CLR R16
06DD C002 RJMP 0x06E0
(0050) {
(0051) //data=dec_to_bin(i);
(0052) DAC_DATA=i;
06DE BB08 OUT 0x18,R16
06DF 9503 INC R16
06E0 3F0F CPI R16,0xFF
06E1 F3E0 BCS 0x06DE
06E2 9508 RET
(0053) }
(0054) }
(0055)
(0056) void square(void)//方波发生函数
(0057) {
(0058) DAC_DATA=0x00;
_square:
06E3 2422 CLR R2
06E4 BA28 OUT 0x18,R2
(0059) delay_nms(5000);
06E5 E808 LDI R16,0x88
06E6 E113 LDI R17,0x13
06E7 940E010B CALL _delay_nms
(0060) DAC_DATA=0xff;
06E9 EF8F LDI R24,0xFF
06EA BB88 OUT 0x18,R24
(0061) delay_nms(5000);
06EB E808 LDI R16,0x88
06EC E113 LDI R17,0x13
06ED 940E010B CALL _delay_nms
06EF 9508 RET
_SIN:
i --> R20
06F0 940E08BE CALL push_gset1
(0062) }
(0063)
(0064) void SIN(void)
(0065) {
(0066) uchar i=0x00;
06F2 2744 CLR R20
(0067) DAC_DATA=Sin[i];
06F3 E584 LDI R24,0x54
06F4 E090 LDI R25,0
06F5 2FE4 MOV R30,R20
06F6 27FF CLR R31
06F7 0FE8 ADD R30,R24
06F8 1FF9 ADC R31,R25
06F9 91E4 LPM R30,0(Z)
06FA BBE8 OUT 0x18,R30
(0068) i++;
06FB 9543 INC R20
(0069) if(i==200)
06FC 3C48 CPI R20,0xC8
06FD F409 BNE 0x06FF
(0070) {
(0071) i=0x00;
06FE 2744 CLR R20
(0072) }
(0073) delay_nms(5000);
06FF E808 LDI R16,0x88
0700 E113 LDI R17,0x13
0701 940E010B CALL _delay_nms
0703 940E08C1 CALL pop_gset1
0705 9508 RET
_delay_ms:
i --> R20
n --> R22
0706 940E08BC CALL push_gset2
0708 01B8 MOVW R22,R16
FILE: E:\张秋伟\我的实验\数控电压源\LCD1602.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "delay.h"
(0004) /*
(0005) 数据口接PB口:PB0--DB0,PB1--DB1,.....PB7--DB7;
(0006) 控制总线RS--PD3 RW--PD5 EN--PD4
(0007)
(0008) */
(0009) #define LCDPORT PORTC
(0010) #define LCDDDR DDRC
(0011) #define LCDPIN PINC
(0012)
(0013) #define RS_CLR PORTA&= ~(1 << PA0)
(0014) #define RS_SET PORTA |= (1 << PA0)
(0015)
(0016) #define RW_CLR PORTA &= ~(1 << PA1)
(0017) #define RW_SET PORTA |= (1 << PA1)
(0018)
(0019) #define EN_CLR PORTA &= ~(1 << PA2)
(0020) #define EN_SET PORTA |= (1 << PA2)
(0021) #define Clear_Screen Write_Command(0x01)
(0022)
(0023)
(0024) void delay_ms(unsigned int n)
(0025) {
(0026) unsigned int i;
(0027) for(i=0;i<n;i++)delay_1ms();
0709 2744 CLR R20
070A 2755 CLR R21
070B C004 RJMP 0x0710
070C 940E0101 CALL _delay_1ms
070E 5F4F SUBI R20,0xFF
070F 4F5F SBCI R21,0xFF
0710 1746 CP R20,R22
0711 0757 CPC R21,R23
0712 F3C8 BCS 0x070C
0713 940E08AD CALL pop_gset2
0715 9508 RET
(0028) }
(0029)
(0030) void En_Toggle()//产生一个使能脉冲
(0031) {
(0032) EN_CLR; //拉低使能位,产生一个下降沿
_En_Toggle:
0716 98DA CBI 0x1B,2
(0033) delay_ms(5);//保持低电平一定时间
0717 E005 LDI R16,5
0718 E010 LDI R17,0
0719 DFEC RCALL _delay_ms
(0034) EN_SET; //拉高使能位
071A 9ADA SBI 0x1B,2
(0035) delay_ms(3);//保持高电平一定时间
071B E003 LDI R16,3
071C E010 LDI R17,0
071D DFE8 RCALL _delay_ms
(0036) EN_CLR; //拉低使能位,产生一个下降沿
071E 98DA CBI 0x1B,2
071F 9508 RET
(0037) }
(0038)
(0039) /* 不断检测LCD的忙标志 (BF),直到其为0,表示可以执行下一条指令*/
(0040) void Wait_Until_Ready(void)
(0041) {
(0042) RW_SET; //设为读状态
_Wait_Until_Ready:
0720 9AD9 SBI 0x1B,1
(0043) RS_CLR; //所读为状态位
0721 98D8 CBI 0x1B,0
(0044) LCDDDR&=~(1<<DDD7);//单片机设为输入,用以读取LCD的忙标志
0722 98A7 CBI 0x14,7
(0045) EN_SET;
0723 9ADA SBI 0x1B,2
(0046) delay_ms(5);
0724 E005 LDI R16,5
0725 E010 LDI R17,0
0726 DFDF RCALL _delay_ms
(0047) while((LCDPIN&0x80)==0x80) ; //不断循环,直至BF=0
0727 B223 IN R2,0x13
0728 2433 CLR R3
0729 FC27 SBRC R2,7
072A CFFC RJMP 0x0727
(0048) EN_CLR;
072B 98DA CBI 0x1B,2
(0049) LCDDDR|=(1<<DDD7);
072C 9AA7 SBI 0x14,7
072D 9508 RET
_Write_Command:
Command --> R20
072E 940E08BE CALL push_gset1
0730 2F40 MOV R20,R16
(0050) }
(0051)
(0052) void Write_Command(unsigned char Command) //向LCD写入命令字
(0053) {
(0054) RS_CLR; //写入的是命令
0731 98D8 CBI 0x1B,0
(0055) RW_CLR; //置为写状态
0732 98D9 CBI 0x1B,1
(0056) LCDDDR=0xFF;
0733 EF8F LDI R24,0xFF
0734 BB84 OUT 0x14,R24
(0057) LCDPORT=Command; //写命令字
0735 BB45 OUT 0x15,R20
(0058) delay_ms(2);
0736 E002 LDI R16,2
0737 E010 LDI R17,0
0738 DFCD RCALL _delay_ms
(0059) En_Toggle();
0739 DFDC RCALL _En_Toggle
(0060) Wait_Until_Ready(); //等待指令执行完毕
073A DFE5 RCALL _Wait_Until_Ready
073B 940E08C1 CALL pop_gset1
073D 9508 RET
_Write_Data:
Data --> R20
073E 940E08BE CALL push_gset1
0740 01A8 MOVW R20,R16
(0061) }
(0062)
(0063) void Write_Data(unsigned int Data)
(0064) {
(0065) RS_SET;
0741 9AD8 SBI 0x1B,0
(0066) RW_CLR; //写入的是数据
0742 98D9 CBI 0x1B,1
(0067) LCDDDR=0xFF;
0743 EF8F LDI R24,0xFF
0744 BB84 OUT 0x14,R24
(0068) delay_ms(2);
0745 E002 LDI R16,2
0746 E010 LDI R17,0
0747 DFBE RCALL _delay_ms
(0069) LCDPORT=Data;
0748 BB45 OUT 0x15,R20
(0070) En_Toggle();
0749 DFCC RCALL _En_Toggle
(0071) Wait_Until_Ready();
074A DFD5 RCALL _Wait_Until_Ready
074B 940E08C1 CALL pop_gset1
074D 9508 RET
_Write_Position:
p --> R20
colum --> R22
row --> R20
074E 940E08BC CALL push_gset2
0750 01B9 MOVW R22,R18
0751 01A8 MOVW R20,R16
(0072) }
(0073)
(0074) void Write_Position(unsigned int row,unsigned int colum)//设字符位置
(0075) {
(0076) unsigned char p;
(0077) if(row==1)
0752 3041 CPI R20,1
0753 E0E0 LDI R30,0
0754 075E CPC R21,R30
0755 F441 BNE 0x075E
(0078) {
(0079) p=0x80+colum-1;
0756 2F46 MOV R20,R22
0757 5840 SUBI R20,0x80
0758 4F5F SBCI R21,0xFF
0759 5041 SUBI R20,1
075A 4050 SBCI R21,0
(0080) Write_Command(p);
075B 2F04 MOV R16,R20
075C DFD1 RCALL _Write_Command
(0081) }
075D C007 RJMP 0x0765
(0082) else
(0083) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -