(1) 切换bank 问题
458一共有两个bank,每个都是由20-3f 。
如果需要切换bank来用的话,则需要改变操作寄存器 R4的第6和第7位来实现。我定义一个宏来处理:
;-----------------------macro defination---------------------
bank0 macro
bc 0x04,6
bc 0x04,7
endm
;------------------------
bank1 macro
bs 0x04,6
bc 0x04,7
endm
这里就定义了两个宏,分别是 bank0,bank1,用的时候直接用就可以。而这里想说说程序开始初始化的时候清bank的程序,相对于156是需要改程序的,反而这个跟 468非常相似,倒是可以直接跟 468通用了(468相应修改成4个bank就可以了。),简单用了一下二重循环搞定。
程序清单:
;----------------------clear rams of all banks----------------------
clear_all_ram:
mov a,@0x10
mov r4,a
bank0
call clr_ram
bank1
call clr_ram
ret
clr_ram:
clr r0
inc r4
mov a,@0x3f
and a,r4
jbs psw,z
jmp clr_ram
mov a,@0x10
mov r4,a
ret
这里的
and a,r4
jbs psw,z
不能换成 xor ,因为xor会受R4最高两位选择bank位的影响。
(2) 切换 page 问题
实际用的话是在是太简单了,所以这里着重分析原理。
首先R2是PC和堆栈,都是12位宽。 不要和程序代码的13位宽度搞反了。参看datasheet的第7页的内容:
这个就是PC的结构,一个page一共就是1K字节(1024字节),也就是210 ,显然需要用到 A0-A9 一共10个位来寻址。A11和A10是用来切换Page的。Call和jmp 指令(也只有这两个指令是需要切换page的了。),有个共同点,操作的时候的步骤:都是将R2低10位的值载入,这样可以访问 210 个地址,也就是1个page的程序页,不切page的话他们都可以访问整个程序页。Jmp是直接跳转,不用考虑返回问题,所以这个属于比较简单的,只需要
page1
jmp process
这样就可以跳到其他页面了,之后PC指针也在后来的页面工作。这个比较简单,pass掉吧。
Call是需要考虑程序调用后的返回的问题。
首先跟jmp一样,先将PC+1压入堆栈,然后装载低10位的地址,然后根据10和11位来决定在哪个页面工作
page0
……..
page1
call subprogram
这样就调用了page1的子程序了。当子程序结束,执行ret返回的时候,由于堆栈和PC都是12位的,所以PC出栈的时候能直接恢复,这个时候的PC指针是正常的,也就是之前压入堆栈的PC+1值了。但是有个问题,虽然PC值正常,但是实际上 R3里面的5,6位的PS0和PS1位是并没有改变的,这样有个隐患,如果不执行 jmp 的话那是正常的没有问题,但是一旦执行了jmp,PC的10和11位会自动装载 R3 的PS0,PS1位,变成了上次执行call的时候切换的那个页面了。程序跑飞。如果这个时候想执行同一个page的子程序,没有切换page的指令,那么call指令同样会出错。所以对于call指令应该是:
page0
………..
page1
call subprogram
page0
调用完子程序之后记得切换回原来的Page
关于中断
中断发生的时候是将这个PC压入堆栈,尽管PC指针已经跳到0x08的中断入口处,但是R3的PS0和PS1位并没有被改变,所以,如果在中断服务程序中,不执行call和jmp指令就没有关系,一旦执行就会出错。所以需要进行一次切换Page的动作的,切换回page0就可以了,这样可以保证jmp的时候是在中断服务程序的范围之内跳。退出中断之前是恢复了R3的值的,所以是不需要在结尾切换page了。
虽然说能切换,但是基本上个人不是很建议多次来回的切换,尽量将比较整体的部分写在同一个page,这样可以减少出错的机会。
关键字:单片机 page bank 切换问题
引用地址:
单片机page和bank切换问题
推荐阅读最新更新时间:2024-03-16 15:11
POV LED时钟的设计
设计一个旋转的LED时钟,将一排LED灯组安装在指针旋转板上,利用人眼的视觉暂留效应,使用单片机I/O端口控制LED的点亮和熄灭形成图像从而显示出时钟画面。在介绍旋转LED时钟的实现原理和方案的同时,给出了其硬件电路设计和软件流程。 1 旋转时钟原理分析 物体在快速运动时,当人眼看到的影像消失后,人眼仍能继续保留其影像,约0.1秒左右,这种现象称为视觉暂留现象。旋转时钟就是利用了视觉暂留效应,原理如图1所示。图1(a)中最内侧的一个发光二极管和最外侧的一个发光二极管在点亮并绕电机轴高速旋转后就形成了图1(b)所示的内框和外框。图1(b)紧挨着外框的那个LED灯用来显示时间刻度。假设12点那个刻度为0°,则每个小时时针之间的角度
[单片机]
PIC 单片机 C 语言编程简介(4)
11.9 C 和汇编混合编程 有两个原因决定了用 C 语言进行单片机应用程序开发时使用汇编语句的必要性:单片 机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清 看门狗指令 clrwdt 和休眠指令 sleep ;单片机系统强调的是控制的实时性,为了实现这 一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会 出现 C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。 11.9.1 嵌入行内汇编的方法 在 C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的 汇编指令,PICC 提供了一个
[单片机]
51单片机(十五)—— 定时器模块介绍
STC89C516单片机内部有3个16位可编程的定时器/计数器,即定时器T0、T1和T2。它们既有定时又有计数功能。通过设置相关的特殊功能寄存器可以选择启动定时功能或计数功能。需要注意的是,这个定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部控制线连接并相互作用。CPU一旦开启定时功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断,即通知CPU处理。 定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,用来确定T0和T1的工作方式和功能;TCON是控制寄存器,控制T0和T1的启动和停止以及设置溢出标志。T
[单片机]
用CPLD实现单片机与ISA总线并行通信
摘要: 用ALTERA公司MAX7000系列CPLD芯片实现单片机与PC104 ISA总线接口之间的并行通信,给出系统设计方法及程序源代码。包括通信软件和AHDL设计部分。
关键词: CPLD ISA总线 并行通信
CPLD(Complex Programmable Logic Device)是一种复杂的用户可编程逻辑器件,由于采用连续连接结构。这种结构易于预测延时,从而电路仿真更加准确。CPLD是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。近年来,由于采用先进的集成工艺和大批量生产,CPLD器件成本不断下降,集成密度、速度和性能大幅度提高,一个芯片就可以实现一个复杂的数字电
[工业控制]
大神教你快速上手:标准80C51单片机模拟I2C总线的主机程序
I2C总线协议程序 在做程序是我在网上找的是周立功的程序,感觉还不错顺便转载;在使用的过程中一定要注意时序、时间的问题。 “i2c.h文件” //I2C总线综合发送函数,向从机发送多个字节的数据 I2C读写EEPROM流程图 bit I2C_Puts( unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size ); //I2C总线综合接收函数,从从机接收多个字节的数据 bit I2C_Gets ( unsigned char SlaveAddr, unsigned int SubAddr
[单片机]
MSP430单片机的热敏电阻温度测量
摘要 传统的数字式测量电阻的方法是先将电阻值转换为电信号(如电压),再用A/D转换器将其转换为数字信号,因此电路复杂,费用高。本文介绍一种类R—F转换频率测量温度的方法。直接把热敏电阻Rt接到由RC构成的多谐振荡器电路中,用MSP430单片机的捕获功能来获得多谐振荡器输出信号高低电平的脉宽并同时计数,则热敏电阻Rt与捕获高低电平时的计数值的差值成正比关系,查表可得温度值。 测量温度一般采用热敏电阻做传感器,测量的方法有R—V转换电压测量法和R—F转换频率测量法。这两种方法的电路复杂且成本高,电路中很多元器件直接影响测量精度。本文论述一种类R—F转换频率的测量法,用NE555定时器和热敏电阻等器件构成振荡器,由MSP430单片机
[单片机]
单片机小白学习之路(九)---矩阵按键在数码管上显示数字
目标:矩阵按键在数码管上显示数字 矩阵按键模块: 矩阵按键模块 P0~3是一组,P4~7是一组 矩阵按键识别方法: (1)逐行扫描 是种常见的方法,先把高四位全部置低电平,低四位置高电平,如果有按键按下那么低四位就会出现不全为1的情况,因为按键变不导通状态,之前是导通,这样就知道有按键按下了。 知道按键按下后就要判断具体是哪个按键按下的,于是把高四位和低四位变高电平,然后逐行逐列检测发现有行有个低电平,又发现个列有低电平,两个一交叉就知道是哪个按键按下的了 (2)行列扫描 通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位变不全为高电平,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下。
[单片机]
单片机流水灯简单C语言代码--位操作和字操作
单片机 之前都是在CSDN查阅资料,第一次使用写博客,就想记录一下自己的学习。程序小白若有不足的地方还望多多指正,万分感谢!!嘿嘿~ 流水灯位操作 #include reg51.h //我这里用到的是51单片机 #include intrins.h sbit LED0 = P1^0; sbit LED1 = P1^1; sbit LED2 = P1^2; sbit LED3 = P1^3; sbit LED4 = P1^4; sbit LED5 = P1^5; sbit LED6 = P1^6; sbit LED7 = P1^7; //下方调用了一个延长时间为1秒的函数 void delay1s(void)
[单片机]