⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.lst

📁 基于HC908GP32的计算器完整程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -