+_-

来自「avr单片机icc写的密码锁」· 代码 · 共 1,672 行 · 第 1/4 页

TXT
1,672
字号
Interrupt Vectors
    00000 940C 0070 JMP	__start|__text_start
    00002 940C 0203 JMP	_miao2

Program Code (text area)
__start|__text_start:
    00070 E5CF      LDI	R28,0x5F
    00071 E0D4      LDI	R29,4
    00072 BFCD      OUT	0x3D,R28
    00073 BFDE      OUT	0x3E,R29
    00074 51CE      SUBI	R28,0x1E
    00075 40D0      SBCI	R29,0
    00076 EA0A      LDI	R16,0xAA
    00077 8308      ST	Y,R16
    00078 2400      CLR	R0
    00079 EEEC      LDI	R30,0xEC
    0007A E0F0      LDI	R31,0
    0007B E010      LDI	R17,0
    0007C 3EEC      CPI	R30,0xEC
    0007D 07F1      CPC	R31,R17
    0007E F011      BEQ	0x0081
    0007F 9201      ST	Z+,R0
    00080 CFFB      RJMP	0x007C
    00081 8300      ST	Z,R16
    00082 E5E4      LDI	R30,0x54
    00083 E0F0      LDI	R31,0
    00084 E6A0      LDI	R26,0x60
    00085 E0B0      LDI	R27,0
    00086 E010      LDI	R17,0
    00087 E000      LDI	R16,0
    00088 BF0B      OUT	0x3B,R16
    00089 3EE0      CPI	R30,0xE0
    0008A 07F1      CPC	R31,R17
    0008B F021      BEQ	0x0090
    0008C 95C8      LPM
    0008D 9631      ADIW	R30,1
    0008E 920D      ST	X+,R0
    0008F CFF9      RJMP	0x0089
    00090 940E 02D5 CALL	_main
_exit:
    00092 CFFF      RJMP	_exit
_delay:
  i                    --> R20
  US                   --> R10
    00093 940E 04F0 CALL	push_xgset300C
    00095 0158      MOVW	R10,R16
