📄 ps2icc.lst
字号:
__start:
__text_start:
0723 E5CF LDI R28,0x5F
0724 E0D2 LDI R29,2
0725 BFCD OUT 0x3D,R28
0726 BFDE OUT 0x3E,R29
0727 51C0 SUBI R28,0x10
0728 40D0 SBCI R29,0
0729 EA0A LDI R16,0xAA
072A 8308 STD Y+0,R16
072B 2400 CLR R0
072C E6EA LDI R30,0x6A
072D E0F0 LDI R31,0
072E E010 LDI R17,0
072F 38E4 CPI R30,0x84
0730 07F1 CPC R31,R17
0731 F011 BEQ 0x0734
0732 9201 ST R0,Z+
0733 CFFB RJMP 0x072F
0734 8300 STD Z+0,R16
0735 E3EC LDI R30,0x3C
0736 E0FE LDI R31,0xE
0737 E6A0 LDI R26,0x60
0738 E0B0 LDI R27,0
0739 E01E LDI R17,0xE
073A 34E6 CPI R30,0x46
073B 07F1 CPC R31,R17
073C F021 BEQ 0x0741
073D 95C8 LPM
073E 9631 ADIW R30,1
073F 920D ST R0,X+
0740 CFF9 RJMP 0x073A
0741 D494 RCALL _main
_exit:
0742 CFFF RJMP _exit
_DelayMs:
temp --> R20
time --> R16
0743 D609 RCALL push_gset1
FILE: E:\张军\AVR\光盘内容\实例源文件\第十一章程序\PS.C
(0001) //***************************FileName:PS.C*************************//
(0002) //***************************ICCAVR6.30编译************************//
(0003) //**************************MMI Firmware 1.0***********************//
(0004) //**************************Last Update:2005-3*********************//
(0005)
(0006) #include <io8535v.h> //AT90S8535单片机寄存器定义
(0007) #include <macros.h> //宏
(0008) #include "Encode.h" //PS/2键盘译码表
(0009) #include "ZIMO.H" //LCD字模表
(0010) #define uchar unsigned char //数据类型说明
(0011) #define uint unsigned int //数据类型说明
(0012)
(0013) uchar Row=0; //LCD当前行位置计数器
(0014) uchar Column=0; //LCD当前列位置计数器
(0015) uchar R_flag=0; //LCD换行标志;
(0016) uchar Int_Number; //中断计数器;
(0017) uchar Key_Value; //键盘编码值;
(0018) uchar Key_Up; //键盘被释放标志;
(0019) uchar Byte_Flag; //键盘编码接收完成标志;
(0020) uchar Status=0; //定义系统状态0:登陆,1:选择
(0021) uint Voltage_A; //定义A点电压采样值
(0022) uint Voltage_B; //定义B点电压采样值
(0023) uint Voltage_Diff; //定义AB点电压采样差之绝对值
(0024) uchar V_Flag; //定义AB点电压差符号标志
(0025) uchar A_Data[3]; //定义A点电压处理值
(0026) uchar B_Data[3]; //定义B点电压处理值
(0027) uchar AB_Data[3]; //定义AB点电压差处理值
(0028) uchar RE_Password[6]; //输入密码记录
(0029) uchar Password[6]={2,0,0,5,0,3};//系统初试密码:200503
(0030)
(0031) //***************************延时函数**********************//
(0032) void DelayMs(uint time)
(0033) {uint temp;
(0034) for(;time!=0;time--)
0744 C00A RJMP 0x074F
(0035) for(temp=2000;temp!=0;temp--) ;
0745 ED40 LDI R20,0xD0
0746 E057 LDI R21,7
0747 C002 RJMP 0x074A
0748 5041 SUBI R20,1
0749 4050 SBCI R21,0
074A 3040 CPI R20,0
074B 0745 CPC R20,R21
074C F7D9 BNE 0x0748
074D 5001 SUBI R16,1
074E 4010 SBCI R17,0
074F 3000 CPI R16,0
0750 0701 CPC R16,R17
0751 F799 BNE 0x0745
(0036) }
0752 D5FD RCALL pop_gset1
0753 9508 RET
(0037)
(0038) //***************************延时函数**********************//
(0039) void DelayUs(uchar time)
(0040) {uchar temp;
(0041) for(;time!=0;time--)
_DelayUs:
temp --> Y+1
time --> R16
0754 C002 RJMP 0x0757
(0042) NOP();
0755 0000 NOP
0756 950A DEC R16
0757 2300 TST R16
0758 F7E1 BNE 0x0755
(0043) }
0759 9508 RET
(0044)
(0045) //***************************AT90S8535 I/O口初始化*********//
(0046) void Init_IO(void)
(0047) {DDRA=0x00;
_Init_IO:
075A 2422 CLR R2
075B BA2A OUT 0x1A,R2
(0048) PORTA=0x00;
075C BA2B OUT 0x1B,R2
(0049) DDRB=0xff;
075D EF8F LDI R24,0xFF
075E BB87 OUT 0x17,R24
(0050) PORTB=0xff;
075F BB88 OUT 0x18,R24
(0051) DDRC=0xff;
0760 BB84 OUT 0x14,R24
(0052) PORTC=0xff;
0761 BB85 OUT 0x15,R24
(0053) DDRD=0x80;
0762 E880 LDI R24,0x80
0763 BB81 OUT 0x11,R24
(0054) PORTD=0x80;
0764 BB82 OUT 0x12,R24
(0055) }
0765 9508 RET
(0056)
(0057) //***************************A/D转换初始化函数*************//
(0058) void Init_ADC(void)
(0059) {ADMUX=0x00;
_Init_ADC:
0766 2422 CLR R2
0767 B827 OUT 0x07,R2
(0060) ADCSR=0xe6;
0768 EE86 LDI R24,0xE6
0769 B986 OUT 0x06,R24
(0061) }
076A 9508 RET
_ADC_Convert:
temp1 --> R22
temp2 --> R20
Channel --> R20
076B D5F8 RCALL push_gset2
076C 2F40 MOV R20,R16
(0062)
(0063) //***************************A/D转换采样电压值*************//
(0064) //参数说明:
(0065) //Channel:0 A点电压采样;1:B点电压采样;2:A、B电压差值
(0066) //返回值:电压采样值或者A、B点采样差值
(0067) uint ADC_Convert(uchar Channel)
(0068) {uint temp1,temp2;
(0069) if(Channel!=2)
076D 3042 CPI R20,2
076E F081 BEQ 0x077F
(0070) {ADMUX=Channel;
076F B947 OUT 0x07,R20
(0071) DelayUs(10);
0770 E00A LDI R16,0xA
0771 DFE2 RCALL _DelayUs
(0072) temp1=(uint)ADCL;
0772 B164 IN R22,0x04
0773 2777 CLR R23
(0073) temp2=(uint)ADCH;
0774 B145 IN R20,0x05
0775 2755 CLR R21
(0074) temp2=(temp2<<8)+temp1;}
0776 2E24 MOV R2,R20
0777 2E35 MOV R3,R21
0778 2C32 MOV R3,R2
0779 2422 CLR R2
077A 0E26 ADD R2,R22
077B 1E37 ADC R3,R23
077C 2D42 MOV R20,R2
077D 2D53 MOV R21,R3
077E C020 RJMP 0x079F
(0075) else
(0076) if(Voltage_A>Voltage_B)
077F 9020007C LDS R2,_Voltage_B
0781 9030007D LDS R3,_Voltage_B+1
0783 9040007E LDS R4,_Voltage_A
0785 9050007F LDS R5,_Voltage_A+1
0787 1424 CP R2,R4
0788 0435 CPC R3,R5
0789 F440 BCC 0x0792
(0077) {V_Flag=1;
078A E081 LDI R24,1
078B 93800079 STS _V_Flag,R24
(0078) temp2=Voltage_A-Voltage_B;}
078D 2D44 MOV R20,R4
078E 2D55 MOV R21,R5
078F 1942 SUB R20,R2
0790 0953 SBC R21,R3
0791 C00D RJMP 0x079F
(0079) else
(0080) {V_Flag=0;
0792 2422 CLR R2
0793 92200079 STS _V_Flag,R2
(0081) temp2=Voltage_B-Voltage_A;}
0795 9020007E LDS R2,_Voltage_A
0797 9030007F LDS R3,_Voltage_A+1
0799 9140007C LDS R20,_Voltage_B
079B 9150007D LDS R21,_Voltage_B+1
079D 1942 SUB R20,R2
079E 0953 SBC R21,R3
(0082) return(temp2);
079F 2F04 MOV R16,R20
07A0 2F15 MOV R17,R21
07A1 D5A3 RCALL pop_gset2
07A2 9508 RET
_V_Process:
temp1 --> R22
pt --> R20
temp --> R22
07A3 D5C0 RCALL push_gset2
07A4 2F42 MOV R20,R18
07A5 2F53 MOV R21,R19
07A6 2F60 MOV R22,R16
07A7 2F71 MOV R23,R17
(0083) }
(0084)
(0085) //***************************电压数据处理******************//
(0086) //参数说明:
(0087) //temp:A、B点电压采样值或差值;
(0088) //pt[]:转换数据处理,保留两位小数,如3.51(V)。
(0089) void V_Process(uint temp,uchar *pt)
(0090) {uint temp1;
(0091) temp1=temp*5;
07A8 E005 LDI R16,5
07A9 E010 LDI R17,0
07AA 2F26 MOV R18,R22
07AB 2F37 MOV R19,R23
07AC D5D1 RCALL mpy16s
07AD 2F60 MOV R22,R16
07AE 2F71 MOV R23,R17
(0092) pt[0]=temp1/1023; //电压整数值
07AF EF2F LDI R18,0xFF
07B0 E033 LDI R19,3
07B1 D579 RCALL div16u
07B2 2FE4 MOV R30,R20
07B3 2FF5 MOV R31,R21
07B4 8300 STD Z+0,R16
(0093) temp1=temp1%1023;
07B5 EF2F LDI R18,0xFF
07B6 E033 LDI R19,3
07B7 2F06 MOV R16,R22
07B8 2F17 MOV R17,R23
07B9 D56F RCALL mod16u
07BA 2F60 MOV R22,R16
07BB 2F71 MOV R23,R17
(0094) temp1=temp1*10;
07BC E00A LDI R16,0xA
07BD E010 LDI R17,0
07BE 2F26 MOV R18,R22
07BF 2F37 MOV R19,R23
07C0 D5BD RCALL mpy16s
07C1 2F60 MOV R22,R16
07C2 2F71 MOV R23,R17
(0095) pt[1]=temp1/1023; //电压第一位小数值
07C3 EF2F LDI R18,0xFF
07C4 E033 LDI R19,3
07C5 D565 RCALL div16u
07C6 2FE4 MOV R30,R20
07C7 2FF5 MOV R31,R21
07C8 8301 STD Z+1,R16
(0096) temp1=temp1%1023;
07C9 EF2F LDI R18,0xFF
07CA E033 LDI R19,3
07CB 2F06 MOV R16,R22
07CC 2F17 MOV R17,R23
07CD D55B RCALL mod16u
07CE 2F60 MOV R22,R16
07CF 2F71 MOV R23,R17
(0097) temp1=temp1*10;
07D0 E00A LDI R16,0xA
07D1 E010 LDI R17,0
07D2 2F26 MOV R18,R22
07D3 2F37 MOV R19,R23
07D4 D5A9 RCALL mpy16s
07D5 2F60 MOV R22,R16
07D6 2F71 MOV R23,R17
(0098) pt[2]=temp1/1023; //电压第二位小数值
07D7 EF2F LDI R18,0xFF
07D8 E033 LDI R19,3
07D9 D551 RCALL div16u
07DA 2FE4 MOV R30,R20
07DB 2FF5 MOV R31,R21
07DC 8302 STD Z+2,R16
(0099) }
07DD D567 RCALL pop_gset2
07DE 9508 RET
_Check_Password:
j --> R20
i --> R22
pt --> R16
07DF D584 RCALL push_gset2
(0100)
(0101) //***************************密码验证函数******************//
(0102) //参数说明:pt[]:输入密码;
(0103) //返回值:6:密码正确;其他:密码错误;
(0104) uchar Check_Password(uchar *pt)
(0105) {uchar i,j=0;
07E0 2744 CLR R20
(0106) for(i=0;i<6;i++)
07E1 2766 CLR R22
07E2 C010 RJMP 0x07F3
(0107) if(pt[i]==Password[i]) j++;
07E3 E684 LDI R24,0x64
07E4 E090 LDI R25,0
07E5 2FE6 MOV R30,R22
07E6 27FF CLR R31
07E7 0FE8 ADD R30,R24
07E8 1FF9 ADC R31,R25
07E9 8020 LDD R2,Z+0
07EA 2FE6 MOV R30,R22
07EB 27FF CLR R31
07EC 0FE0 ADD R30,R16
07ED 1FF1 ADC R31,R17
07EE 8030 LDD R3,Z+0
07EF 1432 CP R3,R2
07F0 F409 BNE 0x07F2
07F1 9543 INC R20
07F2 9563 INC R22
07F3 3066 CPI R22,6
07F4 F370 BCS 0x07E3
(0108) return(j);
07F5 2F04 MOV R16,R20
07F6 D54E RCALL pop_gset2
07F7 9508 RET
(0109) }
(0110)
(0111) //sbit KEY_CLK=PD^3 //PS/2接口时钟线
(0112) //sbit KEY_DATA=PD^2;//Interrupt
(0113)
(0114) //***************************LCD函数开始********************//
(0115) //sbit DI=PB^0;
(0116) void Set_DI(uchar i)
(0117) {if(i==1) PORTB=PORTB|0x01;
_Set_DI:
i --> R16
07F8 3001 CPI R16,1
07F9 F411 BNE 0x07FC
07FA 9AC0 SBI 0x18,0
07FB C003 RJMP 0x07FF
(0118) else PORTB=PORTB&0xfe;}
07FC B388 IN R24,0x18
07FD 7F8E ANDI R24,0xFE
07FE BB88 OUT 0x18,R24
07FF 9508 RET
(0119)
(0120) //sbit RW=PB^1;
(0121) void Set_RW(uchar i)
(0122) {if(i==1) PORTB=PORTB|0x02;
_Set_RW:
i --> R16
0800 3001 CPI R16,1
0801 F411 BNE 0x0804
0802 9AC1 SBI 0x18,1
0803 C003 RJMP 0x0807
(0123) else PORTB=PORTB&0xfd;}
0804 B388 IN R24,0x18
0805 7F8D ANDI R24,0xFD
0806 BB88 OUT 0x18,R24
0807 9508 RET
(0124)
(0125) //sbit ENABLE=PB^2;
(0126) void Set_EN(uchar i)
(0127) {if(i==1) PORTB=PORTB|0x04;
_Set_EN:
i --> R16
0808 3001 CPI R16,1
0809 F411 BNE 0x080C
080A 9AC2 SBI 0x18,2
080B C003 RJMP 0x080F
(0128) else PORTB=PORTB&0xfb;}
080C B388 IN R24,0x18
080D 7F8B ANDI R24,0xFB
080E BB88 OUT 0x18,R24
080F 9508 RET
(0129)
(0130) //sbit CS1=PB^3;
(0131) void Set_CS1(uchar i)
(0132) {if(i==1) PORTB=PORTB|0x08;
_Set_CS1:
i --> R16
0810 3001 CPI R16,1
0811 F411 BNE 0x0814
0812 9AC3 SBI 0x18,3
0813 C003 RJMP 0x0817
(0133) else PORTB=PORTB&0xf7;}
0814 B388 IN R24,0x18
0815 7F87 ANDI R24,0xF7
0816 BB88 OUT 0x18,R24
0817 9508 RET
(0134)
(0135) //sbit CS2=PB^4;
(0136) void Set_CS2(uchar i)
(0137) {if(i==1) PORTB=PORTB|0x10;
_Set_CS2:
i --> R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -