标题: 萌新51单片机程序调试求助!涉及矩阵键盘方面 [打印本页]
作者: 啊_奶瓶 时间: 2020-12-29 22:27
标题: 萌新51单片机程序调试求助!涉及矩阵键盘方面
刚刚写代码的时候发现我写的代码有问题。
我写了两篇代码,分别关于用数码管做计时器从1至1000和用矩阵键盘在数码管显示1到F的。
要求如下
下面是我写的代码,我发现主函数那段,定时器的代码和矩阵按键的代码不能同时运行(按键在数码管显示的数字只有在按键按下时才显示,松手不显示,不满足要求),但是当我把他们两个代码分别运行的时候,所得到的现象是满足预期的,为什么当我把这两个代码合在一起时不能满足预期?是哪个地方错了,求大佬们告诉我
作者: 啊_奶瓶 时间: 2020-12-29 22:27
这是代码在附件里这是要求
原理图也在附件里了
麻烦大佬们看看我的错误在哪
谢谢了
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint num;
void delayms(uint);
int apple,pear,a;
void knowledge(int,int,int);
uchar num1,ge,shi,bai,qian;
void display(uchar,uchar,uchar,uchar);
void display(uchar ge,uchar shi,ucharbai,uchar qian) //计时器部分
{
dula=1;
P0=table[qian];
dula=0;
P0=0xff;
wela=1;
P0=0XFE;
wela=0;
delayms(5);
dula=1;
P0=table[bai];
dula=0;
P0=0XFd;
wela=1;
P0=0XFd;
wela=0;
delayms(5);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0XFb;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0XF7;
wela=0;
delayms(5);
}
void delayms(uint times)
{
uinti,j;
for(i=0;i<60;i++)
for(j=0;j>times;j++);
}
void T1_time() interrupt 1
{
TH0=(65536-18432)/256;
TL0=(65536-18432)%256;
num1++;
if(num1==50)
{
num1=0;
num++;
if(num ==1000)
TR0=0;
qian= num/1000%10;
bai=num/100%10;
shi= num/10%10;
ge=num%10;
}
}
void knowledge(int apple,pear,a) //矩阵按键部分
{
P3= 0xf0;
apple = P3&0xf0;
if(apple!=0xf0)
{
P3 = 0xf0;
apple = P3&0xf0;
delayms(10);
if(apple!=0xf0)
{
P3= 0xf0;
apple = P3&0xf0;
switch(apple)
{
case(0xe0):pear ==0;break;
case(0xd0):pear= 1;break;
case(0xb0):pear= 2;break;
case(0x70):pear= 3;break;
}
P3 = 0x0f;
apple =P3;
switch(apple)
{
case(0x0e):pear =pear;break;
case(0x0d):pear=pear+4;break;
case(0x0b):pear=pear+8;break;
case(0x07):pear=pear+12;break;
}
delayms(50);
dula=1;
P0=table[pear];
dula=0;
P0=0xff;
wela=1;
P0=0X7f;
wela=0;
delayms(5);
P0=0xff;
}
}
}
void main()
{
TMOD=0X01;
ET0=1;
TR0=1;
TH0=(65536-18432)/256;
TL0=(65536-18432)%256;
EA=1;
dula= 0;
while(1)
{
knowledge(apple,pear,a);
display(ge,shi, bai, qian);
}
}
...
-
-
BST-V51原理图 v3.0.pdf
70.84 KB, 下载次数: 7
作者: cheney03 时间: 2020-12-30 21:35
因为你定时器中断打开后,时间还没到就进入while(1)循环了。在中断服务函数中加个标志位flag=1,然后在while(1)循环中对标志位加以判断并清0,响应中断。
作者: wulin 时间: 2020-12-31 06:47
楼主显示方式不当,给你改为有键操作显示键值,无键操作2秒自动恢复显示时间。
- #include "reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- 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};
- uchar num;//中断计数变量
- uchar sec,min;//秒、分变量
- uint count;//计数变量
- uchar keyValue;//键值变量
- void delayms(uint);//延时
- void keyscan();//按键扫描
- void display();//数码管显示
- void display() //数码管动态显示
- {
- static uchar i=0;//动态扫描计数变量
- uchar buf[4];//显示内容缓存数组
- if(count==0)
- {
- buf[0]=table[min/10];//显示十分
- buf[1]=table[min%10]|0x80;//显示分加小数点
- buf[2]=table[sec/10];//显示十秒
- buf[3]=table[sec%10];//显示秒
- }
- else
- {
- buf[0]=0;//不显示
- buf[1]=0;//不显示
- buf[2]=0;//不显示
- buf[3]=table[keyValue];//显示键值
- }
- P0=0x00;//消隐
- dula=1;//锁存
- dula=0;
- P0=~(0x01<<i);//送位码
- wela=1;//锁存
- wela=0;
- P0=buf[i];//送段码
- dula=1;//锁存
- dula=0;
- i++;
- i%=4;
- }
- void delayms(uint times)
- {
- uint i,j;
- for(i=0;i<60;i++)
- for(j=0;j>times;j++);
- }
- void keyscan() //矩阵按键部分
- {
- static bit time=0;
- P3=0xf0;
- if(P3!=0xf0)
- {
- delayms(10);
- if(P3!=0xf0&&time==0)
- {
- time=1;
- count=250;//预置5秒切换
- switch(P3)
- {
- case(0xe0):keyValue=0;break;
- case(0xd0):keyValue=1;break;
- case(0xb0):keyValue=2;break;
- case(0x70):keyValue=3;break;
- }
- P3=0x0f;
- switch(P3)
- {
- case(0x0e):keyValue=keyValue;break;
- case(0x0d):keyValue=keyValue+4;break;
- case(0x0b):keyValue=keyValue+8;break;
- case(0x07):keyValue=keyValue+12;break;
- }
- }
- }
- else time=0;
- }
- void main()
- {
- TMOD=0X01;
- TH0=(65536-18432)/256;//20ms
- TL0=(65536-18432)%256;
- TR0=1;
- ET0=1;
- EA=1;
- while(1)
- {
- keyscan();
- display();
- }
- }
-
- void T1_time() interrupt 1
- {
- TH0=(65536-18432)/256;
- TL0=(65536-18432)%256;
- num++;
- if(num>=50)//秒
- {
- num=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- min=0;
- }
- }
- if(count>0)
- count--;
- }
复制代码
作者: 人人学会单片机 时间: 2020-12-31 10:40
#include "all.h"
u8 xdata Key4x4_Read_Byte=3;//矩阵结果输出变量
u8 code Key4x4_Buffer[4]={0xfe,0xfd,0xfb,0xf7};
void Key4x4_Scan_Drive()
{
static xdata u16 count=0;
u8 i,j,Value;
count++;
if(count>1000)
{
count=0;
IE2&=~0x08;
for(i=0;i<4;i++)
{
P0=Key4x4_Buffer[i];
Value=0x80;
for(j=0;j<4;j++)
{
if((P0&Value)==0)
{
Key4x4_Read_Byte=j*4+i+1;
}
Value>>=1;
}
}
P0=0xff;
IE2|=0x08;
}
}
主函数 高速调用上面的函数 就行。主函数必须高速循环。不能有while(key)的这种 死等。
作者: 啊_奶瓶 时间: 2021-1-1 00:14
谢谢你
作者: 啊_奶瓶 时间: 2021-1-1 00:15
好的,谢谢你
作者: 啊_奶瓶 时间: 2021-1-1 00:16
好的,谢谢你
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |