51单片机,怎么用矩阵键盘中的两个按键控制外部中断0和1,在按按键的时候
当P3.2口拉低时,中断程序肯定会优先响应,所以进入中断后马上判断是否矩阵键盘动作(先向矩阵键盘的I/O口全部写1,再读P3.2口),若是矩阵键盘动作,则 return; 退出中断,否则执行中断程序;注意外部中断要选下降沿触发,否则中断会一直响应。同样矩阵键盘程序也要注意P3.2口单独为0时不作处理,避免外部中断造成键盘混乱。当然这样的程序肯定会有BUG ,就是几率大小的问题。
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P1^0;
sbit key2=P1^1;
uchar num=0;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void main(void )//主程序
{
while(1)
{
if(key1==0)//判断按键1是否按下
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key1==0);
num++;
if(num==10)num=0;//等待按键抬起
}
}
if(key2==0)//判断按键2是否按下
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);
num--;
if(num==00)num=9;//等待按键抬起
}
}
P0=table[num];
}
}
让P3.7始终为0,然后就是按S4触发外部中断0,按S8触发外部中断1
怎么用单片机编程设计一个占空比为5:1的矩形脉冲,晶振为6MHz_百度知...
很简单 1设中断时间如:5ms中断一次 2中断一次之后设置一个变量加1如:aa++;3 aa=1时置低电平然后aa=6时置高电平同时aa复位回0重新计数 参考程序 void Timer0 () interrupt 1 { TH0=0xF6;\/\/ TL0=0x3c;\/\/这样刚好是6mhz的5ms aa++;if(aa==1){P0_1=0;} if(aa==6){P0_1=0;...
如何运用单片机原理制作智能信号发生器,要求产生方波、矩形波、三角波...
include<reg51.h> include<absacc.h> include<MAX72191.h> defineDAC XBYTE[0x7fff] \/\/P2.7接CS sbitkey0 = P3^2;\/\/ 增减切换键 sbitkey1 = P3^3;\/\/个位,十位,百位,千位的控制切换 sbitkey2 = P3^4;\/\/ 调整位 sbitkey3 = P3^5;\/\/ 波形选择正弦、三角、矩形波,锯齿波 unsigne...
51单片机运行程序,矩阵键盘和外部中断同时用到P3.2这个IO口该怎么解决...
当P3.2口拉低时,中断程序肯定会优先响应,所以进入中断后马上判断是否矩阵键盘动作(先向矩阵键盘的I\/O口全部写1,再读P3.2口),若是矩阵键盘动作,则 return; 退出中断,否则执行中断程序;注意外部中断要选下降沿触发,否则中断会一直响应。同样矩阵键盘程序也要注意P3.2口单独为0时不作处理,...
怎么用单片机采集流速 转速转矩传感器的数据 然后放着类似LabVIEW软件上...
如果成本预算不高的话你可以用一个USB采集卡或者485总线采集模块以太网采集模块之类的产品直接采集啊,labvIEW这块的软件都有提供的,你直接用就行了。水流流速传感器一般输出的是频率信号或者是4-20mA,0-5V的电压信号,转速传感器非接触型的霍尔元件也是有输出频率信号的,基本上你这边很大一批是采集频率...
用单片机设计一个矩阵键盘电路
尼玛,刚做好。sbit scan_H0=P0^0;sbit scan_H1=P0^2;sbit scan_H2=P0^1;sbit scan_L0=P0^3;sbit scan_L1=P5^4;sbit scan_L2=P5^5;uchar Keycan() \/\/按键扫描程序 { unsigned char rcode, ccode ;unsigned char which_key = 0;write_scan_define(0x70); \/\/ 发全0行扫描码...
使用51单片机实现:由键盘输入自己的学号,在数码管或LCD显示结果._百度...
用矩阵键盘的前十个建,每一个按键代表0-9,将按下的数给一个数组,数组大小根据学好长度定,然后送到1602显示。
怎样用3*4矩阵键盘,改变51单片机程序里的数据?
\/\/考虑易读,使用3个标志 char flag=0;\/\/修改状态=1 char f_change=0;\/\/日期修改标志=1,时间修改标志=2,var修改标志=3 char num_on=0;\/\/数字键盘 \/\/按键:\/\/11=修改, 10=退出修改 \/\/1=date,2=time,3=var为多功能键,必须使用num_on来切换 \/\/按键还需有个keydown()判断键是否按下 \/...
单片机用3*3矩阵键盘显示数字0~9
define uint unsigned int define uchar unsigned char \/\/宏定义,方便使用 uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; \/\/数码管显示编码 uchar num,temp,num1; \/\/全局变量定义 \/***延时子函数***\/void delay(uint z){ uint x,y;for(x...
单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示1...
unsigned long sum=0;unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};void scan();void disp_led(unsigned long int dat);void delay(unsigned int dly);void main(){for(k=0;k<=7;k++){SBUF=str[10];while(TI==0);TI=0;} while(1...
用C51单片机和内部定时器来产生矩形波,要求频率为100HZ,占空比为2:1...
100HZ的矩形波,周期就是10ms,占空比2:1,就是高的部分占10ms的2\/3,低的部分占10ms的1\/3。理解了吗?
潭妻欣妥: 让 P3.7 始终为 0,然后就是按 S12 触发外部中断 0,按 S16 触发外部中断 1.
德庆县17269837428: 51单片机4*4矩阵键盘如何同时实现单击+双击的功能? - ?
潭妻欣妥: 一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击.何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击.那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零.这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键.
德庆县17269837428: 单片机的矩阵按键怎么输入两位数 - ?
潭妻欣妥: 输入两次即可,假设keyscan()是带返回值的按键扫描函数 i=0; While(i<2) { m=keyscan(); if (m<10) { A[i]=keyscan(); i++; } } 再将输入的两个数合成一个数即可 value=A[1]*10十A[0];同样可以获得3位数输入和更多位输入
德庆县17269837428: 51单片机矩阵多个按键同时按下如何写程序 - ?
潭妻欣妥: 用数组啊,如果是指定位数的就比较简单 当第一次输入时i=0,第一个数6放a[0],i=1,第二个数7放a[1],显示就是 OUT= a[0] * 10 + a[1] * 1 数组用之前初始化为0,a[2] = {0} //这个好用点,递推 if(key_data)//有按键按下 {for(i = key_count ;i>0;i--;){a[i+1] = a[i];}a[0] = key_data;key_count ++;} //显示调用,根据你的输入最大数定数组的位数Sprint = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0] * 1 ;
德庆县17269837428: 51单片机怎么用矩阵键盘让数码管加一减一,就是每两个键盘控制一个数 - ?
潭妻欣妥: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit key1=P1^0; sbit key2=P1^1; uchar num=0; //共阴数码管七段码 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77}; void Delay1ms(uint i) //1...
德庆县17269837428: 单片机矩阵键盘如何实现一键多用 - ?
潭妻欣妥: 可以加个定时器实现你说的功能,首先把矩阵键盘扫描编写成一个独立的函数,比如char keyread(void)(无键按下返回0,否则返回该键的数值) 然后把定时器设置为定时1s(根据你需要按得次数确定时间),主程序直接调用keycan(),当检测到返回值不为0时启动定时器,然后进入while死循环扫描按键,在定时器未到1s前,再次检测到返回该值则标记加1,当定时器到时间时读取标记的值进入按键处理程序,并把标记清零
德庆县17269837428: C 51单片机 矩阵按键 - ?
潭妻欣妥: 首先记住,你的是矩阵键盘,就是说一个按键A的一端接单片机的一个脚(假设P00),另一个也接一个脚(假设P07), GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛
德庆县17269837428: 单片机的矩阵按键怎么输入两位数,例如,先输入2,数码管显示2,再输入3,数码管显示23,有类似程序更好 - ?
潭妻欣妥: 我的思路是,把你输入的数字先保存在一个数组里,然后实时的显示该数组的内容即可.#define MAX_NUM 2 uchar num_pos = 0;//输入数字的个数计数.char num_buff[MAX_NUM] = {-1,-1}; void DisplayNum() { for(i = 0; i < num_pos; i++) { //...
德庆县17269837428: 用51单片机,怎么让数码管显示一串矩阵键盘按下的键代表的数(0~f)? - ?
潭妻欣妥: 这种显示方式就和手机拨号时,按下号码的显示是一样,第一个数码先在右边显示,再按键,依此向左移动显示.要是6位数码管,就保留6位显示了,按键超过6位时,先按的自然丢掉了.
德庆县17269837428: 51单片机 如何4*4矩阵键盘输入按键 继电器输出信号 - ?
潭妻欣妥: ........... Inter0_process() interrupt 2 //外部中断1 { Key_scan();//你的键盘扫描程序(中断服务程序),一旦触发中断,将运行至本段. } //主程序main() {........... ........... ........... EX1=1; //开中断一 P3.3 IT1=1; //下降沿触发 ET1=1; EA=1;........... ...........} 注:图中的键盘接法都是独立按键接发,矩阵键盘没有见过能直接触发中断的.