📄 keyboard.lst
字号:
8056 20 20 bra 0x8078
FILE: main.c
(0015) /*-------------------键盘实验--------------------------*
(0016) *文 件 名:Keyboard.c *
8058 20 20 bra 0x807A
(0017) *硬件连接:PTA.7-4接键盘4根列线,PTA.3-0接键盘4根行线 *
805A 20 20 bra 0x807C
805C 20 20 bra 0x807E
(0018) *程序描述:按下键盘按键,串口发送对应的键值 *
805E 20 20 bra 0x8080
(0019) *目 的:键盘扫描,键盘中断,键值识别,键盘编码 *
8060 20 00 bra 0x8062
(0020) *注 意:如果键盘插在实验板上排插孔,无须连线,若插在下 *
(0021) * 排插孔,需手工接线 *
8064 2C 87 bmc 0x7FED
8066 A3 8C cpX #-116
FILE: setup.c
(0011) /*_HC08Setup:GP32系统初始化子程序----------------------*
(0012) *功能:系统初始化设置:设置CONFIG1和CONFIG2寄存器 *
(0013) CGM的寄存器设置:由外部晶振f=32.768kHz,产生内部 *
(0014) 总线时钟2.4576MHz *
(0015) *参数:无 *
(0016) *返回:无 *
8068 46 rorA
8069 88 pulX
806A 6A 8C dec -116,X
(0017) *-----------------------------------------------------*/
(0018) #include "GP32C.h" //映像寄存器地址头文件
(0019) void _HC08Setup(void)
(0020) {
(0021) //初始化CONFIG2
(0022) CONFIG2=0b00000001; //SCIBDSRC=1内部总线时钟用作SCI
(0023) //时钟;OSCSTOPENB=0在stop模式下
(0024) //禁止振荡器工作
(0025) //初始化CONFIG1
806C 46 rorA
806D 89 pshX
(0026) CONFIG1=0b00111101; //COPD=1 禁止COP模块
806E F3 cpX 0,X
806F 87 pshA
8070 44 lsrA
8071 86 pulA
(0027) //STOP=0 禁止STOP指令
(0028) //SSREC=1 32个CGMXCLK周期退出
8072 00 8624 BRset 0,0x86,0x8099
8075 86 pulA
(0029) //STOP模式
(0030) //LVI5OR3=1 LVI工作在5V
8076 48 lslA
8077 86 pulA
8078 6C 86 inc -122,X
(0031) //LVIPWRD=1 禁止LVI模块电源
807A 90 86 bge 0x8002
807C B4 86 and 0xFFFFFF86
(0032) //LVIRSTD=1 允许LVI复位信号
(0033) //LVISTOP=0 在stop模式下禁止LVI
807E D8 86FC eor 0x86FC,X
8081 87 pshA
(0034) //COPRS=0 COP溢出范围使用长的时间
8082 20 8C bra 0x8010
(0035) PCTL=0x00; //①禁止PLL:清零PLL控制寄存器PCTL
8084 46 rorA
8085 8C clrH
(0036) PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率
(0037) // 为2
8086 46 rorA
8087 87 pshA
8088 6A 8A dec -118,X
808A BA 45 orA *__r5
808C 02 4094 BRset 1,0x40,0x8023
808F CD 80D6 jsr __HC08Setup
8092 45 0070 ldHX #0x0070
8095 65 0104 cpHX #0x0104
8098 27 06 beq 0x80A0
809A 6F 00 clr 0,X
809C AF 01 aiX #1
809E 20 F5 bra 0x8095
80A0 45 004F ldHX #0x004F
80A3 94 tXS
80A4 45 8041 ldHX #0x8041
80A7 65 8063 cpHX #0x8063
80AA 27 0B beq 0x80B7
80AC E6 00 ldA 0,X
80AE 9EE7 00 stA 0,S
80B1 AF 01 aiX #1
80B3 A7 01 aiS #1
80B5 20 F0 bra 0x80A7
FILE: vectors08.c
(0001) /*-----------------------------------------------------*
(0002) *文件名:vectors08.c *
(0003) *功 能:用于定义中断矢量表 *
(0004) *-----------------------------------------------------*/
(0005) /*[头文件]*/
(0006) #include "GP32C.H"
(0007) #include "KB.h"
(0008) #include "SCI.h"
(0009) #pragma interrupt_handler isrKBI
(0010) int result(unsigned char m[]);
(0011) extern void lcdshow(unsigned char *str);
(0012) extern void LcdInit(void);
80B7 45 0240 ldHX #0x0240
(0013) extern void Lcd_Command(unsigned char cmd);
(0014) unsigned char n[32]={" "};
(0015) unsigned char m[32];
80BA 94 tXS
80BB CD 80C0 jsr _main
_exit:
80BE 20 FE bra 0x80BE
_main:
80C0 A6 00 ldA #0
(0016) unsigned char mn[32];
(0017) unsigned char KB_valve,i,s2,x,t1,s1=0,t=0;
80C2 87 pshA
80C3 A6 80 ldA #-128
80C5 87 pshA
80C6 CD 8E9A jsr _lcdshow
(0018) int mm;
80C9 A7 02 aiS #2
80CB 9B seI
80CC CD 8DDE jsr _KB_Init
80CF 95 tSX
80D0 13 1A Bclr 1,0x1A
80D2 9A clI
(0019) unsigned char i1,i2,i3,i4,i41,i42,i5,i6,i7,i8,i9;
80D3 20 FE bra 0x80D3
80D5 81 rts
__HC08Setup:
80D6 A6 01 ldA #1
80D8 B7 1E stA 0x1E
(0020) unsigned char sign1[16],sign2[16];
80DA A6 3D ldA #61
80DC B7 1F stA 0x1F
(0021) int r[16];
80DE 3F 36 clr 0x36
(0022) int res;
80E0 A6 01 ldA #1
80E2 B7 36 stA 0x36
80E4 A6 01 ldA #1
80E6 B7 38 stA 0x38
80E8 A6 2C ldA #44
80EA B7 39 stA 0x39
80EC A6 80 ldA #-128
80EE B7 3A stA 0x3A
80F0 A6 01 ldA #1
80F2 B7 3B stA 0x3B
80F4 1A 36 Bset 5,0x36
80F6 1E 37 Bset 7,0x37
80F8 18 36 Bset 4,0x36
80FA 81 rts
_result:
80FB 95 tSX
80FC 3F BC clr 0xFFFFFFBC
80FE 20 20 bra 0x8120
8100 3F 40 clr *__r0
8102 B6 BC ldA 0xFFFFFFBC
8104 B7 41 stA *__r1
8106 38 41 lsl *__r1
8108 39 40 rol *__r0
810A B6 41 ldA *__r1
810C AB 72 add #114
810E B7 41 stA *__r1
(0023) int result(unsigned char m[])
(0024) {
(0025) for(i1=0;i1<16;i1++)r[i1]=0;
(0026) i1=0;i2=0;i3=0;i4=0;i5=0;i6=0;i7=0;
(0027) while(m[i1]!='='&&m[i1]!='')
8110 B6 40 ldA *__r0
FILE: SCI.c
(0001) /*-----------------------------------------------------*
(0002) *文件描述:本文件包含了串行通信的4子程序,分别为: *
(0003) *(1)SCISend1:串行发送1字节 *
(0004) *(2)SCISendN:串行发送n字节 *
(0005) *(3)SCIRe1:串行接收1字节 *
(0006) *(4)SCIReN:串行接收n字节 *
(0007) *-------------《嵌入式应用技术基础教程》--------------*/
(0008) //[以下为子程序源代码]
(0009) //[包含头文件]
(0010) #include "SCI.h"
(0011) /*SCISend1:串行发送1个字节-----------------------------*
(0012) *功 能:串行发送1个字节 *
(0013) *参 数:要发送的数据 *
(0014) *返 回:无 *
(0015) *-----------------------------------------------------*/
(0016) void SCISend1(unsigned char o)
(0017) {//判断ReStatusR的第SendTestBit位是否为1,是1可以发送
8112 A9 00 adc #0
(0018) while(1)
(0019) if ((ReSendStatusR & (1<<SendTestBit)) != 0)
8114 B7 40 stA *__r0
8116 4F clrA
(0020) { ReSendDataR=o;
8117 55 40 ldHX *__r0
8119 F7 stA 0,X
811A 4F clrA
(0021) break;}
811B E7 01 stA 1,X
811D 95 tSX
811E 3C BC inc 0xFFFFFFBC
8120 B6 BC ldA 0xFFFFFFBC
8122 A1 10 cmp #16
(0022) }
(0023) /*SCISendN:串行发送N个字节-----------------------------*
(0024) *功 能:发送数组中的N个字节数据 *
(0025) *参 数:待发送的数据字节数及其要存放的数组首地址 *
(0026) *返 回:无 *
(0027) *-----------------------------------------------------*/
(0028) void SCISendN(unsigned char n,unsigned char ch[])
(0029) {int i;
8124 25 DA bcs 0x8100
8126 3F BC clr 0xFFFFFFBC
(0030) for(i=0;i<n;i++)
(0031) SCISend1(ch[i]);
8128 3F BB clr 0xFFFFFFBB
812A 3F BA clr 0xFFFFFFBA
812C 3F B9 clr 0xFFFFFFB9
812E 3F B6 clr 0xFFFFFFB6
8130 3F B5 clr 0xFFFFFFB5
8132 3F B4 clr 0xFFFFFFB4
8134 20 04 bra 0x813A
8136 3C BC inc 0xFFFFFFBC
8138 3C BB inc 0xFFFFFFBB
813A 3F 40 clr *__r0
813C B6 BC ldA 0xFFFFFFBC
813E EB 03 add 3,X
8140 B7 41 stA *__r1
8142 B6 40 ldA *__r0
8144 E9 02 adc 2,X
8146 B7 40 stA *__r0
8148 55 40 ldHX *__r0
814A F6 ldA 0,X
814B B7 41 stA *__r1
814D 3F 40 clr *__r0
814F 55 40 ldHX *__r0
8151 65 003D cpHX #0x003D
8154 95 tSX
8155 27 08 beq 0x815F
8157 55 40 ldHX *__r0
8159 65 0000 cpHX #0x0000
815C 95 tSX
815D 26 D7 bne 0x8136
815F E6 02 ldA 2,X
(0032) }
(0033) /*SCIRe1:串行收一个字节数据----------------------------*
(0034) *功 能:从串行口接收1个字节的数据 *
(0035) *参 数:标志指针p *
(0036) *返 回:接收到的数据(若接收失败,返回0xff) *
(0037) *说 明:参数*p带回接收标志=0收到数据,=1未收到数据 *
(0038) *-----------------------------------------------------*/
(0039) unsigned char SCIRe1(unsigned char *p)
(0040) { unsigned int k;
8161 EE 03 ldX 3,X
8163 87 pshA
8164 8A pulH
8165 F6 ldA 0,X
8166 95 tSX
(0041) unsigned char i;
(0042) //ReStatusR第ReTestBit位为1表示可接收数据
(0043) for(k=0;k<0xfbbb;k++)
(0044) if ((ReSendStatusR & (1<<ReTestBit)) != 0)
8167 A1 2D cmp #45
8169 27 03 beq 0x816E
(0045) {i=ReSendDataR;
816B CC 81F0 jmp 0x81F0
(0046) *p=0x00;
816E A6 01 ldA #1
8170 B7 BA stA 0xFFFFFFBA
8172 CC 81F0 jmp 0x81F0
8175 3F 40 clr *__r0
8177 B6 BA ldA 0xFFFFFFBA
8179 EB 03 add 3,X
(0047) break;}
817B B7 41 stA *__r1
817D B6 40 ldA *__r0
817F E9 02 adc 2,X
8181 B7 40 stA *__r0
8183 55 40 ldHX *__r0
8185 F6 ldA 0,X
8186 B7 41 stA *__r1
8188 3F 40 clr *__r0
818A 55 40 ldHX *__r0
818C 65 002B cpHX #0x002B
818F 95 tSX
8190 27 20 beq 0x81B2
8192 55 40 ldHX *__r0
8194 65 002D cpHX #0x002D
8197 95 tSX
(0048) if(k>=0xfbbb)
8198 27 18 beq 0x81B2
819A 55 40 ldHX *__r0
819C 65 002A cpHX #0x002A
819F 95 tSX
81A0 27 10 beq 0x81B2
81A2 55 40 ldHX *__r0
81A4 65 002F cpHX #0x002F
81A7 95 tSX
(0049) {i=0xff;
81A8 27 08 beq 0x81B2
81AA 55 40 ldHX *__r0
(0050) *p=0x01;}
81AC 65 003D cpHX #0x003D
81AF 95 tSX
81B0 26 3C bne 0x81EE
81B2 3F 40 clr *__r0
81B4 B6 BA ldA 0xFFFFFFBA
81B6 EB 03 add 3,X
81B8 B7 41 stA *__r1
(0051) return i; //返回接收到的数据
81BA B6 40 ldA *__r0
81BC E9 02 adc 2,X
81BE B7 40 stA *__r0
(0052) }
(0053) /*SCIReN:HC08串行接收N个字节---------------------------*
(0054) *功 能:接收N个字节数据,并存放在ch数组中 *
(0055) *参 数:待接收的数据字节数及其存放的数组首地址 *
(0056) *返 回:接收标志=0收到数据,=1未收到数据 *
(0057) *-----------------------------------------------------*/
(0058) unsigned char SCIReN(unsigned char n,unsigned char ch[])
(0059) {int m;
81C0 55 40 ldHX *__r0
81C2 F6 ldA 0,X
81C3 B7 41 stA *__r1
81C5 3F 42 clr *__r2
(0060) unsigned char fp;
(0061) m=0;
(0062) while (m<n)
(0063) {
81C7 B6 B9 ldA 0xFFFFFFB9
81C9 AB A2 add #-94
81CB B7 43 stA *__r3
81CD B6 42 ldA *__r2
81CF A9 00 adc #0
81D1 B7 42 stA *__r2
81D3 B6 41 ldA *__r1
81D5 55 42 ldHX *__r2
81D7 F7 stA 0,X
81D8 3F 40 clr *__r0
81DA B6 B9 ldA 0xFFFFFFB9
81DC AB 92 add #-110
81DE B7 41 stA *__r1
81E0 B6 40 ldA *__r0
(0064) ch[m]=SCIRe1(&fp);
(0065) if (fp==1) return 1;
81E2 A9 00 adc #0
81E4 B7 40 stA *__r0
81E6 B6 BA ldA 0xFFFFFFBA
81E8 55 40 ldHX *__r0
81EA F7 stA 0,X
(0066) m++;
81EB 95 tSX
81EC 3C B9 inc 0xFFFFFFB9
81EE 3C BA inc 0xFFFFFFBA
81F0 B6 BA ldA 0xFFFFFFBA
81F2 B1 BB cmp 0xFFFFFFBB
81F4 22 03 bhi 0x81F9
81F6 CC 8175 jmp 0x8175
(0067) }
81F9 4E B9B8 mov 0xFFFFFFB9,0xB8
81FC 4E B9B7 mov 0xFFFFFFB9,0xB7
81FF E6 02 ldA 2,X
8201 EE 03 ldX 3,X
8203 87 pshA
8204 8A pulH
8205 F6 ldA 0,X
8206 95 tSX
8207 A1 2D cmp #45
8209 27 03 beq 0x820E
820B CC 82A2 jmp 0x82A2
(0068) return 0;
820E A6 01 ldA #1
FILE: KBsub.c
(0001) /*-----------------------------------------------------*
(0002) *文件描述:本文件包含了H08C键盘中断子函数,分别为: *
(0003) *(1)KB_Init:键盘初始化函数 *
(0004) * void KB_Init(void) *
(0005) *(2)KB_Scan:扫描读取键值函数 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -