独立键盘控制数码管显示 出现问题?求大神帮忙分析下
时间:10-02
整理:3721RD
点击:
单片机型号:HJ-C52
代码:
/*
例4.1.1数码管的前两位显示一个十进制数P82
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0; //段选的引脚是p^0 ,申明U1锁存器的锁存端
sbit wela=P2^1;
//独立键盘
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
uchar numt0,num;
void display(uchar numdis)
{
uchar shi,ge;
shi=numdis/10; //分离两个分别要显示的数
ge=numdis%10;
dula=1;
P0=table[shi]; //送十位段选数据
dula=0;
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存
wela=1;
P0=0xfe; //1111 1110
wela=0;
delayms(5); //延时
dula=1;
P0=table[ge]; //送十位段选数据
dula=0;
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存是
wela=1;
P0=0xfd; // 1111 1101
wela=0;
delayms(5); //延时
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i++) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void init() //初始化函数
{
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-45872)/256; //装初值50ms一次中断
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void keyscan()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
num++;
if(num==60) //当到60时重新归0
num=0;
while(!key1); //等待按键释放
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
if(num==0) //当到0时重新归60
num=60;
num--;
while(!key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
num=0; //清0
while(!key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!key4);
TR0=~TR0; //启动或停止定时器0
}
}
}
void main()
{
init(); //初始化函数
while(1)
{
keyscan();
display(num);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
numt0++;
if(numt0==20) //如果到了20次,说明1秒时间到
{
numt0=0; //然后把numt清0重新再计20次
num++;
if(num==60)
num=0;
}
}
问题:
数码管只显示十位,然后过一会显示个位,同时十位灭,如此重复。按独立键盘没反应。
结果图:
头文件最起码是#include<52.h>
这款单片机的头文件是<reg52.h>
显示那块你说一次只显示1位 (说明扫描的不够快(说明里面有等待 有延时的意思 ) ) 按键没左右估计就是你前面扫描的慢 还没到键盘那里去 不然按键代码你就换成标志的那种判断来进入
问题解决了,是delay函数哪里i写成i++了,应该是i--
好
请问你这个解决了么? 我也是郭天祥的书也是这个样
我的是i-- 可是我按时是第二个数码管亮第一个不亮 松手就亮