FILE: C:\Users\Think\Desktop\新建文件夹\密码输入2\yejing.c
(0001) //#include <iom16v.h> 
(0002) //#include <macros.h>
(0003) //#pragma  interrupt_handler  miao9:9
(0004) //#pragma  interrupt_handler  miao2:2
(0005) //液晶命名
(0006) //#define  uchar unsigned char
(0007) //#define  uint  unsigned int
(0008) 
(0009) //#define SET_PSB PORTA|=BIT(3)
(0010) //#define CLR_PSB PORTA&=~BIT(3)
(0011) 
(0012) #define SET_CS PORTA|=BIT(4)
(0013) #define CLR_CS PORTA&=~BIT(4)
(0014) 
(0015) #define SET_SID PORTA|=BIT(5)
(0016) #define CLR_SID PORTA&=~BIT(5)
(0017) 
(0018) #define SET_SCLK PORTA|=BIT(6)
(0019) #define CLR_SCLK PORTA&=~BIT(6)
(0020) /****************************************************************
(0021)                微秒延时                          
(0022) *****************************************************************/
(0023) 
(0024) void delay(uint US)		  
(0025) {
(0026)  uint i;
(0027)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    00096 E005      LDI	R16,5
    00097 E010      LDI	R17,0
    00098 0195      MOVW	R18,R10
    00099 940E 04E0 CALL	empy16s
    0009B 0158      MOVW	R10,R16
    0009C 94B6      LSR	R11
    0009D 94A7      ROR	R10
    0009E 94B6      LSR	R11
    0009F 94A7      ROR	R10
(0028)  for( i=0;i<US;i++); 
    000A0 2744      CLR	R20
    000A1 2755      CLR	R21
    000A2 C002      RJMP	0x00A5
    000A3 5F4F      SUBI	R20,0xFF
    000A4 4F5F      SBCI	R21,0xFF
    000A5 154A      CP	R20,R10
    000A6 055B      CPC	R21,R11
    000A7 F3D8      BCS	0x00A3
    000A8 940C 04F5 JMP	pop_xgset300C
_delay_ms:
  i                    --> R20
  j                    --> R22
  ms                   --> R16
    000AA 940E 04FA CALL	push_xgsetF000
(0029) }
(0030) /****************************************************************
(0031)                毫秒延时                          
(0032) *****************************************************************/
(0033) 
(0034) void delay_ms(uint ms)
(0035) {
(0036)    uint i,j;
(0037)    for(i=0;i<ms;i++)
    000AC 2744      CLR	R20
    000AD 2755      CLR	R21
    000AE C00B      RJMP	0x00BA
(0038)      {
(0039) 	   for(j=0;j<1141;j++);
    000AF 2766      CLR	R22
    000B0 2777      CLR	R23
    000B1 C002      RJMP	0x00B4
    000B2 5F6F      SUBI	R22,0xFF
    000B3 4F7F      SBCI	R23,0xFF
    000B4 3765      CPI	R22,0x75
    000B5 E0E4      LDI	R30,4
    000B6 077E      CPC	R23,R30
    000B7 F3D0      BCS	0x00B2
    000B8 5F4F      SUBI	R20,0xFF
    000B9 4F5F      SBCI	R21,0xFF
    000BA 1740      CP	R20,R16
    000BB 0751      CPC	R21,R17
    000BC F390      BCS	0x00AF
    000BD 940C 04FF JMP	pop_xgsetF000
(0040) 	 }
(0041) }
(0042) /****************************************************************
(0043)                 端口初始化                        
(0044) *****************************************************************/
(0045) 
(0046) void port_init12864()
(0047) {
(0048)    DDRA|=BIT(4)|BIT(5)|BIT(6);     //设定a口输出
_port_init12864:
    000BF B38A      IN	R24,0x1A
    000C0 6780      ORI	R24,0x70
    000C1 BB8A      OUT	0x1A,R24
(0049)    PORTA&=0X8F;    //a口输出低
    000C2 B38B      IN	R24,0x1B
    000C3 788F      ANDI	R24,0x8F
    000C4 BB8B      OUT	0x1B,R24
(0050)                   
(0051)    //DDRB=0XFF;     //设定b口输出
(0052)    //PORTB=0X00;    //输出低
(0053)    
(0054)    SET_CS;        //片选
    000C5 9ADC      SBI	0x1B,4
    000C6 9508      RET
(0055)    //SET_SCLK;
(0056) 
(0057) }
(0058) /****************************************************************
(0059)                 液晶屏初始化                         
(0060) *****************************************************************/
(0061) 
(0062) void lcd_init12864()
(0063) {
(0064)    //CLR_PSB;          //当PSB为低时 液晶处于串行数据模式
(0065)    write_com12864(0x30);  //功能设定:8位接口控制位,基本指令集
_lcd_init12864:
    000C7 E300      LDI	R16,0x30
    000C8 E010      LDI	R17,0
    000C9 D033      RCALL	_write_com12864
(0066)    delay(5);
    000CA E005      LDI	R16,5
    000CB E010      LDI	R17,0
    000CC DFC6      RCALL	_delay
(0067)    write_com12864(0x0C);  //显示开关设置:整体显示开,游标显示关,正常显示
    000CD E00C      LDI	R16,0xC
    000CE E010      LDI	R17,0
    000CF D02D      RCALL	_write_com12864
(0068)    delay(5);
    000D0 E005      LDI	R16,5
    000D1 E010      LDI	R17,0
    000D2 DFC0      RCALL	_delay
(0069)    write_com12864(0x01);  //清除显示 
    000D3 E001      LDI	R16,1
    000D4 E010      LDI	R17,0
    000D5 D027      RCALL	_write_com12864
(0070)    delay(5);
    000D6 E005      LDI	R16,5
    000D7 E010      LDI	R17,0
    000D8 CFBA      RJMP	_delay
_sendbyte12864:
  t                    --> R20
  byte                 --> R10
    000D9 940E 04F0 CALL	push_xgset300C
    000DB 2EA0      MOV	R10,R16
(0071) }
(0072) 
(0073) /*****************************************************************
(0074)                字节传送,一个字节一个传
(0075) ******************************************************************/
(0076) void sendbyte12864(uchar byte)
(0077) {
(0078) uint  t;
(0079)   for(t=8;t>0;t--)
    000DC E048      LDI	R20,0x8
    000DD E050      LDI	R21,0
    000DE C019      RJMP	0x00F8
(0080)    {
(0081)       CLR_SCLK;
    000DF 98DE      CBI	0x1B,6
(0082) 	  if(byte & BIT(t-1)) SET_SID;
    000E0 019A      MOVW	R18,R20
    000E1 5021      SUBI	R18,1
    000E2 4030      SBCI	R19,0
    000E3 E001      LDI	R16,1
    000E4 E010      LDI	R17,0
    000E5 940E 0512 CALL	lsl16
    000E7 2C2A      MOV	R2,R10
    000E8 2433      CLR	R3
    000E9 2220      AND	R2,R16
    000EA 2231      AND	R3,R17
    000EB 2022      TST	R2
    000EC F411      BNE	0x00EF
    000ED 2033      TST	R3
    000EE F011      BEQ	0x00F1
    000EF 9ADD      SBI	0x1B,5
    000F0 C001      RJMP	0x00F2
(0083) 	  else  CLR_SID;
    000F1 98DD      CBI	0x1B,5
(0084)       delay(2);
    000F2 E002      LDI	R16,2
    000F3 E010      LDI	R17,0
    000F4 DF9E      RCALL	_delay
(0085)       SET_SCLK;
    000F5 9ADE      SBI	0x1B,6
    000F6 5041      SUBI	R20,1
    000F7 4050      SBCI	R21,0
    000F8 3040      CPI	R20,0
    000F9 0745      CPC	R20,R21
    000FA F721      BNE	0x00DF
    000FB 940C 04F5 JMP	pop_xgset300C
_write_com12864:
  com                  --> R20
    000FD 934A      ST	-Y,R20
    000FE 2F40      MOV	R20,R16
(0086)    }
(0087) 
(0088) }
(0089) /****************************************************************
(0090)                   写指令函数                   
(0091) *****************************************************************/	
(0092) 
(0093) void write_com12864(uchar com)
(0094) {  
(0095)    //SET_CS;
(0096)    sendbyte12864(0xf8);  //定义写指令写命令
    000FF EF08      LDI	R16,0xF8
    00100 DFD8      RCALL	_sendbyte12864
(0097)    delay(2);
    00101 E002      LDI	R16,2
    00102 E010      LDI	R17,0
    00103 DF8F      RCALL	_delay
(0098)    sendbyte12864(com&0xf0);//先写高四位
    00104 2F04      MOV	R16,R20
    00105 7F00      ANDI	R16,0xF0
    00106 DFD2      RCALL	_sendbyte12864
(0099)    delay(2);
    00107 E002      LDI	R16,2
    00108 E010      LDI	R17,0
    00109 DF89      RCALL	_delay
(0100)    sendbyte12864(com<<4); //接写低四位
    0010A 2F04      MOV	R16,R20
    0010B 700F      ANDI	R16,0xF
    0010C 9502      SWAP	R16
    0010D DFCB      RCALL	_sendbyte12864
(0101)    delay(2);
    0010E E002      LDI	R16,2
    0010F E010      LDI	R17,0
    00110 DF82      RCALL	_delay
    00111 9149      LD	R20,Y+
    00112 9508      RET
_write_dat12864:
  dat                  --> R20
    00113 934A      ST	-Y,R20
    00114 2F40      MOV	R20,R16
(0102)    //CLR_CS;
(0103) }
(0104) /****************************************************************
(0105)                    写字数据指令                       
(0106) *****************************************************************/
(0107) 
(0108) void write_dat12864(uchar dat)
(0109) {  
(0110)    //SET_CS;
(0111)    sendbyte12864(0xfa);
    00115 EF0A      LDI	R16,0xFA
    00116 DFC2      RCALL	_sendbyte12864
(0112)    delay(2);
    00117 E002      LDI	R16,2
    00118 E010      LDI	R17,0
    00119 DF79      RCALL	_delay
(0113)    sendbyte12864(dat&0xf0);
    0011A 2F04      MOV	R16,R20
    0011B 7F00      ANDI	R16,0xF0
    0011C DFBC      RCALL	_sendbyte12864
(0114)    delay(2);
    0011D E002      LDI	R16,2
    0011E E010      LDI	R17,0
    0011F DF73      RCALL	_delay
(0115)    sendbyte12864(dat<<4);
    00120 2F04      MOV	R16,R20
    00121 700F      ANDI	R16,0xF
    00122 9502      SWAP	R16
    00123 DFB5      RCALL	_sendbyte12864
(0116)    delay(2);
    00124 E002      LDI	R16,2
    00125 E010      LDI	R17,0
    00126 DF6C      RCALL	_delay
    00127 9149      LD	R20,Y+
    00128 9508      RET
_lcd_pos12864:
  x                    --> R20
  y                    --> R10
    00129 940E 0504 CALL	push_xgsetF00C
    0012B 2F42      MOV	R20,R18
    0012C 2EA0      MOV	R10,R16
(0117)   //CLR_CS;
(0118) }
(0119) /****************************************************************
(0120)                     液晶定位函数                     
(0121) *****************************************************************/
(0122) 
(0123) void lcd_pos12864(uchar y,uchar x)
(0124) {
(0125)    switch(y)
    0012D 2D6A      MOV	R22,R10
    0012E 2777      CLR	R23
    0012F 3060      CPI	R22,0
    00130 0767      CPC	R22,R23
    00131 F069      BEQ	0x013F
    00132 3061      CPI	R22,1
    00133 E0E0      LDI	R30,0
    00134 077E      CPC	R23,R30
    00135 F069      BEQ	0x0143
    00136 3062      CPI	R22,2
    00137 E0E0      LDI	R30,0
    00138 077E      CPC	R23,R30
    00139 F069      BEQ	0x0147
    0013A 3063      CPI	R22,3
    0013B E0E0      LDI	R30,0
    0013C 077E      CPC	R23,R30
    0013D F069      BEQ	0x014B
    0013E C00F      RJMP	0x014E
(0126)    {
(0127)       case 0: write_com12864(0x80+x);break;
    0013F 2F04      MOV	R16,R20
    00140 5800      SUBI	R16,0x80
    00141 DFBB      RCALL	_write_com12864
    00142 C00B      RJMP	0x014E
(0128)       case 1: write_com12864(0x90+x);break;
    00143 2F04      MOV	R16,R20
    00144 5700      SUBI	R16,0x70
    00145 DFB7      RCALL	_write_com12864
    00146 C007      RJMP	0x014E
(0129)       case 2: write_com12864(0x88+x);break;
    00147 2F04      MOV	R16,R20
    00148 5708      SUBI	R16,0x78
    00149 DFB3      RCALL	_write_com12864
    0014A C003      RJMP	0x014E
(0130)       case 3: write_com12864(0x98+x);break;
    0014B 2F04      MOV	R16,R20
    0014C 5608      SUBI	R16,0x68
    0014D DFAF      RCALL	_write_com12864
(0131)       default:break;
    0014E 940C 050B JMP	pop_xgsetF00C
_writeString12864:
  i                    --> R20
  str                  --> R10
    00150 940E 04F0 CALL	push_xgset300C
    00152 0158      MOVW	R10,R16
(0132)    }
(0133) 
(0134) }
(0135) /****************************************************************
(0136)                 12864的写字符串函数                          
(0137) *****************************************************************/
(0138) void writeString12864(uchar * str)
(0139) {
(0140)    uchar i = 0;
    00153 2744      CLR	R20
    00154 C009      RJMP	0x015E
(0141)    while(str[i] != '\0')//判断是否是字符串结束符
(0142)    {
(0143)       write_dat12864(str[i++]);
    00155 2E24      MOV	R2,R20
    00156 2433      CLR	R3
    00157 5F4F      SUBI	R20,0xFF
    00158 2DE2      MOV	R30,R2
    00159 27FF      CLR	R31
    0015A 0DEA      ADD	R30,R10
    0015B 1DFB      ADC	R31,R11
    0015C 8100      LD	R16,Z
    0015D DFB5      RCALL	_write_dat12864
    0015E 2FE4      MOV	R30,R20
    0015F 27FF      CLR	R31
    00160 0DEA      ADD	R30,R10
    00161 1DFB      ADC	R31,R11
    00162 8020      LD	R2,Z
    00163 2022      TST	R2
    00164 F781      BNE	0x0155
    00165 940C 04F5 JMP	pop_xgset300C
_drawpic12864:
  k                    --> Y,+1
  i                    --> R20
  j                    --> R22
  p                    --> R10
    00167 940E 0504 CALL	push_xgsetF00C
    00169 0158      MOVW	R10,R16
(0144)    }
(0145) }
(0146) /****************************************************************
(0147)                画图函数  逐行,顺向,8*16

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?