key.c
#include "key.h" //把led.h文件包含进来
#include "system.h" //把timer0.h文件包含进来
uchar ledstat = 0; //0灭,1暗,2中,3亮
uint y;
uint z;
uint Keycumo () //触摸扫描函数
{
static uint timer=0;
if( touch==0)
{
timer++;
if(timer==10){return(1);} //定时10毫秒返回KEY1
else if(timer==800){timer=400;return(1);} //否则长按不停加1
}
else
{
timer=0;
}
return 0;
}
void ledgo()
{
if(ledstat ==0)
{
led =1; lamp = 0;
}
if(ledstat ==1)
{
PWM1( );
}
if(ledstat ==2)
{
PWM2( );
}
if(ledstat ==3)
{
led =0; lamp = 1;
}
}
void datapros() //触摸加减函数
{
uchar key;
key=Keycumo (); //key=调用按键扫描函数
if(key==1)
{
ledstat++;
}
if(ledstat >=4)
{
ledstat =0;
}
ledgo();
}
void PWM1( )
{
y++;
if(y>=7) // 设置7毫秒
{
y=0;
}
if(y<=1) //设置1毫秒为低电平 ,led低电平为灭
{
led =0; lamp = 1;
}
else led =1; lamp = 0; //否则其余6毫秒时间为高电平,led高电平为亮
}
void PWM2( )
{
z++;
if(z>=5) // 设置5毫秒
{
z=0;
}
if(z<=2) //设置2毫秒为低电平 ,led低电平为灭
{
led =0; lamp = 1;
}
else led =1; lamp = 0; //否则其余3毫秒时间为高电平,led高电平为亮
}
key.h
#include "system.h" //把timer0.h文件包含进来
//sbit k1=P3^7;
sbit lamp=P3^7;
sbit touch = P1^5;
sbit led=P1^1;
void PWM1( );
void PWM2( );
void Dig_Poll(void);
uint Keycumo ();
void datapros();
void ledgo();
main.c
#include "system.h"
#include "key.h"
extern uchar flag_1ms; //在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
void main(void) //程序的主函数
{
Timer0_Init(); ////定时器0函数调用
while(1) //大括号里面的东西,被不停的循环执行
{
//1ms进入一次
if(flag_1ms==1) //加了我之后,我的大括号里面的东西,被定期的1ms执行一次,反复执行
{
flag_1ms=0;
datapros(); //触摸加减函数
// lamp = 0; //上电指示灯亮起
}
}
}
```handlebars
#include "reg51.h"
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整形
#define FOSC 12000000L //定义晶振频率
#define T1MS (65536-FOSC/12/1000) //定时10毫秒的时候,计数器要写入的值
//void Delay_us(uint xus); //us级延时
//void Delay_ms(uint xms); //ms级延时
void Timer0_Init(void); //定时器初始化
```handlebars
#include "system.h"
uchar flag_1ms=0;
void Timer0_Init(void)
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
TMOD = 0x01; //设置定时器0用十六位定时器方式
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1 //中断号1
{
TH0 = T1MS>>8; //赋初值
TL0 = T1MS; //赋初值
flag_1ms=1;
}