+_-
来自「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 + -
显示快捷键?