📄 7281.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E004B CALL _main
_exit:
004A CFFF RJMP _exit
FILE: H:\bbi项目源程序\bc7281键盘显示\16键显\7281.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #define MHZ 8
(0005) #define US MHZ/4 //以4MHZ为基本单位,典型延时时间为(dt+2)us(晶振为1MHZ)P195P195]。
(0006) #define SET(a,b) a|=(1<<b)
(0007) #define CLR(a,b) a&=~(1<<b)
(0008) #define CPL(a,b) a^=(1<<b)
(0009) #define CHK(a,b) (a&(1<<b)==(1<<b))
(0010) #define BC7281_PORT PORTA
(0011) #define BC7281_DDR DDRA
(0012) #define BC7281_PIN PINA
(0013) #define INT_7281 2
(0014) #define DAT_7281 6
(0015) #define CLK_7281 7
(0016) #define RDAT_7281 (CLR(BC7281_DDR,DAT_7281),(BC7281_PIN&(1<<DAT_7281))==(1<<DAT_7281))//定义PC0口为数据口
(0017)
(0018)
(0019)
(0020) void main()
(0021) {
(0022)
(0023) unsigned char key_number;
(0024) BC7281_init();
_main:
key_number --> R20
004B D0D2 RCALL _BC7281_init
004C C036 RJMP 0x0083
(0025) while(1)
(0026) {
(0027)
(0028)
(0029) if(!((PIND&0x04)==0x04))
004D B220 IN R2,0x10
004E 2433 CLR R3
004F FC22 SBRC R2,2
0050 C028 RJMP 0x0079
(0030) {
(0031) key_number=read728x(0x13); /////读键值
0051 E103 LDI R16,0x13
0052 E010 LDI R17,0
0053 D0C0 RCALL _read728x
0054 2F40 MOV R20,R16
(0032) if(key_number<0x0A)
0055 300A CPI R16,0xA
0056 F480 BCC 0x0067
(0033) { write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
0057 2F24 MOV R18,R20
0058 2733 CLR R19
0059 702F ANDI R18,0xF
005A 7030 ANDI R19,0
005B E105 LDI R16,0x15
005C E010 LDI R17,0
005D D0AB RCALL _write728x
(0034) write728x(0x15,0x10+(key_number&0xf0));//在第1位以HEX方式显示键码的高四位
005E 2F24 MOV R18,R20
005F 2733 CLR R19
0060 7F20 ANDI R18,0xF0
0061 7030 ANDI R19,0
0062 5F20 SUBI R18,0xF0
0063 4F3F SBCI R19,0xFF
0064 E105 LDI R16,0x15
0065 E010 LDI R17,0
0066 D0A2 RCALL _write728x
(0035)
(0036)
(0037)
(0038) }
(0039)
(0040)
(0041) if(key_number==0x0f)
0067 304F CPI R20,0xF
0068 F481 BNE 0x0079
(0042) {
(0043) write728x(0x15,0x00+(key_number&0x0f)); //在第0位以HEX方式显示键码的低四位
0069 2F24 MOV R18,R20
006A 2733 CLR R19
006B 702F ANDI R18,0xF
006C 7030 ANDI R19,0
006D E105 LDI R16,0x15
006E E010 LDI R17,0
006F D099 RCALL _write728x
(0044) write728x(0x15,0x10+(key_number&0xf0)); //在第1位以HEX方式显示键码的高四位
0070 2F24 MOV R18,R20
0071 2733 CLR R19
0072 7F20 ANDI R18,0xF0
0073 7030 ANDI R19,0
0074 5F20 SUBI R18,0xF0
0075 4F3F SBCI R19,0xFF
0076 E105 LDI R16,0x15
0077 E010 LDI R17,0
0078 D090 RCALL _write728x
(0045) }
(0046)
(0047) }
(0048) write728x(0x15,(0x60+(0x01)));
0079 E621 LDI R18,0x61
007A E030 LDI R19,0
007B E105 LDI R16,0x15
007C E010 LDI R17,0
007D D08B RCALL _write728x
(0049) write728x(0x15,(0x70+(0x00)));
007E E720 LDI R18,0x70
007F E030 LDI R19,0
0080 E105 LDI R16,0x15
0081 E010 LDI R17,0
0082 D086 RCALL _write728x
0083 CFC9 RJMP 0x004D
0084 9508 RET
_send_byte:
bit_counter --> R20
send_byte --> R22
0085 940E0135 CALL push_gset2
0087 2F60 MOV R22,R16
(0050) }
(0051) }
(0052)
(0053) void send_byte(unsigned char send_byte)
(0054) {
(0055) unsigned char bit_counter;
(0056) SET(BC7281_PORT,DAT_7281); //为低电平
0088 9ADE SBI 0x1B,6
(0057) SET(BC7281_DDR,CLK_7281); //CLK为输出,PB1内部上拉有效
0089 9AD7 SBI 0x1A,7
(0058) CLR(BC7281_DDR,DAT_7281); //DAT为输入
008A 98D6 CBI 0x1A,6
(0059)
(0060)
(0061) SET(PORTA,CLK_7281); //为高电平
008B 9ADF SBI 0x1B,7
(0062)
(0063) CLR(BC7281_PORT,CLK_7281);
008C 98DF CBI 0x1B,7
(0064)
(0065) delay_7281(US);
008D E002 LDI R16,2
008E E010 LDI R17,0
008F D095 RCALL _delay_7281
(0066)
(0067) SET(BC7281_PORT,CLK_7281);
0090 9ADF SBI 0x1B,7
(0068)
(0069) delay_7281(US);
0091 E002 LDI R16,2
0092 E010 LDI R17,0
0093 D091 RCALL _delay_7281
(0070) do {
(0071)
(0072) CLR(BC7281_PORT,CLK_7281);
0094 98DF CBI 0x1B,7
(0073) //delay_7281(US);
(0074) SET(BC7281_PORT,CLK_7281);
0095 9ADF SBI 0x1B,7
(0075)
(0076) delay_7281(2*US);
0096 E004 LDI R16,4
0097 E010 LDI R17,0
0098 D08C RCALL _delay_7281
(0077)
(0078) } while (RDAT_7281); //CPU向BC7281发一系列的脉冲信号,直到DAT为低电平
0099 98D6 CBI 0x1A,6
009A B229 IN R2,0x19
009B 2433 CLR R3
009C FC26 SBRC R2,6
009D CFF6 RJMP 0x0094
(0079) CLR(BC7281_PORT,CLK_7281);//delay_7281(US); // 要在15us内发一脉冲信号
009E 98DF CBI 0x1B,7
(0080) SET(BC7281_PORT,CLK_7281);
009F 9ADF SBI 0x1B,7
(0081)
(0082) delay_7281(US);
00A0 E002 LDI R16,2
00A1 E010 LDI R17,0
00A2 D082 RCALL _delay_7281
(0083)
(0084)
(0085) while (!RDAT_7281); //等待数据线变为高电平
00A3 98D6 CBI 0x1A,6
00A4 B389 IN R24,0x19
00A5 7480 ANDI R24,0x40
00A6 3480 CPI R24,0x40
00A7 F7D9 BNE 0x00A3
(0086)
(0087) SET(BC7281_DDR,DAT_7281); //pa6 DAT为输出并延时
00A8 9AD6 SBI 0x1A,6
(0088)
(0089) delay_7281(US);
00A9 E002 LDI R16,2
00AA E010 LDI R17,0
00AB D079 RCALL _delay_7281
(0090)
(0091) for (bit_counter=0;bit_counter<8;bit_counter++) //写八位
00AC 2744 CLR R20
00AD C011 RJMP 0x00BF
(0092) {
(0093)
(0094) delay_7281(3*US);
00AE E006 LDI R16,6
00AF E010 LDI R17,0
00B0 D074 RCALL _delay_7281
(0095)
(0096) if ((send_byte&0x80)==0)
00B1 FD67 SBRC R22,7
00B2 C002 RJMP 0x00B5
(0097) {CLR(BC7281_PORT,DAT_7281);//从高位写起
00B3 98DE CBI 0x1B,6
(0098)
(0099) }
00B4 C001 RJMP 0x00B6
(0100) else
(0101) {
(0102) SET(BC7281_PORT,DAT_7281);
00B5 9ADE SBI 0x1B,6
(0103) }
(0104) send_byte=send_byte*2; ///左移
00B6 E082 LDI R24,2
00B7 9F86 MUL R24,R22
00B8 2D60 MOV R22,R0
(0105)
(0106)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -