第四掌 STM8单片机的触角—IO口的应用 联系客服

发布时间 : 星期一 文章第四掌 STM8单片机的触角—IO口的应用更新完毕开始阅读68357e4fc850ad02de80419c

图4-9 switch-case示例图

图4-10 跑马灯电路原理图

程序代码如下。

#include\开始时的头文件包含 /***************函数声明***************/ void delay(unsigned int time); //声明延时函数 /***************主函数*****************/ Into main(void) {

unsigned char i = 0;

PB_DDR = 0XFF; //设置IO口B为输出 PB_CR1 = 0XFF; //设置IO口B为推挽方式 PB_CR1 = 0X00; //输出最快速度为2MHz

PB_ODR = 0XFF; //设置输出寄存器的输出数值,初始化小灯全灭 while (1) {

switch (i) //让小灯从低位到高位依次亮 {

}

}

}

case 0: PB_ODR = 0XFE;

Delay(40000); //延时约20mS

i++; //让i加1下次执行程序时进入到case 2 break; //跳出case 0,重新到switch处检查i值

case 1: PB_ODR = 0XFD; Delay(40000);

i++; break;

case 2: PB_ODR = 0XFB; Delay(40000);

i++; break;

case 3: PB_ODR = 0XF7; Delay(40000);

i++; break;

case 4: PB_ODR = 0XEF; Delay(40000);

i++; break;

case 5: PB_ODR = 0XDF; Delay(40000);

i++; break;

case 6: PB_ODR = 0XBF; Delay(40000);

i++; break;

case 7: PB_ODR = 0X7F; Delay(40000);

i = 0; break;

default : PB_ODR = 0XFF; Delay(40000);

/************延时子程序************************/ void delay(unsigned int time) { }

while (t--); //让while执行t次空程序达到延时的目的

问:

我说老大呀我又懵了,上面的程序里IO口必须设置为推挽输出吗?速度就只能设置为

最快2MHz吗?

答:

懵啥呀有我在不用怕,其实它还可以设置为开漏方式,即PB_CR1 = 0x00,小灯是低电平点亮,电路图中我们在小灯正极外接了电源在这种情况下开漏与推挽两者的灌电流都很大所以没有什么区别,具体参考本章第一节,除此之外,还可以设置最快速度10MHz,即PB_CR2 = 0XFF。为了程序的规范编写,在定义函数时要完整,如unsigned char Delay(unsigned char t),如果在没有返回值时,前面最好加void,括号内没有定义行参时也定义void,如void Delay(void)。在写每个case时,一定不要忘了在相应的case语句后加跳出语句break,否则会接着执行下个case语句。

4.3.2 用for循环遛马

硬件电路图与图4-10一样。 初级骑马技巧代码如下。

#include\包含stm8头文件 /***************函数声明***************/ void delay(unsigned int x); //延时函数

/***************主函数*****************/ main() { }

/************延时子程序************************/ void delay(unsigned int x) {

while(x--); }

unsigned char i;

PB_DDR=0xff; //I/O口初始化,将PB口设为输出状态 PB_CR1=0xff; //PB口(CR1)置1推挽输出 PB_CR2=0X00; //CR2置0低速模式,初始化完成 PB_ODR = 0XFE; //低电平有效,点亮第一个LED while (1) { }

PB_ODR = 0XFE; //赋初值配合for循环使用 for(i=0;i<8;i++) { }

delay(50000);

PB_ODR <<= 1; //左移一位,点亮下一个LED

PB_ODR |= 0x01; //左移后最低位自动补0,故将最低为置高

4.4 数组与万能流水灯

利用数组让你腾云驾雾但需要反复磨练方能修成正果,原理图等同上节马圈,下面是你期待已久的至高技能。

#include \包含头文件使软件识别特殊寄存器像PB_DDR等 /**************定义一个二维数组************/ /*装入使小灯花样闪亮的数据 */ /******************************************/ unsigned char dis[5][8]= {

{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}, {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}, {0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff}, {0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}, {0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f} };

/***************函数声明***************/ void GPIO_Init(void); void display(void);

/***************主函数*****************/ int main(void) {

GPIO_Init(); //端口初始化 while(1) //死循环 {

display(); //始终让小灯显示花样 } }

/**************GPIO口的初始化*****************/ void GPIO_Init(void) {

PB_ODR=0xff; //初始使小灯全灭

PB_DDR=0xff; //DDR为0是输入,1是输出。此处为PB的8个端口均为输出 PB_CR1=0xff; //推挽输出模式 PB_CR2=0x00; //低速输出模式 }

/************小灯花样显示子程序***************/ void display(void) {

unsigned char i,j;

for(i = 0; i < 5; i++) //循环二维数组的行数 {

// GPIO口的初始化子程序 // 用PB口显示花样小灯子程

void delay(unsigned int time) ; // 延时子程序