嵌入式单片机STC按键导航按左键加1,按右键减1

作者&投稿:真弦 (若有异议请与网页底部的电邮联系)
求一个单片机程序:三个按键,一个启动设置,一个加,一个减。~

#include

#define uchar unsigned char
#define uint unsigned int

sbit aj1=P3^4;
sbit aj2=P3^5;
sbit aj3=P3^6;
sbit aj4=P3^7;

sbit dula=P2^6;
sbit wela=P2^7;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00};

void delay(uint z);
void init();
void shumaguan(uchar shu);
void anjian();
uchar aa,shu;

void main()
{
init();
while(1)
{
anjian();
shumaguan(shu);

}
}

void init()
{
shu=0;
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
//TR0=1;

}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dingshiqi0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
aa++;
if(aa==20)
{
aa=0;
shu++;
if(shu==60)
shu=0;
}
}
void shumaguan(uchar shu)
{
uchar shi,ge;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);

dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);

shi=shu/10;
ge=shu%10;
}

void anjian()
{
if(aj1==0)
{
delay(10);
if(aj1==0)
{
shu++;
if(shu==60)
shu=0;
while(!aj1)
shumaguan(shu);
while(!aj1);
}
}
if(aj2==0)
{
delay(10);
if(aj2==0)
{
if(shu==0)
shu=60;
shu--;
while(!aj2)
shumaguan(shu);
while(!aj2);
}
}
if(aj3==0)
{
delay(10);
if(aj3==0)
{
shu=0;
while(!aj3)
shumaguan(shu);
while(!aj3);
}
}
if(aj4==0)
{
delay(10);

if(aj4==0)
{
TR0=~TR0;

while(!aj4)
shumaguan(shu);
while(!aj4);
}
}

}

这是我以前写得4个按键的 要不用不上 你就把aj3去掉那个是清零的 你这问题补充的 先前怎么不一起加上 不知道你的IO口的定义 你这样吧 你把液晶的 地址 数据 设置好 然后用定时器 控制1秒++;在按键里面 和你要显示的液晶的 指令和数据 分解加上 就可以了

