一、准备工作

1、KEIL C51编译环境

2、CodeGen8 代码生成器

3、MC96F6332D 开发板

4、USB-OCD II仿真器

二、生成GPIO的代码

1、在CodeGen8 代码生成器的外设窗口中选择内部RC时钟作为时钟源,并设置时钟的频率为8MHz,配置情况如下图①所示;设置GPIO中P07为输出引脚,模式配置为推挽输出且不使能引脚的上拉电阻;配置情况如下图②所示:

昂达h61v主板bios_昂达h61v主板bios

在main.c的窗口中可以看到CodeGen8 已经根据选择自动生成设置的代码段。

2、点击CodeGen8 中的C 图标,自动打开KEIL C51软件;下一步进行代码的修改、编译和程序下载;

1)、在代码中删除LCD驱动代码,本实验暂时用不到LCD部分;

2)、添加可以直接操作P07端口的置位和复位代码段,如下所示:

//设置P07置位
void P0GPIO_SETBit7()
{
	
	P0 |= 0x80;
	
}

//设置P07复位
void POGPIO_RESETBit7()
{
	
	P0 &= 0x7F;
	
}

针对端口P07初始化代码如下所示,P0GPIO_Bit7_Init();函数要放到代码生成器中port_init()函数之后;

//P07初始化操作
void P0GPIO_Bit7_Init()
{
	
	P0IO |= 0x80;    	// direction			//Bit7 set output									//P0 方向寄存器				 (0:输入	1:输出)
	P0PU |= 0x00;    	// pullup					//Bit7 set output									//P0 上拉电阻选择寄存器(0:禁止	1:使能)
	P0OD |= 0x00;    	// open drain			//Bit7 set open drain							//P0 漏极开路选择寄存器(0:推-拉输出	1:漏极开路输出)
	P0DB |= 0x00;    	// bit7~6(debounce clock), bit5~0=P07~02 debounce		//P0 消抖使能寄存器		 
	
}

3)、增加延时函数,代码如下所示:

/**
  * @brief  Inserts a delay time.
  * @param  nCount: specifies the delay time length.
  * @retval None
  */
void Delay(int nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

4)、编写主函数中while语句,代码如下:

// TODO: add your main code here	
	while(1)
	{
		 /* Toggle LEDs LD1..LD4 */
			P0GPIO_SETBit7();
			Delay(0xFFFF);
			POGPIO_RESETBit7();
			Delay(0xFFFF);
	}

5、将仿真工具OCD II连接到电脑端的USB口,点击KEIL C51编译器中的魔术棒,在Debug选项卡中选择ABOV OCD-1/2 dongle,在Utilities选项卡的 Configure Flash Menu Command选项中同样选择ABOV OCD-1/2 dongle;最后点击OK。

6、编译工程,可以看到编译结果:无错误、无警告。

昂达h61v主板bios_寄存器_02

8、代码解析:通过MC96F6332D的user‘s Manual手册中 I/O Ports章节可以看出实验代码的含义:

针对 P0 方向寄存器和 P0PU 上拉电阻寄存器如下:

昂达h61v主板bios_引脚_03

 

针对P0OD开漏寄存器和消抖寄存器P0OB的寄存器如下:

昂达h61v主板bios_引脚_04

其中消抖寄存器P0OB是在GPIO引脚作为外部中断功能的时候才使能,如果引脚作为普通GPIO可以不需要开启。针对P0OB寄存器后面用到后再详细讲解。关于P0FSRH/L寄存器为P0端口的复用功能寄存器,同样在后面章节用到后再详细讲解,此处暂时忽略。

总结:此时可以看出,单片机的GPIO操作和功能都十分简单,根据自己的需求配置对应的寄存器即可。

9、点击编译器的下载按钮,将刚刚编译好的代码下载到MCU中进行调试仿真。

三、实验现象

1、本实验是通过操作P07引脚的GPIO的寄存器,实现LED灯的闪烁现象;

2、具体的参考代码可以访问链接:https://share.weiyun.com/500WLKu;进行免费下载。

备注:

1)、系统时钟切换为8MHz;

2)、针对数据寄存器Px(x取值为0,1,2,3,4,5)的操作:采用字节进行操作,避免采用位操作,即IF(P10) → IF(P1&0x01),左边的指令应该改成右边的指令形式。在数据手册同样有说明。

 

 

因为小编自己能力水平有限,文中难免有错误或表达不到的信息,还望广大阅读者留言批评指正,谢谢。