⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2icc.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -