?? 4x4key.lst
字號:
Interrupt Vectors
00000 940C 002A JMP __start|__text_start
Program Code (text area)
__start|__text_start:
0002A E5CF LDI R28,0x5F
0002B E0D4 LDI R29,4
0002C BFCD OUT 0x3D,R28
0002D BFDE OUT 0x3E,R29
0002E 51CE SUBI R28,0x1E
0002F 40D0 SBCI R29,0
00030 EA0A LDI R16,0xAA
00031 8308 ST Y,R16
00032 2400 CLR R0
00033 E6E0 LDI R30,0x60
00034 E0F0 LDI R31,0
00035 E010 LDI R17,0
00036 36E3 CPI R30,0x63
00037 07F1 CPC R31,R17
00038 F011 BEQ 0x003B
00039 9201 ST Z+,R0
0003A CFFB RJMP 0x0036
0003B 8300 ST Z,R16
0003C E5E4 LDI R30,0x54
0003D E0F0 LDI R31,0
0003E E6A0 LDI R26,0x60
0003F E0B0 LDI R27,0
00040 E010 LDI R17,0
00041 E000 LDI R16,0
00042 BF0B OUT 0x3B,R16
00043 35E4 CPI R30,0x54
00044 07F1 CPC R31,R17
00045 F021 BEQ 0x004A
00046 95C8 LPM
00047 9631 ADIW R30,1
00048 920D ST X+,R0
00049 CFF9 RJMP 0x0043
0004A 940E 01C5 CALL _main
_exit:
0004C CFFF RJMP _exit
FILE: E:\16實驗程序\4x4鍵盤\ch595.h
(0001) //向ch595寫數據
(0002) #define clk 1
(0003) #define rclk 2
(0004) #define dat 3
(0005)
(0006) //延時函數
(0007) void s_ms(unsigned int t)
(0008) {
(0009) for(;t>1;t--)
_s_ms:
t --> R16
0004D C002 RJMP 0x0050
0004E 5001 SUBI R16,1
0004F 4010 SBCI R17,0
00050 E081 LDI R24,1
00051 E090 LDI R25,0
00052 1780 CP R24,R16
00053 0791 CPC R25,R17
00054 F3C8 BCS 0x004E
00055 9508 RET
_sendbyte:
tem --> R10
i --> R22
byte --> R20
00056 940E 0205 CALL push_xgsetF00C
00058 2F40 MOV R20,R16
(0010) {
(0011) }
(0012) }
(0013) //寫74hc595函數
(0014) void sendbyte(uchar byte)
(0015) {
(0016) uchar i,tem;
(0017) byte=encoder(byte); //譯碼
00059 2F04 MOV R16,R20
0005A 2711 CLR R17
0005B D018 RCALL _encoder
0005C 2F40 MOV R20,R16
(0018) for(i=0;i<8;i++)
0005D 2766 CLR R22
0005E C00C RJMP 0x006B
(0019) {
(0020) PORTA&=~(1<<clk);
0005F 98D9 CBI 0x1B,1
(0021) tem=(byte&0x80);
00060 2F84 MOV R24,R20
00061 7880 ANDI R24,0x80
00062 2EA8 MOV R10,R24
(0022) if(tem==0)
00063 2388 TST R24
00064 F411 BNE 0x0067
(0023) {
(0024) PORTA&=~(1<<dat);
00065 98DB CBI 0x1B,3
(0025) }
00066 C001 RJMP 0x0068
(0026) else
(0027) {
(0028) PORTA|=(1<<dat);
00067 9ADB SBI 0x1B,3
(0029) }
(0030) byte=byte<<1;
00068 0F44 LSL R20
(0031) PORTA|=(1<<clk);
00069 9AD9 SBI 0x1B,1
0006A 9563 INC R22
0006B 3068 CPI R22,0x8
0006C F390 BCS 0x005F
(0032) }
(0033) PORTA&=~(1<<rclk);
0006D 98DA CBI 0x1B,2
(0034) s_ms(100);
0006E E604 LDI R16,0x64
0006F E010 LDI R17,0
00070 DFDC RCALL _s_ms
(0035) PORTA|=(1<<rclk);
00071 9ADA SBI 0x1B,2
00072 940C 020C JMP pop_xgsetF00C
_encoder:
code --> R20
num --> R16
00074 940E 01FB CALL push_xgsetF000
FILE: E:\16實驗程序\4x4鍵盤\encoder.h
(0001) //數碼管譯碼函數
(0002) uchar encoder(uchar num)
(0003) {
(0004) uchar code;
(0005) switch(num)
00076 2F60 MOV R22,R16
00077 2777 CLR R23
00078 3060 CPI R22,0
00079 0767 CPC R22,R23
0007A F129 BEQ 0x00A0
0007B 3061 CPI R22,1
0007C E0E0 LDI R30,0
0007D 077E CPC R23,R30
0007E F119 BEQ 0x00A2
0007F 3062 CPI R22,2
00080 E0E0 LDI R30,0
00081 077E CPC R23,R30
00082 F109 BEQ 0x00A4
00083 3063 CPI R22,3
00084 E0E0 LDI R30,0
00085 077E CPC R23,R30
00086 F0F9 BEQ 0x00A6
00087 3064 CPI R22,4
00088 E0E0 LDI R30,0
00089 077E CPC R23,R30
0008A F0E9 BEQ 0x00A8
0008B 3065 CPI R22,5
0008C E0E0 LDI R30,0
0008D 077E CPC R23,R30
0008E F0D9 BEQ 0x00AA
0008F 3066 CPI R22,6
00090 E0E0 LDI R30,0
00091 077E CPC R23,R30
00092 F0C9 BEQ 0x00AC
00093 3067 CPI R22,7
00094 E0E0 LDI R30,0
00095 077E CPC R23,R30
00096 F0B9 BEQ 0x00AE
00097 3068 CPI R22,0x8
00098 E0E0 LDI R30,0
00099 077E CPC R23,R30
0009A F0A9 BEQ 0x00B0
0009B 3069 CPI R22,0x9
0009C E0E0 LDI R30,0
0009D 077E CPC R23,R30
0009E F099 BEQ 0x00B2
0009F C013 RJMP 0x00B3
(0006) {
(0007) case 0x00:
(0008) code=0xc0;break;
000A0 EC40 LDI R20,0xC0
000A1 C011 RJMP 0x00B3
(0009) case 0x01:
(0010) code=0xf9;break;
000A2 EF49 LDI R20,0xF9
000A3 C00F RJMP 0x00B3
(0011) case 0x02:
(0012) code=0xa4;break;
000A4 EA44 LDI R20,0xA4
000A5 C00D RJMP 0x00B3
(0013) case 0x03:
(0014) code=0xb0;break;
000A6 EB40 LDI R20,0xB0
000A7 C00B RJMP 0x00B3
(0015) case 0x04:
(0016) code=0x99;break;
000A8 E949 LDI R20,0x99
000A9 C009 RJMP 0x00B3
(0017) case 0x05:
(0018) code=0x92;break;
000AA E942 LDI R20,0x92
000AB C007 RJMP 0x00B3
(0019) case 0x06:
(0020) code=0x82;break;
000AC E842 LDI R20,0x82
000AD C005 RJMP 0x00B3
(0021) case 0x07:
(0022) code=0xf8;break;
000AE EF48 LDI R20,0xF8
000AF C003 RJMP 0x00B3
(0023) case 0x08:
(0024) code=0x80;break;
000B0 E840 LDI R20,0x80
000B1 C001 RJMP 0x00B3
(0025) case 0x09:
(0026) code=0x90;break;
000B2 E940 LDI R20,0x90
(0027) }
(0028) return(code);
000B3 2F04 MOV R16,R20
000B4 940C 0200 JMP pop_xgsetF000
_key_value:
i --> Y,+1
tem2 --> R10
rem --> R20
tem1 --> R22
000B6 940E 0205 CALL push_xgsetF00C
FILE: E:\16實驗程序\4x4鍵盤\key_value.h
(0001) //讀鍵盤值 鍵盤在端口B
(0002) uchar key_value()
(0003) {
(0004) uchar tem1,tem2,rem,i;
(0005) rem=0; //不清零會返回一個不可預知的值
000B8 2744 CLR R20
(0006) DDRB=0xf0; //B口高四位輸出 低四位輸入
000B9 EF80 LDI R24,0xF0
000BA BB87 OUT 0x17,R24
(0007) PORTB=0x0f; //輸入有上拉電阻 輸出低電平
000BB E08F LDI R24,0xF
000BC BB88 OUT 0x18,R24
(0008) s_ms(1);
000BD E001 LDI R16,1
000BE E010 LDI R17,0
000BF DF8D RCALL _s_ms
(0009) tem1=PINB; //讀取端口B
000C0 B366 IN R22,0x16
(0010) tem1=tem1&0x0f;
000C1 706F ANDI R22,0xF
(0011) if(tem1!=0x0f) //判斷是否有鍵被按下
000C2 306F CPI R22,0xF
000C3 F0A1 BEQ 0x00D8
(0012) {
(0013) s_ms(200); //延時
000C4 EC08 LDI R16,0xC8
000C5 E010 LDI R17,0
000C6 DF86 RCALL _s_ms
(0014) tem2=PINB; //讀取端口B
000C7 B2A6 IN R10,0x16
(0015) tem2=tem2&0x0f;
000C8 2D8A MOV R24,R10
000C9 708F ANDI R24,0xF
000CA 2EA8 MOV R10,R24
(0016) if(tem1==tem2) //判斷是否為干擾
000CB 1768 CP R22,R24
000CC F459 BNE 0x00D8
(0017) {
(0018) DDRB=0x0f; //B口高四位輸入 低四位輸出
000CD E08F LDI R24,0xF
000CE BB87 OUT 0x17,R24
(0019) PORTB=0xf0; //反相輸出
000CF EF80 LDI R24,0xF0
000D0 BB88 OUT 0x18,R24
(0020) s_ms(50); //換向后要延時
000D1 E302 LDI R16,0x32
000D2 E010 LDI R17,0
000D3 DF79 RCALL _s_ms
(0021) rem=PINB; //讀取端口B
000D4 B346 IN R20,0x16
(0022) rem=rem&0xf0; //取高四位
000D5 7F40 ANDI R20,0xF0
(0023) rem=rem+tem1; //合并
000D6 0F46 ADD R20,R22
(0024) rem=~rem; //反向輸出
000D7 9540 COM R20
(0025) //do //判斷按鍵是否被釋放
(0026) //{
(0027) // PORTB=0xf0;
(0028) //s_ms(200);
(0029) //}
(0030) //while(PINB!=0xf0);
(0031) }
(0032) }
(0033) return(rem);
000D8 2F04 MOV R16,R20
000D9 940C 020C JMP pop_xgsetF00C
_disa:
data --> R10
000DB 92AA ST -Y,R10
000DC 2EA0 MOV R10,R16
FILE: E:\16實驗程序\4x4鍵盤\disp.h
(0001) //數碼管顯示子程序
(0002)
(0003) #define ls138a 7
(0004) #define ls138b 6
(0005) #define ls138c 5
(0006) #define ls138en 4
(0007) uchar a1,a2,a3;
(0008) void disa(uchar data)
(0009) {
(0010) a3=data/100;
000DD E614 LDI R17,0x64
000DE 2D0A MOV R16,R10
000DF 940E 01D5 CALL div8u
000E1 9300 0060 STS a3,R16
(0011) a2=(data-a3*100)/10;
000E3 2F10 MOV R17,R16
000E4 E604 LDI R16,0x64
000E5 0301 MULSU R16,R17
000E6 2D0A MOV R16,R10
000E7 1900 SUB R16,R0
000E8 E01A LDI R17,0xA
000E9 940E 01D5 CALL div8u
000EB 9300 0061 STS a2,R16
(0012) a1=(data-a3*100-a2*10);
000ED 9110 0060 LDS R17,a3
000EF E604 LDI R16,0x64
000F0 0301 MULSU R16,R17
000F1 2C2A MOV R2,R10
000F2 1820 SUB R2,R0
000F3 9110 0061 LDS R17,a2
000F5 E00A LDI R16,0xA
000F6 0301 MULSU R16,R17
000F7 1820 SUB R2,R0
000F8 9220 0062 STS a1,R2
000FA 90A9 LD R10,Y+
000FB 9508 RET
_disp:
bb --> R12
aa --> R10
000FC 940E 01F6 CALL push_xgset003C
000FE 2EA0 MOV R10,R16
(0013) }
(0014)
(0015) void disp(uchar aa)
(0016) {
(0017) uint bb=0;
000FF 24CC CLR R12
00100 24DD CLR R13
(0018) DDRA=0xff; //初始化端口A
00101 EF8F LDI R24,0xFF
00102 BB8A OUT 0x1A,R24
(0019) PORTA=0xff;
00103 BB8B OUT 0x1B,R24
(0020) disa(aa);//提取aa的各位
00104 2D0A MOV R16,R10
00105 DFD5 RCALL _disa
(0021) sendbyte(a1);//數碼管1
00106 9100 0062 LDS R16,a1
00108 DF4D RCALL _sendbyte
(0022) PORTA=0X1F;
00109 E18F LDI R24,0x1F
0010A BB8B OUT 0x1B,R24
(0023) //PORTA&=~(1<<ls138a);
(0024) //PORTA&=~(1<<ls138b);
(0025) //PORTA&=~(1<<ls138c);
(0026) s_ms(600);
0010B E508 LDI R16,0x58
0010C E012 LDI R17,2
0010D DF3F RCALL _s_ms
(0027) sendbyte(a2);//數碼管2
0010E 9100 0061 LDS R16,a2
00110 DF45 RCALL _sendbyte
(0028) PORTA=0X9F;
00111 E98F LDI R24,0x9F
00112 BB8B OUT 0x1B,R24
(0029) //PORTA|=(1<<ls138a);
(0030) //PORTA&=~(1<<ls138b);
(0031) //PORTA&=~(1<<ls138c);
(0032) s_ms(600);
00113 E508 LDI R16,0x58
00114 E012 LDI R17,2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -