-
你能说得更具体一点吗,我以前用的C51程序还没保存,现在是MSP430,你要吗?
-
请添加详细说明:
每个引脚的外围都布置好了,四个LED显示屏都连接到该端口,无论是共阴极还是共阳极连接2键盘连接到该端口。
3.每个相应键的含义。
-
它。。。。。。太乱了吧? 你能理清这整堆逻辑,我真的很佩服你。 你按住它,短按立刻生效,长按等于无。
既然用了定时器,就不要耽搁了,那个东西只出现在教科书上,很少在实际应用中使用。 使用定时器,设置一个基准时间,如200us一个中断,然后设置一个10ms的按钮扫描时间,即50个中断,并使用两个连续的按钮扫描低电平来判断按钮的有效性,延迟可以是88,教条主义要人命。 按钮生效后,我会立即“计算中断”,对吧?
按下加按钮,松开清除0,下次重新计数,2秒就是20000次中断,表示长按有效,不统计这个数字短按有效,这样就可以单独处理了,就这么简单,不要一直拿着计时器开机关。 理清思路,不要说长按短按,连双击都可以。
-
因为初始值没有分配给中间和后面,所以它从第一毫秒到毫秒变化,相应地,关键时间也发生了变化。
-
1:键值记录。
2:时间记录。
3:是同一个键吗?
以上三个条件组合在一起,一个条件使用一个变量。
-
每个按钮设置一个状态标志,当标志为 1 时函数是什么,当函数为 2 时函数是什么,依此类推。
-
定时器可在按下第一按时启动,然后记录1s以内的按键次数,并可对各种情况进行编码,实现不同的功能。
-
它是一个状态机,它在什么状态下使用什么。
双击实际上是一种繁琐且难以调试的方法。
使用它的简单方法是查看在什么接口(状态)中表示什么函数。
-
你可以添加一个定时器来实现你说的功能,先把矩阵键盘扫描写成一个独立的函数,比如char keyread(void)(没有按键返回0,否则返回键的值),然后设置定时器到1s(根据你需要按的次数来确定时间), 主程序直接调用keycan(),当检测到返回值不为0时,启动定时器,然后进入while无限循环扫描密钥,在定时器达到1s之前,如果再次检测到该值,则将标记加到1,当定时器到达定时器时,将标记的值读入密钥处理程序中,将标记清除为零。
-
检查您要按下该键的时间长度以确定该键的功能。
-
网上有很多这样的例子,所以我给你一个参考。
while(1)
if(!key2)}}
-
矩阵键盘。
#include
#include
unsigned char code table = ;公阳数码管显示 0 f
void delay() delay 子例程。
void display(unsigned char s) 显示子例程。
unsigned char keycan(void) keyscanner for line lines for column lines.
while((p1&0xf0) != 0xf0);等待密钥被释放。
return ((rcode) +ccode));返回密钥编码。
elsercode = (rcode<<1)|0x01;线扫描代码向左移动一位}}
return 0;如果按下时没有键,则返回值为 0
void keydispaly(unsigned char key)
int main(void)
return 0;}
-
uchar code act[4]=;
char scan_key(void)}}
if(find==0)return-1;返回值为-1,返回1为正常返回,返回-1为异常返回程序只是程序编写的标准,即没有键。
return(ini*4+inj);i 是上四位数字的判断,j 是后四位数字的判断。
0 1 2 3 为零 0,1,2,3 如果开关 0 打开,则 p4 为 0,即 1110 1110
4 5 6 7 向右移动补 1,得到 1111 1110,j 为 0
8 9 A b 开关 1 打开 p5 为 0,即 1101 1110,右移 1111 1101
c d e f 可以判断 j 为 1,也可以推断出 1 一样。
p4 5 6 7
按照这个想法,4个端口只能实现4个开关4*4=16,2*2=4必须改变思维方式,如果是因为端口太紧,可以使用P3端口,或者使用分压读取AD判断按钮(AD键盘)。
-
发一张键盘部分的截图,蚊子描述不容易理解。
键盘程序与硬件链接有很大关系。
-
哪些系列的MCU有P4端口?
-
只有30分钟,我想找人教你。
-
主要存在两个问题:
1. “chuli”命令只能执行一次。
原因:也就是说,程序上电复位后,执行到零循环,然后一直在这里循环,无法执行chuli;
已解决:全部跳转到数字(例如零、一、..九)跳到楚里;确保中断后可以执行chuli;
2、中断时扩散表指针的r1增量模式错误。
虽然你的程序中还没有感觉到这个错误,但它是存在的,这个错误还有两点:
一是 r1 的初始值为 0,所以无论怎么移位,r1 永远是 0;
第二,你不应该在这里使用移位(我猜你的意图应该是从零到一、..九,否则只能执行几个跳转,如一、二、四、八等),并且应该使用 add 指令,每次加 2 个字节(好久没编程了,我忘了 ajmp+ 地址有多少字节,反正有几个字节加几个字节)。
试试吧,应该没什么大问题!
另外,即使这个程序修改后可以执行,也尽量不要这样写。 你的写作接近于使用操作系统的多任务编程方法,但操作系统不支持,所以看起来很奇怪,可读性很差,可以参考 Keil C51 中 Tiny OS 的原理来重写。 如果你觉得太难了,你可以使用常规方法而不是无限循环,例如:
对于每个输出(零,一、..9)写一个子例程,在你的分散中做一个子例程调用,但记得在调用后跳出来。
方法有很多,想想看,不要“先试查询方法,打断方式”一定要知道为什么不行,祝你好运!