一 按键与点灯

学习单片机第一步就是点亮LED,常用3种IO控制方法。

一;按键检测查询法

1;头文件

#include “stc8g.h”

#include “intrins.h”

2;IO口位定义

/* 发光二极管引脚定义 */

sbit LED_R = P0^5; // 红色LED

sbit LED_Y = P0^6; // 黄色LED

sbit LED_G = P0^7; // 绿色LED

/* 按键引脚定义 */

sbit K1 = P3^7; // 按键K1

sbit K2 = P3^6; // 按键K2

sbit K3 = P3^5; // 按键K3

3;延时函数

void Delay1ms() //@35MHz

{简单,略

}

4;循环判断

if(K1==0) // 如果按键K1按下

{

LED_R = !LED_R; // 改变红色LED的显示状态

}

if(K2==0)

{

LED_Y = !LED_Y;

}

 

 

 


二;按键检测-外部中断

1;头文件

#include “stc8g.h”

#include “intrins.h”

2;位定义

sbit LED_R = P0^5; // 红色LED

sbit LED_G = P0^7; // 绿色LED

3;延时(简单略)

4;中断处理函数

/* 按键K2按下 进入外部中断INT2 */

void INT2_Isr() interrupt 10

{

LED_R = 1; // 熄灭红色LED

}

/* 按键K1按下 进入外部中断INT3 */

void INT3_Isr() interrupt 11

{

LED_R = 0; // 点亮红色LED

}

5;打开外中断

INTCLKO = 0x30; //使能INT2 INT3 下降沿中断

EA = 1; // 打开总中断


三;按键检测-CCP捕获中断

1;头文件

#include “stc8g.h”

2;引脚位定义

/* 发光二极管引脚定义 */

sbit LED_R = P0^5; // 红色LED

sbit LED_Y = P0^6; // 黄色LED

sbit LED_G = P0^7; // 绿色LED

3;/* 按键中断处理 */

void PCA_Isr() interrupt 7

{

if(CCF2 == 1) // 如果是按键K1产生的CCP0中断

{

CCF2 = 0; // 清除中断标志位

LED_R = !LED_R;

}

else if(CCF1 == 1) // 如果是按键K2产生的CCP1中断

{

CCF1 = 0; // 清除中断标志位

LED_Y = !LED_Y;

}

else if(CCF0 == 1) // 如果是按键K3产生的CCP2中断

{

CCF0 = 0; // 清除中断标志位

LED_G = !LED_G;

}

}

4;配置PCA初始化

4.1  /* PCA初始化 设置P_SW1寄存器绑定对应的IO脚 */

P_SW1 &= ~(1<<5); // P_SW1 的第5位置0

P_SW1 |= (1<<4); //P_SW1 的第4位置1

4.2 CCON = 0x00; // PCA中断标志位清0,CCON寄存器有3位是PCA状态显示寄存器

4.3 CMOD = 0x08; // 设置PCA时钟为系统时钟 禁止PCA溢出中断

4.4 CCAPM2 = 0x11; // 扩展外部端口CCP2为下降沿中断口 对应按键K1,CCAPMx是触发设置寄存器

CCAPM1 = 0x11; // 扩展外部端口CCP1为下降沿中断口 对应按键K2

CCAPM0 = 0x11; // 扩展外部端口CCP0为下降沿中断口 对应按键K3

EA = 1; // 打开总中断

CCP可以复用到3组io,先设置引脚,外中断不够时,设置CCP复用中断也是可以的

4.1

4.2

4.3

4.4