P3=0xfe; //P3=0b1111 1110,令P3.0=0,同时令高四位为高电平,作好读端口准备(51IO特点)
temp=P3; //读回P3口的状态
temp=temp&0xf0; //temp&1111 0000,0与任何数结果为0,把temp变量的低四位屏蔽了,高四位因为任何数与1等于它本身,所以把高四位对应的端口状态读进来。
while(temp!=0xf0) //上步处理后,高四为不全为1,说明有按键按下(结合矩阵键盘的电路结构才能理解,这里不方便上图)
{
delay(5);
temp=P3;
temp=temp&0xf0;//这三句跟上面重复,功能是软件消抖
while(temp!=0xf0) //延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。
{
temp=P3;
switch(temp).....

我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//两个按键IO口定义
sbit KEY1=P1^4;
sbit KEY2=P1^5;

//数码管真值表0~9
uchar code LedTab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar sec=0; //显示数值

//延时函数
void Delay(uint t)
{
for(;t>0;t--); //5us  1ms/5us = 200
}


//数码管刷新函数
void Reflesh_SegLed()
{
P2=0xFE;
P0=LedTab[sec];
}
//按键扫描函数
uchar keyscan()
{
static bit up_1=1,up_2=1;
if(KEY1)
    up_1=1;
if(KEY2)
    up_2=1;

if(!KEY1&&up_1)  //检测第一个按键
{
Delay(1000); //消抖
if(!KEY1)
{
        up_1=0;
return 1;;
}
}

if(!KEY2&&up_2) //检测第二个按键
{
Delay(1000); //消抖
if(!KEY2)
{
        up_2=0;
return 2;
}
}

return 0;
}

void main()
{
        uchar key;
while(1)
{
Reflesh_SegLed();
key = keyscan();
if(key==1) //加1
{
sec++;  
if(sec>=10)sec=0;
}
else if(key==2) //减1
{
if(sec==0)
sec=9;
else 
sec--;
}
}
}



stc单片机编程,按钮按一下,指示灯亮5秒熄灭
哎,只学过C,表示无能为力,不过也不难设计呀,会基本的按键识别就好了

单片机芯片STC和At的区别
1:下载载方式不同,AT中的S51S52系列的下载方式是ISP下载方式,而C51C52与STC都是串口下载方式 2、内存大小有所不同 3、部分特殊功能寄存器不同 4、STC的单片机相对地执行速度更快,功能更加强大 单片机资料学习可以到吴鉴鹰吧获取,电子资料很多 ...

单片机AT和STC区别
几乎都一样的,AT的资料都是英文的,中文的不全。STC有的功能AT的全有,AT没有的,STC的还有,价格又便宜,所以显示市场很大啊,其实就是一山寨货。但是做的还是比较可以

stc单片机在使用上和at系列的电路上有区别吗?
复位电路常用的有两种,一种是上电自动复位电路,一种是按键手动复位电路。一般是用上电自动复位电路,有时考虑方便复位才两种一起用。STC单片机是通过上电复位时会先运行引导码,检测串口是否有下载电信号,有就进行ISP下载程序,这种下载方式也就称为冷启动。若你单片机是在运行的,是接收不到下载电信...

stc单片机 输入 输出都在一个脚?有点不明白,谁能解释下
一般单片机输入输出也就是I\/O口都是在一个脚上的 ,主要是靠程序设置为输入还是输出。

stc单片机编程按钮1按一下led1亮5秒后熄灭,按钮2按一下led2亮5秒后熄 ...
include<reg51.h>#define uchar unsigned charuchar cnt1,cnt2;sbit led1=P1^0;sbit led2=P1^1;void ext0() interrupt 0{cnt1=0led1=0;}void ext1() interrupt 2{cnt2=0;led2=0;}void t0isr() interrupt 1{TH0=(65536-50000)\/256;TL0=(65536-50000)%256;cnt1++;cnt2++;if(cnt...

stc15单片机和51关于模式0的区别
区别3:IO口模式。为了满足不同应用场景的需求,STC51单片机设计了四种IO口模式:准双向IO口模式、推挽输出模式、高阻输入模式和开漏输出模式。这些模式提供了更灵活的IO口使用方式。区别4:兼容性与特性增强。不同单片机厂商生产的51系列单片机,如ATMEL的89C51(已停产)、89S51,PHILIPS,STMicroelectronics...

STC单片机 ADC按键 求助!!
取那么多、那么长时间的平均值干什么?连续取 20 次,其中有10 次,按的是这个键,有10 次,按的是那个键,平均一下,判定结果:是按下了一个根本就没有按的键。=== include<reg52.h> include<intrins.h> unsigned char code k_AD[] = { 10, 40, 70, 100, 130, 160, 190, 210,...

STC单片机程序帮忙看下能说详细点吗
1、这个程序应该不能满足你所需要的功能。因为你这段程序并不能判断出按键就竟按了几下。而只能得到按键被按下的结果。2、如果你的意思是手按下按键,然后手松开了,这个过程算按一次键的话。这段程序就不能用。如果你是设定的15ms以内按键有被按下算按键一次的话,这段程序就没有错。3、一般...

AT单片机和STC单片机区别只是复位电路上的区别吗?烧写程序上有区别吗...
对于同种型号的单片机(例如51)两种公司的单片机在接口上基本是一样的,即接口功能一致,的两芯片内部会由于公司设计有些许的差别,比如stc51单片机内部集成了看门狗电路等等。还有就是关于编程烧写问题,stc使用串口对单片机进行烧写的,只需使用232接口芯片便可以直接烧写,较为方便。而at是利用并口进行烧写...

福州市18026602694: 嵌入式单片机STC按键导航按左键加1,按右键减1 -
红狠结核: #include <reg52.h>#define uchar unsigned char#define uint unsigned int//两个按键IO口定义sbit KEY1=P1^4;sbit KEY2=P1^5;//数码管真值表0~9 uchar code LedTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar sec=0; //显示数...

福州市18026602694: 介绍单片机上的几种按键输入实现方法 -
红狠结核: 第一种:直接法: 将按键直接串联电阻后与电源相连,当按键后,检测按键所对应的输入口的状态为1为0,则可检测按键是否按下 第二种:矩阵:行列均接电源电阻,并与单片机相连,先给高四位一个高电瓶,检测某一列按下键,在给第四位一个高电瓶,检测哪一行按下,由此可得到哪个键按下

福州市18026602694: 一个按键控制51单片机的16路输出,按一个键左移或者右移一次. -
红狠结核: int a=0x5555; int b; b=a; P0=a&0x00ff; P1=(a>>4)&0x00ff; if(按键按下) {b>>1;a=b; P0=a&0x00ff; P1=(a>>4)&0x00ff;}

福州市18026602694: 单片机,程序功能:利用2个按键来控制2位数的加或减. -
红狠结核: 这个很简单啊,看你选择什么单片机. 选个主芯片,外围需要led数码管,和按键. 数码管按照其接口连接,按揭直接使用GPIO. 定时器20ms对键盘扫描,根据按键处理显示数据.

福州市18026602694: 求一个stc89c51单片机的程序框架,功能如下 -
红狠结核: 自动模式那两个加/减键不起作用吧?否则叫什么自动呢?定义一个变量,按模式选择按键后,变量加1,并判断>2,回1,即变量只有1,2两个数.变量为1,对应自动模式,2对应手动模式.那两个加/减按键,按下时判断,变量为2,即向手动模式起作用.或在变量为2时加/减按键才有效.

福州市18026602694: 如何用单片机判断按键是单击还是双击? -
红狠结核: 假设有键按下时 key = 0 .if(key == 0) { //发现按下按键 Delay(10) //延时约10ms if(key == 0) { //确认第一次按下 while(!key); //等待释放//-------------------以上是常规的按键判别步骤 Delay(100) //多延时一会,约100ms if(key == 0) {//确认第二次按下 //执行双击程序 } else { //执行单击程序 } } }

福州市18026602694: 汇编的问题,单片机的.我要添加一个按键+1的子程序. 一个按键输入的子程序,应该放在哪里好. -
红狠结核: MAIN: ;主程序 LCALL AJZCX ;调用按键子程序AJZCX: JB PX.X , AJZCX2 ; 定义键的 IOACALL DELAY ; 延时2 mS 左右子程序JB PX.X , AJZCX2JB AJBZ, AJZCX1 ; 定义一个标志SETB AJBZinc MIAO AJZCX1: RET AJZCX2: CLR AJBZRET

福州市18026602694: 如何使用STC单片机按键设置延时 -
红狠结核: 这个就很简单了,可以用定时器来做.定时时间50毫秒,用一个变量如Count来计50毫秒的个数,再用一个全局变量来计设定的时间如SetTime.当按键按下时,改变SetTime的值,比较的时候注意把这个值换算成和Count一样的单位,比较一下就可以了

福州市18026602694: 如何用单片机判断按键单击双击?
红狠结核: 假设key==0有键if(key==0) 第一次按下按键{ while(!key);第一次松开按键 while(i &amp;&amp; key) i 的大小就是延时长短 { i- -; } if(i==0)表示没有第二次按键 if(i != 0 )表示按下了第二次}防抖那些 就自己加了吧

福州市18026602694: 单片机汇编按键程序 -
红狠结核: loop:jnb key1,tokey1 jnb key2,tokey2 jnb key3,tokey3 jnb key4,tokey4...ljmp loop tokey1:lcall d10ms ;按键去抖动 jb key1,loop lcall display ;数码管扫描程序 ajmp loop

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网