求一个按键控制52单片机定时的C程序 10
各位大虾,小人刚学单片机,现想编个程序:52单片机P1.0口的LED有亮10秒/灭60秒、亮10秒/灭10分钟、亮10秒/灭30分钟三种闪烁方式,在P3.3接一个按键可循...
各位大虾,小人刚学单片机,现想编个程序:52单片机P1.0口的LED有亮10秒/灭60秒、亮10秒/灭10分钟、亮10秒/灭30分钟三种闪烁方式,在P3.3接一个按键可循环调用三种状态,同时在P1.1~P1.3三个口用LED分别指示。求各位大虾出援手编个C程序(不要用汇编的哦)。小人实在转不过弯,所以最好能加上注解,以便于我理解。
分不多,各位大虾包容包容,先谢谢了!
致: liushiming82-会者不难,难者不会。
致: 无界自由-这个程序看似还有串口、图片显示等内容,我更看不懂,谈何修改? 展开
分不多,各位大虾包容包容,先谢谢了!
致: liushiming82-会者不难,难者不会。
致: 无界自由-这个程序看似还有串口、图片显示等内容,我更看不懂,谈何修改? 展开
5个回答
展开全部
这里是我用的键盘扫描程序,你可以参考着改一下就可以实现你的功能了,你就只需要再加一个延时子程序以及在相应的按键键码加上相应的动作就行了。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(void);
uchar kbscan(void);
void Txbyte(unsigned char i);
void Txword(int i);
void TxEOF();
void InitForUART();
void DisPicture(int No);
main()
{ uchar key;
InitForUART();
while(1)
{
key=kbscan();
if(key!=0)
{
switch(key)
{
case 0x21:DisPicture(0x00);
break;
case 0x22:DisPicture(0x01);
break;
case 0x24:DisPicture(0x02);
break;
case 0x11:DisPicture(0x03);
break;
case 0x12:DisPicture(0x04);
break;
case 0x14:P0=0x80;
P2=0xF0;
break;
case 0x09:P0=0xB0;
P2=0xF0;
break;
case 0x0A:P0=0x82;
P2=0xF0;
break;
case 0x0C:P0=0x90;
P2=0xF0;
break;
/*case 0x44:P0=0xF8;
P1=0xf7;
break;
case 0x42:P0=0x83;
P1=0xf7;
break;
case 0x41:P0=0x8E;
P1=0xf7;
break;
case 0x88:P0=0x99;
P1=0xf7;
break;
case 0x84:P0=0x80;
P1=0xf7;
break;
case 0x82:P0=0xC6;
P1=0xf7;
break;
case 0x81:P0=0xc0;
P1=0xf7;
break;*/
default:P2=0xff;
}
}
}
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P1=0x07; //发0扫描,列线输入
if ((P1 & 0x07) != 0x07) //有键按下
{
delayms(); //延时去抖动
if ((P1&0x07)!= 0x07)
{
sccode = 0xF7; //逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x07)!=0x07)
{
recode=(P1&0x07)|0xf8;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void delayms(void)
{
unsigned char k,y;
for (k=200; k>0; k--)
for (y=50;y>0;y--);
}
void Txbyte(unsigned char i) //发送字节
{TI=0;
SBUF=i;
while(!TI);
TI=0;
}
void Txword(int i) //发送字
{unsigned char x,y;
x=(i/256);
Txbyte(x);
y=i-256*x;
Txbyte(y);
}
void TxEOF() //帧尾
{Txbyte(0xcc);
Txbyte(0x33);
Txbyte(0xc3);
Txbyte(0x3c);
}
void InitForUART() //串口初始化
{
TMOD=0x21;
SCON=0x50;
TH0=0x4c;
TL0=0x00;
TH1=0xf3;
TL1=0xf3;
EA=1;
ET0=1;
TR0=1;
TR1=1;
}
void DisPicture(int No) //显示图片
{
Txbyte(0xaa);
Txbyte(0x70);
Txbyte(No);
TxEOF();
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delayms(void);
uchar kbscan(void);
void Txbyte(unsigned char i);
void Txword(int i);
void TxEOF();
void InitForUART();
void DisPicture(int No);
main()
{ uchar key;
InitForUART();
while(1)
{
key=kbscan();
if(key!=0)
{
switch(key)
{
case 0x21:DisPicture(0x00);
break;
case 0x22:DisPicture(0x01);
break;
case 0x24:DisPicture(0x02);
break;
case 0x11:DisPicture(0x03);
break;
case 0x12:DisPicture(0x04);
break;
case 0x14:P0=0x80;
P2=0xF0;
break;
case 0x09:P0=0xB0;
P2=0xF0;
break;
case 0x0A:P0=0x82;
P2=0xF0;
break;
case 0x0C:P0=0x90;
P2=0xF0;
break;
/*case 0x44:P0=0xF8;
P1=0xf7;
break;
case 0x42:P0=0x83;
P1=0xf7;
break;
case 0x41:P0=0x8E;
P1=0xf7;
break;
case 0x88:P0=0x99;
P1=0xf7;
break;
case 0x84:P0=0x80;
P1=0xf7;
break;
case 0x82:P0=0xC6;
P1=0xf7;
break;
case 0x81:P0=0xc0;
P1=0xf7;
break;*/
default:P2=0xff;
}
}
}
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P1=0x07; //发0扫描,列线输入
if ((P1 & 0x07) != 0x07) //有键按下
{
delayms(); //延时去抖动
if ((P1&0x07)!= 0x07)
{
sccode = 0xF7; //逐行扫描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x07)!=0x07)
{
recode=(P1&0x07)|0xf8;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}
void delayms(void)
{
unsigned char k,y;
for (k=200; k>0; k--)
for (y=50;y>0;y--);
}
void Txbyte(unsigned char i) //发送字节
{TI=0;
SBUF=i;
while(!TI);
TI=0;
}
void Txword(int i) //发送字
{unsigned char x,y;
x=(i/256);
Txbyte(x);
y=i-256*x;
Txbyte(y);
}
void TxEOF() //帧尾
{Txbyte(0xcc);
Txbyte(0x33);
Txbyte(0xc3);
Txbyte(0x3c);
}
void InitForUART() //串口初始化
{
TMOD=0x21;
SCON=0x50;
TH0=0x4c;
TL0=0x00;
TH1=0xf3;
TL1=0xf3;
EA=1;
ET0=1;
TR0=1;
TR1=1;
}
void DisPicture(int No) //显示图片
{
Txbyte(0xaa);
Txbyte(0x70);
Txbyte(No);
TxEOF();
}
展开全部
很简单,几句话而已,不过今天太晚了,明天在写给你吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
修改都不会,那怎么写啊。
晚上 我来修改试一下。
晚上 我来修改试一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这太简单了,还是你自己学一点东西吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询