零、概述
对内存地址进行操作
P0口,可数据传输,与地址低字节
P2口,可高8位地址
一、训练任务
在CT107D单片机综合训练平台上,分别用I/O扩展方式与存储器扩展方式对LED灯和数码管进行基本的控制。
1.首先点亮指示灯低4位,关闭高4位,延时片刻,点亮指示灯的高4位,关闭低4位,延时片刻,关闭所有指示灯。
2.然后依次逐个点亮数码管的所有段码,每次只点亮一个数码管 。
3.循环执行上述功能。
二、训练准备
2.1 外部资源的地址映射关系
0x8000—指示灯
0xa000—蜂鸣器与继电器
0xc000—数码管位选
0xe000—数码管段码
2.2 提示
1.进行存储器映射扩展,CT107平台的J13要将1-2脚短接
2.引入“absacc.h”,通过XBYTE关键字来直接操作扩展资源。
3.存储器映射扩展方式要占用单片机的P3.6引脚。
4.
三、代码展示
3.1 IO扩展
#include typedef unsigned int uint; typedef unsigned char uchar; void Delay(uint t) { while(t--); while(t--); } //配置HC138 void SelectHC138(uchar channel) { switch(channel) { case 4: //LED P2 = (P2 & 0X1F) | 0X80; break; case 5: //蜂鸣器和继电器 P2 = (P2 & 0X1F) | 0Xa0; break; case 6: //位码 P2 = (P2 & 0X1F) | 0Xc0; break; case 7: //段码 P2 = (P2 & 0X1F) | 0Xe0; break; case 0: //锁住所有寄存器 P2 = (P2 & 0X1F) | 0X00; break; } } void LEDRuning() { SelectHC138(4); //打开LED的HC138 P0 = 0XF0; Delay(60000); Delay(60000); P0 = 0X0F; Delay(60000); Delay(60000); P0 = 0XFF; Delay(60000); Delay(60000); } void SMGRuning() { uchar i; for(i = 0; i < 8; i++) { SelectHC138(6); P0 = 0X01 << i; SelectHC138(7); P0 = 0X00; Delay(60000); Delay(60000); } P0 = 0XFF; Delay(60000); Delay(60000); } void Initsys() { SelectHC138(5); P0 = 0X00;//关闭蜂鸣器和继电器 SelectHC138(4); P0 = 0XFF;//关闭LED } void main() { Initsys(); while(1) { LEDRuning(); SMGRuning(); } }
3.2 存储器扩展
#include #include "absacc.h" typedef unsigned int uint; typedef unsigned char uchar; void Delay(uint t) { while(t--); while(t--); } void LEDRuning() { XBYTE[0X8000] = 0XF0; Delay(60000); Delay(60000); XBYTE[0X8000] = 0X0F; Delay(60000); Delay(60000); XBYTE[0X8000] = 0XFF; Delay(60000); Delay(60000); } void SMGRuning() { uchar i; for(i = 0; i < 8; i++) { XBYTE[0XC000] = 0X01 << i; XBYTE[0XE000] = 0X00; Delay(60000); Delay(60000); } XBYTE[0XE000] = 0XFF; Delay(60000); Delay(60000); } void main() { while(1) { LEDRuning(); SMGRuning(); } }
四、注意事项
1.XBYTE后面是中括号[]
2.如果用到矩阵键盘,就不雅用寄存器扩展方式,因为与P3^6产生冲突