📄 51
字号:
#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned intsbit CLK=P1^0; //MCP4822输入CLK输入sbit DAT=P1^1; //MCP4822输入DAT串行输入信号sbit CS=P1^2; //MCP4822片选端sbit LCAC=P1^3; //MCP4822同步输入控制端const uchar LIGHT[12]={ 0x3d,0xff,0x3b,0xff, 0x39,0xff,0x37,0xff, 0x35,0xff,0x30,0x00}; //电压控制信号uchar i=0,k=200; //控制电压、定时计数器初始值bit flag=0; //锁键盘标志位,为0表示锁定,为1表示解锁/**************************声明函数******************************/void init_timer0(void); //定时器0初始化子程序void send(uchar *dat1,uchar m);//MCP4822 D/A转换子程序void delay(uint t); //延时程序bit key_press(void); //按键按下判断程序void keyscan(void); //按键处理程序void keyscan1(void); //锁定键解除判断程序/***************************主函数********************************/main(){ init_timer0(); //初始化定时器0 while(1) { keyscan1(); //锁定键是否按下 while(flag==1) //键盘解锁? { keyscan(); //按键处理 } if(k==0) //10s定时结束 { send(LIGHT,5); //LED灯关闭 k=200; //设定定时计数器初值 } }}/*********************定时器0初始化子程序************************/void init_timer0(void){ TMOD=0x01; //定时器0选择工作方式1 TH0=(65536-50000)/256; //定时时间为20ms TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断}/***************************延时子程序***************************/void delay(uint t){ uchar j; for(;t>0;t--) for(j=19;j>0;j--);}/************************按键按下判断程序***********************/bit key_press(void){ uchar key; P1=0xe0; //输入键盘扫描码 key=P1; //读入键盘状态 if((key&0xe0)!=0xe0) { return(1); //有键按下返回1 } else { return(0); //无键按下返回0 }}/***********************定时器0中断服务程序***********************/void timer0(void)interrupt 1{ TH0=(65536-50000)/256; //重新载入计数初值 TL0=(65536-50000)%256; if(--k==0) { flag=0; //计时到,锁定键盘 TR0=0; //停止计时 }}/*********************MCP4822 D/A转换子程序**********************/void send(uchar *dat1,uchar m){ uchar n,j,temp; CS=1; CS=0; //产生下降沿,开始数据传送 for (j=0;j<2;j++) { temp=dat1[2*m+j]; //先送出控制位及高4位数据,再将低8位数据送出 for(n=0;n<8;n++) { CLK=0; if((temp&0x80)==0x80)//按位将数据从DAT脚送出 { DAT=1; } else { DAT=0; } temp=(temp<<1); //准备发送下一位 CLK=1; //上升沿送出待发送数据 } } CS=1; LCAC=1; LCAC=0; //下降沿将转换后数据送出 LCAC=1;}/*************************按键处理程序***************************/void keyscan1(void){ uchar keyv; if(key_press()==1) //有键按下? { delay(200); //延时去抖 if(key_press()==1) //有键按下? { keyv=P1; //读入键值 if((keyv&0xe0)!=0xe0)//读入键值 { if((keyv&0xe0)==0x60)//开锁键按下? { flag=1; //按键解锁 } while(key_press()==1);//等待按键释放 send(LIGHT,i);//显示灯亮 TR0=1; //启动定时器0 } } }}/***********************锁定键解除判断程序***********************/void keyscan(void){ uchar keyv; if(key_press()==1) //有键按下? { delay(200); //延时去抖 if(key_press()==1) //有键按下? { keyv=P1; //读入键值 if((keyv&0xe0)==0x60)//按下键为闭锁键 { while(key_press()==1);//等待按键释放 k=200; //10s重新计时 send(LIGHT,i);//送出控制电压 } if((keyv&0xe0)==0xa0)//按下键为灯光亮度增强键,且亮度不是最高值 { while(key_press()==1);//等待按键释放 if(i>0) { i--; //亮度值增加 } k=200; //10s重新计时 send(LIGHT,i);//送出控制电压 } if((keyv&0xe0)==0xc0)//按下键为灯光亮度减弱键,且亮度不是最低值 { while(key_press()==1);//等待按键释放 if(i<5) { i++; //亮度值减小 } k=200; //10s重新计时 send(LIGHT,i);//送出控制电压 } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -