| /* PWM program on 51 Mcu Study Board II zl0801 2006-11-19 16:23 zhaoliang0801@gmail.com 功能描述: 利用开发板上的0~F16个按键,设置PWM的设定值, 定时器中,比较当前值是否到达设定值,来改变 LED的亮度。 操作:下载程序后,按下0~F任意一个按键,观察 观察现象,0为熄灭,F最亮 */ #i nclude <reg51.h> #i nclude <intrins.h>
#define CIRCLE 16 // 定义最大的循环值 等级
bit flag; // 定义中断 按键标志位 unsigned char count=1,last; // 计数变量 和 高电平持续变量 code unsigned char key_tab[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7, 0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7}; // 开发板按键 码值
sbit led=P2^0; // PWM 输出端口
unsigned char ReadKey(void); //扫描键盘 返回键值 void init(void);
void main(void) { init(); while(1) { P0=0XF0; //预置P0 口准备读取键值 if(flag) //检测时候 进入中断 { last=ReadKey(); flag=0; //清除 标志位 } } }
void init(void) { EA=1; ET0=1; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TR0=1; EX0=1; //开启外部中断 0 IT0=1; // 设置成 下降沿触发方式 count=1; last=1; }
void into(void) interrupt 1 { count++; // 每个1ms 变量 加1 if(count>CIRCLE) // 判断如果超过 设定的周期,置1 { count=1; } if(count<=last) // 否则,判断是否到达设定的比较值 led=0; // 小于 灯亮 else led=1; // 大于 等灭 TH0=(65536-1000)/256; TL0=(65536-1000)%256; }
//========**************===== void key_scan() interrupt 0 //外部中断 0 的优先级最高 { // 所以用 0 flag=1; //置标志位为 1 }
//************************ unsigned char ReadKey(void) { unsigned char i,j,key,delay; j=0xfe; //预置 准备 扫描 for(i=0;i<4;i++) //循环四次 扫描 { P0=j; //附值给P0 for(delay = 50; delay > 0; delay--) _nop_(); if((P0&0xf0)!=0xf0) //如果有按键 按下 { key=P0; //读取键值 break; //跳出for 循环 或者 while 循环 } j=_crol_(j,1); //循环左移 处理 key=0xff; } for(i=0;i<16;i++) //循环16次 查表的到相应的键值 if(key==key_tab[i]) return i; //返回键值
return 0x10; //否则 返回错码 } |