山西国美_C51单片机按键编程思路

C51单片机按键编程思路


建议用RTOS,用一个优先级高一点的任务扫描按键,然后保存到按键缓冲区;显示菜单的部分可以用优先级低一些任务,处理按键及汉字显示之类的工作。用什么屏?说的不怎么详细。。。菜单需要显示么?
初学单片机,编程不太熟悉,51单片机根据开关状态输出高低电平,有逻辑判断,请教编程思路,用C语言!
用CASE来选择处程就可以啦。
【如P1.4-P1.7任意2个或者以上按键按下(低电平),P2.5=0P2.6=0P2.7=0】
程序循环最加上,任意2个或者以上按键,,P2.5=0 P2.6=0 P2.7=0
void main()
{
int k;
while(1)
{
k=0
while(!p14)
{p10=0;P2=0x7f;k=k+1;}
while(!p15)
{p11=0;P2=0xbf;k=k+1;}
while(!p16)
{p12=0;P2=0x3f;k=k+1;}
while(!p17)
{p13=0;P2=0x1f;k=k+1;}
{if (k>1);P2=0x1f;}
}
}编程思路:每次都是P1口的值读取进来,再低4位,仅对高4位进行判断
{
#define INPUTMASK 0xF0
char ReadPort= 0;
ReadPort = P1 & INPUTMASK;
switch(ReadPort)
{
case 0xf0: break;/* 没有按键按下,跳出 */
case 0x10: Subfunction1();break;/* P1.4按下,到子函数1 */
case 0x20: Subfunction2();break;/* P1.5按下,跳转到子函数2 */
case 0x40: Subfunction3();break;/* P1.6按下,跳转到子函数3 */
case 0x80: Subfunction4();braak;/* P1.7按下,跳转到子函数4 */
default:
Subfunction5();braak;/* 任意2个或以上按键按下,跳转到子函数5 */
}
}
在switch case函数中采用模块块编程,这里的子函数,即在相应的按键状态下其它端口的状态实现,不再赘述。从你给的逻辑上看不出要求判断两个按键同时按下时有什么要求。
看样子各部分独立存在,不相影响。
请高手推荐一本介绍单片机编程方法和思想的书。
21IC版主写的书,《程序匠人》是他编程经验和思路的总结。北京航空航天大 周航书不错,《 单片机应用程序技术》 百度文库上应该到 。
该书介绍了单片机基本的、常用的编程思路与方法。个人认为,估计没有哪一本书能具体而深入、大而全地介绍单片机编程方法。您如果已很好地掌握了基本的编程方法,又想在嵌入式系统理论上更进一层,除了在项目中积累经验和对目标芯片、编程语言、编译环境、好的项目例程不断学习与应用之外,估计要有选择有重点地重新学习一些本科以上的教程了。像本科生的《信号与系统》、《数值计算方法》就对数字信号处理蛮适用的;像《过程控制理论》对过程控制蛮适用的;像一些电力方面的书,《电力系统继电保护原理》对继电保护产品研发蛮适用的....天祥电子的 51单片机,你上网搜下
求单片机高手编写程序,主程序设计思路: 程序开始后,先读入 P0.7的值,并以此来选择输出脉冲的波形: P
1、确DAC刷新周期T,如20uS输出,或增加按键控制T的大小;
2、随机数据通过rand()(需包含 stdlib.h 库函数)获得随机数;
3、通过设定定时器T0,来实现DAC的刷新。定时器T1用于计时。
4、通过改变定时装载初值,来改变刷新周期。
5、硬件上,设计好DAC接口电路。
以下是部分代码,尚需补充和完善:
#include
sbit Mode=P0^7;//记得上拉10k电阻。拨动开关。
bit OutMode;
unsigned char Cycle=256-20;
unsigned int mS;
unsigned char Amp;
unsigned char SquartAmp=0x80;
main()
{
TH0=Cycle;TH1=(-1000)>>8;TL1=(-1000)&0xff;TMOD=0x12;
TR1=1;ET1=1;EA=1;
OutMode=Mode;
mS=0;while(mS<4000);
TR0=1;ET0=1;EA=1;
mS=0;while(mS<4000);
while(1);
}
void ISRT0(void) interrupt 0
{
static unsigned char i;
TH0=Cycle;
i++;
if(OutMode==0){if(i%2) Amp=0;else Amp=SquartAmp;}
else{ Amp=rand();}
WriteDAC(Amp);
}
void ISRT1(void) interrupt 2
{
TH1=(-1000)>>8;TL1=(-1000)&0xff;
mS++;
}

上一篇: 下一篇:

相关文章