普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4531|回复: 8

上次有问数码管显示电话拨号效果,先将程序给出,欢迎讨论

 关闭 [复制链接]

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
发表于 2017-9-22 08:07:41 | 显示全部楼层 |阅读模式
如果你的电路图不一样,请改动接口
#include<reg52.h> //包含寄存器的库文件

#define uchar unsigned char
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit Key1=P3^4;
sbit Key2=P3^5;
sbit Key3=P3^6;
sbit Key4=P3^7;

uchar code LedChar[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar Key_Times=0;
uchar Key_Value=0;
uchar Key_buff[]={0x02,0x01,0x04,0x05,0x07,0x03};

void delay10ms()
{
     uchar i,j;
     for(i=0;i<100;i++)
     for(j=0;j<30;j++)
     ;
}

void main()
{
    uchar j;
     ENLED = 0; ADDR0 = 0; ADDR1 = 0;
     ADDR2 = 0; ADDR3 = 1; P0 = 0XFF; //74HC138 和P0 初始化部分

     TMOD = 0x01; //设置定时器0 为模式1
     TH0 = (65536-10000)/256;
     TL0 = (65536-10000)%256; //定时值初值10ms扫描一次键盘
     TR0 = 1; //打开定时器0
     ET0=1;
     EA=1;

     while(1)   //数码管显示
     {
          for(j=1;j<=Key_Times;j++)
          {
              P1=0x08+j-1;
              P0=LedChar[ Key_buff[Key_Times-j]];                  
              delay10ms();
              P0=0xff;//数码管动态刷新部分
          }
      }   
}

void Timer0() interrupt 1
{
     TR0=0;
     if((P3&0xf0)!=0xf0)
     {
          delay10ms();                 
          if((P3&0xf0)!=0xf0)
          {               
               if(Key1==0) Key_Value=1;
               if(Key2==0) Key_Value=2;
               if(Key3==0) Key_Value=3;
               if(Key4==0) Key_Value=4;
               while((P3&0xf0)!=0xf0);
               Key_buff[Key_Times] =Key_Value;            
               Key_Times++;
               if(Key_Times==7)
               Key_Times=0;
          }

     }
     TH0 = (65536-10000)/256;
     TL0 = (65536-10000)%256; //定时值初值10ms扫描一次键盘
     TR0 = 1; //打开定时器0
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

5

主题

59

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2017-9-22 20:37:42 | 显示全部楼层
我的板子是3.0的   你的是多少?
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-22 22:12:30 | 显示全部楼层
ljy棉花糖 发表于 2017-9-22 20:37
我的板子是3.0的   你的是多少?

请将你的原理图发来,看看改哪些东西
回复 支持 反对

使用道具 举报

5

主题

59

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2017-9-23 10:24:15 | 显示全部楼层
xzf586 发表于 2017-9-22 22:12
请将你的原理图发来,看看改哪些东西

这就是3.0的原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-23 11:55:30 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-23 12:06 编辑

#include<reg52.h> //包含寄存器的库文件

#define uchar unsigned char

sbit Key1=P3^4;
sbit Key2=P3^5;
sbit Key3=P3^6;
sbit Key4=P3^7;

uchar code LedChar[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Key_Times=0;
uchar Key_Value=0;
uchar Key_buff[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void delay10ms()
{
     uchar i,j;
     for(i=0;i<100;i++)
     for(j=0;j<10;j++)
     ;
}

void main()
{
    uchar j;
     
     P1=0xff;
     TMOD = 0x01; //设置定时器0 为模式1
     TH0 = (65536-10000)/256;
     TL0 = (65536-10000)%256; //定时值初值10ms扫描一次键盘
     TR0 = 1; //打开定时器0
     ET0=1;
     EA=1;
     
     while(1)  
     {
          for(j=1;j<=Key_Times;j++)
          {
              P1=~(0x80>>(j-1));
              P0=LedChar[ Key_buff[Key_Times-j]];                  
              delay10ms();
              P0=0x00;/
          }
      }   
}

void Timer0() interrupt 1
{
     TR0=0;
     P3=0xf0;
     if((P3&0xf0)!=0xf0)
     {
          delay10ms();                 
          if((P3&0xf0)!=0xf0)
          {               
               if(Key1==0) Key_Value=1;
               if(Key2==0) Key_Value=2;
               if(Key3==0) Key_Value=3;
               if(Key4==0) Key_Value=4;
               while((P3&0xf0)!=0xf0);
               Key_buff[Key_Times] =Key_Value;            
               Key_Times++;
               if(Key_Times==9)
               Key_Times=0;
          }
     
     }
     TH0 = (65536-10000)/256;
     TL0 = (65536-10000)%256; //定时值初值10ms扫描一次键盘
     TR0 = 1; //打开定时器0
}

连线方法,JP5接到P3口,J16接到P1口,J12接到P0口,J21连VCC,调试一下,调试结果请回复一下,我是用四个独立按键,只能显示1 2 3 4,其它自行修改
回复 支持 反对

使用道具 举报

5

主题

59

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2017-9-23 15:50:56 | 显示全部楼层
xzf586 发表于 2017-9-23 11:55
#include //包含寄存器的库文件

#define uchar unsigned char

开始随便按四个中的任意一个按键,如第四个按键 , 数码管不显示 。 再按四个中任意一个  假如是第一个按键   第七个数码管显示4,这时再按第三个按键的话第六七数码管显示41,要是再按第二个按键第五六七数码管显示413,再按第四个按键的话第四五六七数码管显示4132。      

我觉的这个程序实现了那种数码管像前一位显示的效果也就是像拨电话那样,    可是按的按键显示的数字不一致,就像慢一步显示一样   这一次按了第四个按键,下一次按了第三个按键显示的不是3而是4.
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-23 16:35:36 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-23 16:39 编辑
ljy棉花糖 发表于 2017-9-23 15:50
开始随便按四个中的任意一个按键,如第四个按键 , 数码管不显示 。 再按四个中任意一个  假如是第一个按 ...

我用软件仿真应该是正常的,你自己修改一下,检查一下你的插线,P1口那根,是不是错开一位,有问题探讨!
回复 支持 反对

使用道具 举报

15

主题

196

帖子

503

积分

高级会员

Rank: 4

积分
503
 楼主| 发表于 2017-9-23 22:08:26 | 显示全部楼层
本帖最后由 xzf586 于 2017-9-23 22:09 编辑
ljy棉花糖 发表于 2017-9-23 15:50
开始随便按四个中的任意一个按键,如第四个按键 , 数码管不显示 。 再按四个中任意一个  假如是第一个按 ...

再来一个,从左往右显示!与前面的思想相反,中断执行显示,主函数扫描!那么多重复扫描语句,感觉实在有点呆板
#include<reg52.h>
#define DataPort P0
#define WeiPort P1

sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^4;
sbit KEY6=P3^5;
sbit KEY7=P3^6;
sbit KEY8=P3^7;


unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[10]; //显示数据缓存

void DelayUs2x(unsigned char t)
{   
     while(--t);
}

void DelayMs(unsigned char t)//大致延时1mS
{     
     while(t--)
     {         
          DelayUs2x(245);
          DelayUs2x(245);
     }
}

/*------------------------------------------------
            按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)
{
     if(!KEY1)  
     {
          DelayMs(10);
          if(!KEY1)   
          {
               while(!KEY1);
               return 1;
          }
     }
     else if(!KEY2)  
     {
          DelayMs(10);
          if(!KEY2)     
          {
               while(!KEY2);
               return 2;
          }
     }
     
     else if(!KEY3)  
     {
          DelayMs(10);
          if(!KEY3)     
          {
               while(!KEY3);
               return 3;
          }
     }
     
     else if(!KEY4)  
     {
          DelayMs(10);
          if(!KEY4)     
          {
               while(!KEY4);
               return 4;
          }
     }
     
     else if(!KEY5)  
     {
          DelayMs(10);
          if(!KEY5)     
          {
               while(!KEY5);
               return 5;
          }
     }
     
     else if(!KEY6)  
     {
          DelayMs(10);
          if(!KEY6)     
          {
               while(!KEY6);
               return 6;
          }
     }
     
     else if(!KEY7)  
     {
          DelayMs(10);
          if(!KEY7)     
          {
               while(!KEY7);
               return 7;
          }
     }
     
     else if(!KEY8)  
     {
          DelayMs(10);
          if(!KEY8)     
          {
               while(!KEY8);
               return 8;
          }
     }
     
     else
     return 0;
}

/*------------------------------------------------
显示函数,用于动态扫描数码管
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
     static unsigned char i=0;         
     P0=0x00;
     P1=WeiMa[i+FirstBit];
     P0=TempData;
     i++;
     if(i==Num)
     i=0;
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{   
     unsigned char num,i,j;
     
     TMOD |= 0x01;                              
     TH0=(65536-2000)/256;                  
     TL0=(65536-2000)%256;
     EA=1;            
     ET0=1;         
     TR0=1;                              

     while (1)        
     {
          num=KeyScan();
          if(num)
          {
               if(i<8)
               TempData=DuanMa[num];
               i++;
               if(i==9)//多出一个按键输入为了清屏
               {
                    i=0;
                    for(j=0;j<8;j++)//清屏
                    TempData[j]=0;
               }
          }        
     }
}



/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
      TH0=(65536-2000)/256;                  //重新赋值 2ms
      TL0=(65536-2000)%256;
      
      Display(0,8);       // 调用数码管扫描

}
回复 支持 反对

使用道具 举报

5

主题

59

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2017-9-26 10:52:47 | 显示全部楼层
xzf586 发表于 2017-9-23 16:35
我用软件仿真应该是正常的,你自己修改一下,检查一下你的插线,P1口那根,是不是错开一位,有问题探讨!

好的  谢谢啦   我试试看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 05:13 , Processed in 0.089199 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表