对于单片机的学习,很多人都是从点灯程序开始的,这里我找到
了一个之前做实验的小板子,MCU是STC8H1K08,P54引脚接了一个
发光管经过电阻到地。由于P54引脚要拉高才能点亮发光管,所以端
口模式要设置成推挽模式,因此最最最简单的C语言点灯程序是下面的
样子:
看起来是不是很简单?全部加起来包括花括号只有7行代码,其中第一
行是文件包含伪指令,它把STC公司提供的对应“头文件”包含到此程序
中来,下面六行是一个C语言函数的标准写法,只是名为“main”的函
数很特殊,它是必须的,不能被别的函数调用,所以没有返回值,也不
需要参数。“void”是C语言中“无类型”关键字,“main”左边的
“void”代表“main”函数的返回值是“无类型”。“main”右边的
小括号中的“void”是它的参数的类型。紧跟着的一对“花括号”中间
装的是“main”函数的具体内容,它里面有三个分号,C语言语句以分
号结尾,前两句用于设置P54端口为推挽模式,第三句才是拉高P54引脚
真正实现点亮发光管的语句,当然也可以在前两句中把端口设置为准双
向口模式也是可以点亮的,但是没有前两句的话则是不能点亮的。经过编
译,上图中可以看到生成了24字节的代码,没有错误和警告,下载到实验
板上实测能点亮发光管。
再来看这三句C语言语句,中间都有“等号”,它可不是我们生活中
的“等于”的意思。“等号”右边就是数字,只是它的写法不常见,“等号”
左边是STC8H1K08这个芯片中寄存器的名字,它们都是在“头文件”中定
义的,大家可以用记事本或其它程序打开“头文件”仔细研究研究。什么是
寄存器?我们可以很形象的打个比方,说墙上有很多灯开关,其中一个叫
“P54”,我们在程序中把数字“1”写进“P54”这个开关中,然后灯这亮了,
也可以把数字“0”写进“P54”中,然后灯就灭了,所以这三个语句都是
把“等号”右边的数字写进左边的寄存器中,从而实现我们想要的结果。
除了头文件外,单片机的制造商还会提供对应单片机的参考手册和数据
手册,STC则很独特的把这两个文件外加例程都写进了一个PDF文件中,目前
这个“STC8H技术参考手册”达到了1640页。想要学好用好这个单片机就要
认真阅读此手册。
再来看一看“0x10”这个数字,其前缀“0x”代表它是16进制的数字,
翻译成常见的十进制的写法是“16”这个数字,同样的“0x00”就是十进制
的“0”,写成那样有强调它是一个8位数的意思,因为“等号”左边的
“P5M1”寄存器有8个位,语句的结果是要把8个位都写成“0”,而实际上
只需要把它的“4位”写成“0”就行了,其它的7个位最好是“保持原样”,
但是很遗憾,“等号”这种直接赋值的方式不能使其左边寄存器内的其它位
“保持原样”,必须得换一种写法才行,虽然“P54”可以直接赋值而不影响
其它“位”,但为了适应其它不支持“位操作”的单片机,我尽量少用这种
“位操作”的写法。同样的程序我改成了如下的样子:
#include "STC8Hxx.h"
#define BIT4 (0x10)//定义“4位”,注意这句没有分号!!
void main(void)
{
P5M1 &=~(BIT4);//拉低复位
P5M0 |= BIT4;//拉高置位
P5 |= BIT4;//P54拉高置位
}
其中“BIT4”对于单片机来说就是数字“0x10”,但是我们在读这个程
序的时候一眼就能看出是要对寄存器的哪一位做怎样的处理而不需要特别注明
语句的具体含义。我们要特别的记住“|=”是拉高某位(或某几位)而其它位保
持原样,“&=~”则是拉低某位(或某几位同时拉低的话要加圆括号括起来)而
其它位保持原样。
当然,实际的程序不可能只是这么简单,比如“#define”这样的位定义就
有8行(或更多),
#define BIT0 (0x01)
#define BIT1 (0x02)
#define BIT2 (0x04)
#define BIT3 (0x08)
#define BIT4 (0x10)
#define BIT5 (0x20)
#define BIT6 (0x40)
#define BIT7 (0x80)
我们可把这些(或更多的内容)写进我们自己的“Ext.h”这样一个头文件中,
然后包含进程序中,当然还要加上传说中的“大循环”:
#include "STC8Hxx.h"
#include "Ext.h"
void main(void)//程序从主函数开始执行
{
P5M1 &=~(BIT4);//只运行一次的程序
P5M0 |= BIT4; //写这这里,
P5 |= BIT4; //比如初始化程序
while(1)//大循环
{
;//要循环运行的语句写这里
}
}//主程序结束
//中断函数可以写在下面
今天就聊到这里,不足之处,欢迎指正。
|