📄 tg1286~1.lst
字号:
__text_start:
__start:
8041 45 0240 ldHX #0x0240
8044 94 tXS
8045 CD 8076 jsr __HC08Setup
8048 45 008F ldHX #0x008F
804B 65 008F cpHX #0x008F
804E 27 06 beq 0x8056
8050 6F 00 clr 0,X
8052 AF 01 aiX #1
8054 20 F5 bra 0x804B
8056 45 004F ldHX #0x004F
8059 94 tXS
805A 45 8000 ldHX #0x8000
805D 65 8041 cpHX #0x8041
8060 27 0B beq 0x806D
8062 E6 00 ldA 0,X
8064 9EE7 00 stA 0,S
8067 AF 01 aiX #1
8069 A7 01 aiS #1
806B 20 F0 bra 0x805D
806D 45 0240 ldHX #0x0240
8070 94 tXS
8071 CD 809B jsr _main
_exit:
8074 20 FE bra 0x8074
FILE: setup.c
(0001) /*_HC08Setup:GP32系统初始化子程序----------------------*
(0002) *功能:系统初始化设置:设置CONFIG1和CONFIG2寄存器 *
(0003) CGM的寄存器设置:由外部晶振f=32.768kHz,产生内部 *
(0004) 总线时钟2.4576MHz *
(0005) *参数:无 *
(0006) *返回:无 *
(0007) *-----------------------------------------------------*/
(0008) #include "GP32C.h" //映像寄存器地址头文件
(0009) void _HC08Setup(void)
(0010) {
__HC08Setup:
8076 A6 01 ldA #1
8078 B7 1E stA 0x1E
(0011) //初始化CONFIG2
(0012) CONFIG2=0b00000001; //SCIBDSRC=1内部总线时钟用作SCI
(0013) //时钟;OSCSTOPENB=0在stop模式下
(0014) //禁止振荡器工作
(0015) //初始化CONFIG1
(0016) CONFIG1=0b00111101; //COPD=1 禁止COP模块
807A A6 3D ldA #61
807C B7 1F stA 0x1F
(0017) //STOP=0 禁止STOP指令
(0018) //SSREC=1 32个CGMXCLK周期退出
(0019) //STOP模式
(0020) //LVI5OR3=1 LVI工作在5V
(0021) //LVIPWRD=1 禁止LVI模块电源
(0022) //LVIRSTD=1 允许LVI复位信号
(0023) //LVISTOP=0 在stop模式下禁止LVI
(0024) //COPRS=0 COP溢出范围使用长的时间
(0025) PCTL=0x00; //①禁止PLL:清零PLL控制寄存器PCTL
807E 3F 36 clr 0x36
(0026) PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率
8080 A6 01 ldA #1
8082 B7 36 stA 0x36
(0027) // 为2
(0028) PMSH=0x01; //③将N写入PMSH、PMSL,置VCO的倍
8084 A6 01 ldA #1
8086 B7 38 stA 0x38
(0029) // 频因子为$12C
(0030) PMSL=0x2C;
8088 A6 2C ldA #44
808A B7 39 stA 0x39
(0031) PMRS=0b10000000; //④将L写入PMRS,置VCO的输出频率范
808C A6 80 ldA #-128
808E B7 3A stA 0x3A
(0032) // 围系数为$80
(0033) PRDS=0x01; //⑤将R写入PRDS
8090 A6 01 ldA #1
8092 B7 3B stA 0x3B
(0034) PCTL|=(1<<5); //⑥置PCTL.PLLON=1,启动PLL电路
8094 1A 36 Bset 5,0x36
(0035) PBWC|=(1<<7); //⑦PBWC自动带宽控制位=1,选择自动
8096 1E 37 Bset 7,0x37
(0036) // 控制方式
(0037) PCTL|=(1<<4); //⑧PCTL.BCS=1,选择PLL电路为时钟源
8098 18 36 Bset 4,0x36
809A 81 rts
_main:
RF --> X+0
LN --> X+2
809B A7 FD aiS #-3
809D 95 tSX
FILE: main.c
(0001) /*-----------------------------------------------------*
(0002) *工 程 名:TG12864E02.prj *
(0003) *硬件连接: 1.LCD的DB0-7与MCU的B口的PTB0-7连接 *
(0004) * 2.LCD的RS,R/W,E与MCU的PTC0,PTC1,PTC2连接 *
(0005) * 功 能:初始时显示:"苏州大学 " *
(0006) * "单片机实验室 " *
(0007) * "http://sumcu.s " *
(0008) * "uda.edu.cn " *
(0009) *-----------------------------------------------------*/
(0010)
(0011) /*[头文件]*/
(0012) #include "GP32C.h" //映像寄存器地址头文件
(0013) #include "lcd.h" //Lcd头文件
(0014) #include "SCI.h" //SCI头文件
(0015) //有关定时器寄存器位定义
(0016) #define TSTOPBit 5 //定时器计数停止位
(0017) //定时器初始化函数声明
(0018) void Timer1init(void);
(0019) //SCI初始化
(0020) extern void SCIInit(void);
(0021) //全局变量声明
(0022) unsigned char FLine=0; //得到焦点的行号
(0023) //[外部定义64个字节的Lcd显示缓冲区]
(0024) unsigned char LcdShowBuff[64]="苏州大学 "
(0025) "单片机实验室 "
(0026) "http://sumcu.s "
(0027) "uda.edu.cn ";
(0028) //*====================================================*
(0029) /*[主函数]*/
(0030) void main()
(0031) {
809E 9B seI
(0032) unsigned char *RF; //接收标志
(0033) unsigned char LN; //行号标志
(0034) asm("SEI"); //关总中断
(0035) Timer1init(); //调定时器1初始化子程序
809F CD 8132 jsr _Timer1init
(0036) Lcdinit(); //Lcd初始化
80A2 CD 81AC jsr _Lcdinit
(0037) SCIInit(); //SCI初始化
80A5 CD 8723 jsr _SCIInit
80A8 95 tSX
(0038) asm("CLI"); //开总中断
80A9 9A clI
80AA CC 812C jmp 0x812C
(0039) //[主循环]
(0040) //循环等待接收
(0041) while(1)
(0042) {
80AD A6 56 ldA #86
80AF 87 pshA
80B0 CD 8624 jsr _SCISend1
80B3 A7 01 aiS #1
80B5 95 tSX
(0043) SCISend1(86);
(0044) if(SCIRe1(RF)!=56) continue;
80B6 E6 01 ldA 1,X
80B8 87 pshA
80B9 F6 ldA 0,X
80BA 87 pshA
80BB CD 8671 jsr _SCIRe1
80BE A7 02 aiS #2
80C0 95 tSX
80C1 B7 41 stA *__r1
80C3 A1 38 cmp #56
80C5 27 02 beq 0x80C9
80C7 20 63 bra 0x812C
(0045) LN=SCIRe1(RF);
80C9 E6 01 ldA 1,X
80CB 87 pshA
80CC F6 ldA 0,X
80CD 87 pshA
80CE CD 8671 jsr _SCIRe1
80D1 A7 02 aiS #2
80D3 95 tSX
80D4 B7 41 stA *__r1
80D6 E7 02 stA 2,X
(0046) if(LN==1) //将接收到的数据放在第一行显示缓冲区
80D8 A1 01 cmp #1
80DA 26 10 bne 0x80EC
(0047) SCIReN(16,LcdShowBuff);
80DC 45 004F ldHX #0x004F
80DF 89 pshX
80E0 8B pshH
80E1 A6 10 ldA #16
80E3 87 pshA
80E4 CD 86D0 jsr _SCIReN
80E7 A7 03 aiS #3
80E9 95 tSX
80EA 20 40 bra 0x812C
(0048) else if(LN==2)//将接收到的数据放在第二行显示缓冲区
80EC E6 02 ldA 2,X
80EE A1 02 cmp #2
80F0 26 10 bne 0x8102
(0049) SCIReN(16,LcdShowBuff+16);
80F2 45 005F ldHX #0x005F
80F5 89 pshX
80F6 8B pshH
80F7 A6 10 ldA #16
80F9 87 pshA
80FA CD 86D0 jsr _SCIReN
80FD A7 03 aiS #3
80FF 95 tSX
8100 20 2A bra 0x812C
(0050) else if(LN==3)//将接收到的数据放在第三行显示缓冲区
8102 E6 02 ldA 2,X
8104 A1 03 cmp #3
8106 26 10 bne 0x8118
(0051) SCIReN(16,LcdShowBuff+32);
8108 45 006F ldHX #0x006F
810B 89 pshX
810C 8B pshH
810D A6 10 ldA #16
810F 87 pshA
8110 CD 86D0 jsr _SCIReN
8113 A7 03 aiS #3
8115 95 tSX
8116 20 14 bra 0x812C
(0052) else if(LN==4)//将接收到的数据放在第四行显示缓冲区
8118 E6 02 ldA 2,X
811A A1 04 cmp #4
811C 26 0E bne 0x812C
(0053) SCIReN(16,LcdShowBuff+48);
811E 45 007F ldHX #0x007F
8121 89 pshX
8122 8B pshH
8123 A6 10 ldA #16
8125 87 pshA
8126 CD 86D0 jsr _SCIReN
8129 A7 03 aiS #3
812B 95 tSX
(0054) }
812C CC 80AD jmp 0x80AD
812F A7 03 aiS #3
8131 81 rts
(0055) }
(0056)
(0057) /*[内部直接调用子程序存放处]*/
(0058) /*Timer1init:定时器1初始化子程序-----------------------*
(0059) *功能:对定时器1初始化 *
(0060) *参数:无 *
(0061) *返回:无 *
(0062) *-----------------------------------------------------*/
(0063) void Timer1init(void)
(0064) {
_Timer1init:
8132 A6 66 ldA #102
8134 B7 20 stA 0x20
(0065) //允许溢出中断、不启动计数、分频因子=64
(0066) T1SC=0b01100110;
(0067) //计数寄存器初值=0x0000
(0068) T1CNTH=0x00; T1CNTL=0x00;
8136 3F 21 clr 0x21
8138 3F 22 clr 0x22
(0069) //1/2秒产生1次溢出中断
(0070) //计数寄存器=1/2×(2457600/64)=1200
(0071) T1MODH=0x12; T1MODL=0x00;
813A A6 12 ldA #18
813C B7 23 stA 0x23
813E 3F 24 clr 0x24
(0072) //允许定时器1计数寄存器计数
(0073) T1SC&=~(1<<TSTOPBit);
8140 1B 20 Bclr 5,0x20
8142 81 rts
_isrTIMER1:
8143 8B pshH
8144 B6 40 ldA *__r0
8146 87 pshA
8147 B6 41 ldA *__r1
8149 87 pshA
814A B6 42 ldA *__r2
814C 87 pshA
814D B6 43 ldA *__r3
814F 87 pshA
8150 B6 44 ldA *__r4
8152 87 pshA
8153 B6 45 ldA *__r5
8155 87 pshA
8156 B6 46 ldA *__r6
8158 87 pshA
8159 B6 47 ldA *__r7
815B 87 pshA
815C B6 48 ldA *__r8
815E 87 pshA
815F B6 49 ldA *__r9
8161 87 pshA
8162 B6 4A ldA *__r10
8164 87 pshA
8165 B6 4B ldA *__r11
8167 87 pshA
8168 B6 4C ldA *__rhi
816A 87 pshA
816B B6 4D ldA *__rlo
816D 87 pshA
FILE: vectors08.c
(0001) /*-----------------------------------------------------*
(0002) *文件名:vectors08.c *
(0003) *功 能:用于定义中断矢量表 *
(0004) *-----------------------------------------------------*/
(0005) //[头文件]
(0006) #include "GP32C.H" //包含头文件
(0007) #include "lcd.h" //包含Lcd头文件
(0008) /*[定时器相应寄存器定义]*/
(0009) #define TOFBit 7 //定时器溢出标志位
(0010) //变量声明
(0011) //得到焦点的行号
(0012) extern unsigned char FLine;
(0013) //[外部定义64个字节的Lcd显示缓冲区]
(0014) extern unsigned char LcdShowBuff[64];
(0015)
(0016) //定时器1中断处理函数
(0017) #pragma interrupt_handler isrTIMER1
(0018) void isrTIMER1(void)
(0019) {
816E 9B seI
(0020) asm("SEI"); //关总中断
(0021) //通过实验,把刷新时间间隔置为1/2秒
(0022) //定时刷新Lcd显示缓冲中的数据
(0023) LcdShCh(LcdShowBuff);
816F 45 004F ldHX #0x004F
8172 89 pshX
8173 8B pshH
8174 CD 81ED jsr _LcdShCh
8177 A7 02 aiS #2
8179 95 tSX
(0024) //FLine为行号;1表示有边框;0为无边框
(0025) //LcdShGrRe(FLine,GrEnable);
(0026) //在指定位置画圆
(0027) //LcdShGrCil(31,64,10,4,GrEnable);
(0028) //LcdShGrCil(31,64,30,30,GrEnable);
(0029) //在指定位置显示点
(0030) //LcdShGr1P(31,64);
(0031) //清除定时器溢出标志位
(0032) T1SC&=~(1<<TOFBit);
817A 1F 20 Bclr 7,0x20
(0033) asm("CLI"); //开总中断
817C 9A clI
817D 86 pulA
817E B7 4D stA *__rlo
8180 86 pulA
8181 B7 4C stA *__rhi
8183 86 pulA
8184 B7 4B stA *__r11
8186 86 pulA
8187 B7 4A stA *__r10
8189 86 pulA
818A B7 49 stA *__r9
818C 86 pulA
818D B7 48 stA *__r8
818F 86 pulA
8190 B7 47 stA *__r7
8192 86 pulA
8193 B7 46 stA *__r6
8195 86 pulA
8196 B7 45 stA *__r5
8198 86 pulA
8199 B7 44 stA *__r4
819B 86 pulA
819C B7 43 stA *__r3
819E 86 pulA
819F B7 42 stA *__r2
81A1 86 pulA
81A2 B7 41 stA *__r1
81A4 86 pulA
81A5 B7 40 stA *__r0
81A7 8A pulH
81A8 80 rti
_isrDummy:
81A9 8B pshH
(0034) }
(0035)
(0036) //未定义的中断处理函数,本函数不能删除
(0037) #pragma interrupt_handler isrDummy
(0038) void isrDummy(void)
(0039) {
81AA 8A pulH
81AB 80 rti
FILE: lcd.c
(0001) /*-----------------------------------------------------*
(0002) *文件描述:本文件包含了液晶显示相关子程序,分别为: *
(0003) *(1)Lcdinit:液晶初始化子程序 *
(0004) *(2)LcdShCh:在液晶显示屏上显示字符数据 *
(0005) *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
(0006) *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
(0007) *-----------------------------------------------------*/
(0008)
(0009) //包含头文件
(0010) #include "gp32c.h"
(0011) #include "lcd.h"
(0012) //定义延时子程序
(0013) #define delay1600us DelayTimes(4000) //延时>1.6ms
(0014) #define delay72us DelayTimes(30) //延时>72us
(0015) #define delay40ms DelayTimes(10000) //延时>40ms
(0016) //内部调用函数声明
(0017) void DelayTimes(unsigned int); //延时指定时间
(0018) void Wtite_Command(unsigned char);//将控制命令写入Lcd
(0019) void Wtite_Data(unsigned char); //将数据写入Lcd
(0020) void LcdShGrClr(void); //在Lcd上清图形显示屏
(0021) //在Lcd指定位置上设置线型16个点的显示
(0022) void LcdShGr16P(unsigned char,unsigned char,int);
(0023) //在Lcd指定位置上画1个点
(0024) void LcdShGr1P(unsigned char,unsigned char);
(0025)
(0026) //==================[Lcd初始化操作]==========================
(0027) /*Lcdinit:初始化液晶-----------------------------------*
(0028) *功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
(0029) *参 数:无 *
(0030) *返 回:无 *
(0031) *-----------------------------------------------------*/
(0032) void Lcdinit(void)
(0033) {
_Lcdinit:
81AC A6 07 ldA #7
81AE B7 06 stA 0x06
(0034) LCD_CtrlPortDDR=0x07; //控制口低三位设置为输出
(0035) LCD_DataPortDDR=0xff; //数据口设置为输出
81B0 A6 FF ldA #-1
81B2 B7 05 stA 0x05
(0036) //[Lcd初始化]
(0037) delay40ms; //延时>40ms
81B4 45 2710 ldHX #0x2710
81B7 89 pshX
81B8 8B pshH
81B9 CD 85F9 jsr _DelayTimes
81BC A7 02 aiS #2
(0038) Wtite_Command(0b00110000); //8位数据,基本指令
81BE A6 30 ldA #48
81C0 87 pshA
81C1 CD 85C3 jsr _Wtite_Command
81C4 A7 01 aiS #1
(0039) Wtite_Command(0b00001100); //开显示
81C6 A6 0C ldA #12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -