极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9747|回复: 0

新手初学级连数码管显示

[复制链接]
发表于 2013-8-7 10:25:34 | 显示全部楼层 |阅读模式
本帖最后由 铁血㊣罡风 于 2013-8-7 10:27 编辑

这是卖家给的51的程序
[pre lang="C51" line="1"]
/***************************************************************************
标题:        8位数码管模块显示实验
效果:        显示1 2 3 4 5 6 7 8
工作于:LY5A-L2A开发板

******************************************************************************/

//头文件:
#include "reg51.h"

#define DATAOUT P2        //指定P2口做为输出

sbit H1=DATAOUT^0;        //位选控制
sbit H2=DATAOUT^1;
sbit H3=DATAOUT^2;
sbit H4=DATAOUT^3;
sbit DA=DATAOUT^4;        //数据输出       
sbit SC=DATAOUT^5;        //移位时钟
sbit ST=DATAOUT^6;        //锁存信号

//变量定义:
code unsigned char table[]=
                        {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                                        //表:共阳数码管 0-9
unsigned char l_disbuff[8]={1,2,3,4,5,6,7,8};//显示缓冲
unsigned char l_posit=0;        //显示位置索引


void output(unsigned char dat) //移出一字节
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        SC=0;
        DA=dat&0x80;        //高位先移出
        SC=1;
        dat<<=1;
    }
}
void display()//显示
{       
        output(table[l_disbuff[l_posit+4]]);        //输出第一个字节,第二模块显示内容
        output(table[l_disbuff[l_posit]]);                //输出第二字节,第一模块显示内容
        DATAOUT|=0X0F;                                                //关闭显示,位切换准备
        ST=0;                                                                //准备锁存
        ST=1;                                                                //数据锁存到输出
        DATAOUT=DATAOUT&~(1<<l_posit);                //打开下一位显示

        l_posit++;                //每调用一次函数将轮流显示
        if(l_posit>3)
                l_posit=0;       
}

//主函数,C语言的入口函数:       
void main(void)  
{
        while(1){                                        //循环扫描显示
                display();
        }
}
[/code]

自己改成了Arduino的了,各位前辈给指点下,还能简化下吗?
  1. i
  2. nt latchPin = 8;  //ST脚
  3. int clockPin = 12; //Clk脚
  4. int dataPin = 11; //Data In脚
  5. int dig[]={4,5,6,7};
  6. unsigned char const table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  7.                                         //表:共阳数码管 0-9 a-f,十六进制显示

  8. void setup ()
  9. {
  10.   pinMode(latchPin,OUTPUT);
  11.   pinMode(clockPin,OUTPUT);
  12.   pinMode(dataPin,OUTPUT); //让三个脚都是输出状态
  13.   pinMode(dig[0],OUTPUT);
  14.   pinMode(dig[1],OUTPUT);
  15.   pinMode(dig[2],OUTPUT);  
  16.   pinMode(dig[3],OUTPUT); //让4个脚都是输出状态,数码管模块的1-4针脚
  17. }
  18. void display()
  19. {
  20.   for(int i = 0;i < 4; i++)
  21.   {
  22.     digitalWrite(dig[0],HIGH);
  23.     digitalWrite(dig[1],HIGH);
  24.     digitalWrite(dig[2],HIGH);
  25.     digitalWrite(dig[3],HIGH);
  26.    
  27.     digitalWrite(latchPin, LOW);
  28.     shiftOut(dataPin, clockPin, MSBFIRST, table[i+8]);
  29.     shiftOut(dataPin, clockPin, MSBFIRST, table[i+4]);
  30.     shiftOut(dataPin, clockPin, MSBFIRST, table[i]);
  31.     digitalWrite(latchPin, HIGH);
  32.     digitalWrite(dig[i],LOW);
  33.   
  34.     delay(5);
  35.   }  
  36. }

  37. void loop()
  38. {
  39.   display();
  40. }
复制代码
回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 23:46 , Processed in 0.034018 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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