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