+_-

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

TXT
1,672
字号
(0148) ****************************************************************/
(0149) void drawpic12864(const uchar *p)
(0150) {
(0151)    uchar i, j, k ;
(0152)    write_com12864(0x36);          //扩充指令集动作
    0016A E306      LDI	R16,0x36
    0016B DF91      RCALL	_write_com12864
(0153)    delay(2);
    0016C E002      LDI	R16,2
    0016D E010      LDI	R17,0
    0016E DF24      RCALL	_delay
(0154)    write_com12864(0x36);
    0016F E306      LDI	R16,0x36
    00170 DF8C      RCALL	_write_com12864
(0155)    delay(2);
    00171 E002      LDI	R16,2
    00172 E010      LDI	R17,0
    00173 DF1F      RCALL	_delay
(0156)    write_com12864(0x3e);			 //找开绘图显示功能
    00174 E30E      LDI	R16,0x3E
    00175 DF87      RCALL	_write_com12864
(0157)    delay(2);
    00176 E002      LDI	R16,2
    00177 E010      LDI	R17,0
    00178 DF1A      RCALL	_delay
(0158)    write_com12864(0x01);			 //清屏
    00179 E001      LDI	R16,1
    0017A DF82      RCALL	_write_com12864
(0159)    for(i=0;i<32;i++)     	 //画上半屏  32行点阵
    0017B 2744      CLR	R20
    0017C C00F      RJMP	0x018C
(0160)    {
(0161) 	  write_com12864(0x80+i);  	 //设定 DDRAM 位址到位址计数器(AC) 写每行点阵都要先写这个指令
    0017D 2F04      MOV	R16,R20
    0017E 5800      SUBI	R16,0x80
    0017F DF7D      RCALL	_write_com12864
(0162) 	  write_com12864(0x80);
    00180 E800      LDI	R16,0x80
    00181 DF7B      RCALL	_write_com12864
(0163) 	  for(j=0;j<16;j++)   	 //每个字节8个点 16*8=128个点  所以上面画了128*32个点
    00182 2766      CLR	R22
    00183 C005      RJMP	0x0189
(0164) 	  {
(0165) 	     write_dat12864(*p++);
    00184 01F5      MOVW	R30,R10
    00185 9101      LD	R16,Z+
    00186 015F      MOVW	R10,R30
    00187 DF8B      RCALL	_write_dat12864
    00188 9563      INC	R22
    00189 3160      CPI	R22,0x10
    0018A F3C8      BCS	0x0184
    0018B 9543      INC	R20
    0018C 3240      CPI	R20,0x20
    0018D F378      BCS	0x017D
(0166) 	  }
(0167)    }
(0168)    for(i=0;i<32;i++)  	  	 //画下半屏
    0018E 2744      CLR	R20
    0018F C00F      RJMP	0x019F
(0169)    {
(0170) 	  write_com12864(0x80+i);
    00190 2F04      MOV	R16,R20
    00191 5800      SUBI	R16,0x80
    00192 DF6A      RCALL	_write_com12864
(0171) 	  write_com12864(0x88);
    00193 E808      LDI	R16,0x88
    00194 DF68      RCALL	_write_com12864
(0172) 	  for(j=0;j<16;j++)
    00195 2766      CLR	R22
    00196 C005      RJMP	0x019C
(0173) 	  {
(0174) 	     write_dat12864(*p++);
    00197 01F5      MOVW	R30,R10
    00198 9101      LD	R16,Z+
    00199 015F      MOVW	R10,R30
    0019A DF78      RCALL	_write_dat12864
    0019B 9563      INC	R22
    0019C 3160      CPI	R22,0x10
    0019D F3C8      BCS	0x0197
    0019E 9543      INC	R20
    0019F 3240      CPI	R20,0x20
    001A0 F378      BCS	0x0190
    001A1 940C 050B JMP	pop_xgsetF00C
FILE: C:\Users\Think\Desktop\新建文件夹\密码输入2\451.c
(0001) /****************************************************************
(0002)                 451LED、矩阵(中断式)                             
(0003) *****************************************************************/
(0004) //端口设置
(0005) #define ch451din0 PORTB&=~BIT(PB0)
(0006) #define ch451din1 PORTB|=BIT(PB0)
(0007) #define ch451dclk0 PORTB&=~BIT(PB1)
(0008) #define ch451dclk1 PORTB|=BIT(PB1)
(0009) #define ch451load0 PORTB&=~BIT(PB2)
(0010) #define ch451load1 PORTB|=BIT(PB2)
(0011) #define ch451dout0 PORTD&=~BIT(PD2)
(0012) #define ch451dout1 PORTD|=BIT(PD2)
(0013) // ch451控制命令集
(0014) #define CH451_RESET     0x0201               //复位
(0015) #define CH451_LEFTMOV   0x0300             //设置移动方式-左移
(0016) #define CH451_LEFTCYC   0x0301             //设置移动方式-左循
(0017) #define CH451_RIGHTMOV  0x0302             //设置移动方式-右移
(0018) #define CH451_RIGHTCYC  0x0303             //设置移动方式-右循        
(0019) #define CH451_SYSOFF    0x0400             //关显示、键盘、看门狗
(0020) #define CH451_SYSON1    0x0401             //开显示
(0021) #define CH451_SYSON2    0x0403             //开显示、键盘
(0022) #define CH451_SYSON3    0x0407             //开显示、键盘、看门狗功能
(0023) #define CH451_DSP       0x0500            //设置默认显示方式
(0024) #define CH451_BCD       0x058f             //设置BCD译码方式
(0025) #define CH451_BCD1      0x05f5           //
(0026) #define CH451_TWINKLE 0X0600           //设置闪烁控制
(0027) #define CH451_ONE 0x0603                 //1、2位闪烁
(0028) #define CH451_FOUR 0x0618                 //4、5位闪烁
(0029) #define CH451_SEVEN 0x06c0                //7、8位闪烁
(0030) //#define CH451_ATWINKLE  0X06ff    //全闪
(0031) 
(0032) // 数码管各位显示
(0033) 
(0034) #define CH451_DIG0 0x0800
(0035) #define CH451_DIG1 0x0900
(0036) #define CH451_DIG2 0x0a00
(0037) #define CH451_DIG3 0x0b00
(0038) #define CH451_DIG4 0x0c00
(0039) #define CH451_DIG5 0x0d00
(0040) #define CH451_DIG6 0x0e00
(0041) #define CH451_DIG7 0x0f00
(0042) //键盘控制
(0043) #define keycode_s1 0x45
(0044) #define keycode_s2 0x4d
(0045) #define keycode_s3 0x55
(0046) #define keycode_s4 0x5d
(0047) #define keycode_s5 0x65
(0048) #define keycode_s6 0x6d
(0049) #define keycode_s7 0x75
(0050) #define keycode_s8 0x7d
(0051) #define keycode_s9 0x46
(0052) #define keycode_s10 0x4e
(0053) #define keycode_s11 0x56
(0054) #define keycode_s12 0x5e
(0055) #define keycode_s13 0x66
(0056) #define keycode_s14 0x6e
(0057) #define keycode_s15 0x76
(0058) #define keycode_s16 0x7e
(0059) #define keycode_s17 0x47
(0060) #define keycode_s18 0x4f
(0061) #define keycode_s19 0x57
(0062) #define keycode_s20 0x5f
(0063) #define keycode_s21 0x67
(0064) #define keycode_s22 0x6f
(0065) #define keycode_s23 0x77
(0066) #define keycode_s24 0x7f
(0067) 
(0068) //端口初始化
(0069) void port_init451()
(0070) {  
(0071)    CLI();
_port_init451:
    001A3 94F8      BCLR	7
(0072)    MCUCR=0X00;
    001A4 2422      CLR	R2
    001A5 BE25      OUT	0x35,R2
(0073)    MCUCSR=0X80;
    001A6 E880      LDI	R24,0x80
    001A7 BF84      OUT	0x34,R24
(0074)    GICR=0X00;
    001A8 BE2B      OUT	0x3B,R2
(0075)    DDRB=0x07;
    001A9 E087      LDI	R24,7
    001AA BB87      OUT	0x17,R24
(0076)    PORTB=0x07;
    001AB BB88      OUT	0x18,R24
    001AC 9508      RET
_ch451_write:
  a                    --> R10
  i                    --> R20
  com                  --> R16
    001AD 92AA      ST	-Y,R10
    001AE 934A      ST	-Y,R20
(0077) 
(0078)    
(0079) }
(0080) 
(0081) //定义一个无符号整型变量存储12字节的命令字
(0082) //写指令程序
(0083) void ch451_write(uint com)
(0084) {
(0085)     uchar i,a;
(0086)     ch451load0;
    001AF 98C2      CBI	0x18,2
(0087) 	for(i=0;i<12;i++)
    001B0 2744      CLR	R20
    001B1 C00E      RJMP	0x01C0
(0088) 	{
(0089) 	   a=com&1;
    001B2 01C8      MOVW	R24,R16
    001B3 7081      ANDI	R24,1
    001B4 7090      ANDI	R25,0
    001B5 2EA8      MOV	R10,R24
(0090)        if(a)
    001B6 2388      TST	R24
    001B7 F011      BEQ	0x01BA
(0091)        {
(0092)           ch451din1;
    001B8 9AC0      SBI	0x18,0
(0093) 	   }
    001B9 C001      RJMP	0x01BB
(0094)        else
(0095)        {
(0096)           ch451din0;
    001BA 98C0      CBI	0x18,0
(0097)        }
(0098)        ch451dclk0;
    001BB 98C1      CBI	0x18,1
(0099)        ch451dclk1;
    001BC 9AC1      SBI	0x18,1
(0100) 	   com>>=1;
    001BD 9516      LSR	R17
    001BE 9507      ROR	R16
    001BF 9543      INC	R20
    001C0 304C      CPI	R20,0xC
    001C1 F380      BCS	0x01B2
(0101)     }
(0102)        ch451load1;
    001C2 9AC2      SBI	0x18,2
    001C3 9149      LD	R20,Y+
    001C4 90A9      LD	R10,Y+
    001C5 9508      RET
_ch451_read:
  temp                 --> Y,+1
  keycode              --> R16
  j                    --> R10
  com                  --> R16
  i                    --> R18
    001C6 92AA      ST	-Y,R10
(0103) 
(0104) }
(0105) //读按键指令
(0106) uchar ch451_read()
(0107) {
(0108)     uchar i,temp,com,keycode,j;
(0109)     ch451load0;
    001C7 98C2      CBI	0x18,2
(0110) //读行数
(0111)     com=0x07;
    001C8 E007      LDI	R16,7
(0112)     for(i=0;i<4;i++)
    001C9 2722      CLR	R18
    001CA C009      RJMP	0x01D4
(0113)     {
(0114)         if(com&0x01)
    001CB FF00      SBRS	R16,0
    001CC C002      RJMP	0x01CF
(0115) 		{ 
(0116) 		   ch451din1;
    001CD 9AC0      SBI	0x18,0
(0117)         }
    001CE C001      RJMP	0x01D0
(0118) 		else 
(0119) 		{
(0120) 		   ch451din0;
    001CF 98C0      CBI	0x18,0
(0121)         }
(0122) 		com>>=1;
    001D0 9506      LSR	R16
(0123)         ch451dclk0;
    001D1 98C1      CBI	0x18,1
(0124) 		ch451dclk1;
    001D2 9AC1      SBI	0x18,1
    001D3 9523      INC	R18
    001D4 3024      CPI	R18,4
    001D5 F3A8      BCS	0x01CB
(0125) 	}
(0126)         ch451load1;
    001D6 9AC2      SBI	0x18,2
(0127) //读按键
(0128)     keycode=0;
    001D7 2700      CLR	R16
(0129)     for(i=0;i<7;i++)
    001D8 2722      CLR	R18
    001D9 C008      RJMP	0x01E2
(0130)     {
(0131)       keycode<<=1;
    001DA 0F00      LSL	R16
(0132) 	  j=PIND;
    001DB B2A0      IN	R10,0x10
(0133) 	  
(0134) 	  if(j&BIT(2))
    001DC FEA2      SBRS	R10,2
    001DD C001      RJMP	0x01DF
(0135) 	     keycode++;
    001DE 9503      INC	R16
(0136) 	  
(0137) 	  ch451dclk0;
    001DF 98C1      CBI	0x18,1
(0138) 	  ch451dclk1;  
    001E0 9AC1      SBI	0x18,1
    001E1 9523      INC	R18
    001E2 3027      CPI	R18,7
    001E3 F3B0      BCS	0x01DA
(0139)     }
(0140)      return keycode;
    001E4 90A9      LD	R10,Y+
    001E5 9508      RET
(0141) }
(0142) void ch451_init()
(0143) {
(0144)    ch451din0;
_ch451_init:
    001E6 98C0      CBI	0x18,0
(0145)    ch451din1;
    001E7 9AC0      SBI	0x18,0
    001E8 9508      RET
(0146) }
(0147) //中断初始化
(0148) void int0_init()
(0149) {
(0150)    PORTD|=BIT(2);
_int0_init:
    001E9 9A92      SBI	0x12,2
(0151)    DDRD&=~BIT(2);
    001EA 988A      CBI	0x11,2
(0152)    MCUCR|=0X00;
    001EB B625      IN	R2,0x35
    001EC BE25      OUT	0x35,R2
(0153)    MCUCSR|=0X00;
    001ED B624      IN	R2,0x34
    001EE BE24      OUT	0x34,R2
(0154)    GICR|=0X40;
    001EF B78B      IN	R24,0x3B
    001F0 6480      ORI	R24,0x40
    001F1 BF8B      OUT	0x3B,R24
(0155)    SREG|=BIT(7);
    001F2 9478      BSET	7
    001F3 9508      RET
FILE: C:\Users\Think\Desktop\新建文件夹\密码输入2\eeprom.c
(0001) //写EEPROM
(0002) /***************************************/
(0003) void write_eep(unsigned int add,unsigned int data)
(0004) { //data为待写数据,add为某单元地址
(0005) while(EECR&(1<<EEWE)); //等待前一次写操作完成
_write_eep:
  data                 --> R18
  add                  --> R16
    001F4 99E1      SBIC	0x1C,1
    001F5 CFFE      RJMP	_write_eep
(0006) EEAR=add; //设定单元地址
    001F6 BB1F      OUT	0x1F,R17
    001F7 BB0E      OUT	0x1E,R16
(0007) EEDR=data; //将数据写入EEDR
    001F8 BB2D      OUT	0x1D,R18
(0008) EECR|=(1<<EEMWE); //允许EEPROM操作
    001F9 9AE2      SBI	0x1C,2
(0009) EECR|=(1<<EEWE); //开始EEPROM操作
    001FA 9AE1      SBI	0x1C,1
    001FB 9508      RET
(0010) }
(0011) /***************************************
(0012) 读EEPROM
(0013) ***************************************/
(0014) unsigned char read_eep(unsigned int add)
(0015) { //add为某单元地址
(0016) while(EECR&(1<<EEWE));//等待前一次写操作完成
_read_eep:
  add                  --> R16
    001FC 99E1      SBIC	0x1C,1
    001FD CFFE      RJMP	_read_eep
(0017) EEAR=add; //设定单元地址
    001FE BB1F      OUT	0x1F,R17
    001FF BB0E      OUT	0x1E,R16
(0018) EECR|=(1<<EERE); //开始EEPROM写操作
    00200 9AE0      SBI	0x1C,0
(0019) return EEDR; //返回读出的数据
    00201 B30D      IN	R16,0x1D
    00202 9508      RET
_miao2:
  q                    --> R10
    00203 920A      ST	-Y,R0
    00204 921A      ST	-Y,R1
    00205 922A      ST	-Y,R2
    00206 923A      ST	-Y,R3
    00207 924A      ST	-Y,R4
    00208 925A      ST	-Y,R5
    00209 926A      ST	-Y,R6
    0020A 927A      ST	-Y,R7
    0020B 928A      ST	-Y,R8
    0020C 929A      ST	-Y,R9
    0020D 930A      ST	-Y,R16
    0020E 931A      ST	-Y,R17
    0020F 932A      ST	-Y,R18
    00210 933A      ST	-Y,R19
    00211 938A      ST	-Y,R24
    00212 939A      ST	-Y,R25
    00213 93AA      ST	-Y,R26
    00214 93BA      ST	-Y,R27
    00215 93EA      ST	-Y,R30
    00216 93FA      ST	-Y,R31
    00217 B60F      IN	R0,0x3F
    00218 920A      ST	-Y,R0
    00219 940E 04F0 CALL	push_xgset300C
FILE: C:\Users\Think\Desktop\新建文件夹\密码输入2\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define  uchar unsigned char
(0004) #define  uint  unsigned int
(0005) #define  ulong unsigned long
(0006) #pragma  interrupt_handler  miao2:2
(0007) #include "yejing.c"
(0008) #include "451.c"
(0009) #include "eeprom.c"
(0010) uchar j=0,g=0,aa=0;
(0011) uint xg=0,suo=0;
(0012) uchar mimas[]={0,0,0,0,0,0},mimac[]={2,2,2,2,2,2},mima_xg[]={0,0,0,0,0,0}; //xianzai mima 999999
(0013)  void miao2()
(0014) {uchar q;
(0015)   q=ch451_read();
    0021B DFAA      RCALL	_ch451_read
    0021C 2EA0      MOV	R10,R16
(0016)   switch(q)
    0021D 2D4A      MOV	R20,R10

⌨️ 快捷键说明

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