| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 641 人关注过本帖
标题:请教一个问题,关于c51的程序
只看楼主 加入收藏
坏孩子1912
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2012-7-31
结帖率:80%
收藏
已结贴  问题点数:22 回复次数:2 
请教一个问题,关于c51的程序
程序代码:
#include    <./Atmel/REG51.H>
#include    "tm1618.h"

#define uchar unsigned char        //255
#define uint unsigned int        //65535

unsigned char code tab[]={
    0x3F    // 0
    ,0x06    // 1
    ,0x5B    // 2
    ,0x4F    // 3
    ,0x66    // 4
    ,0x6D    // 5
    ,0x7D    // 6
    ,0x07    // 7
    ,0x7F    // 8
    ,0x6F    // 9
    ,0x77    // A
    ,0x7C    // b
    ,0x39    // C
    ,0x5E    // d
    ,0x79    // E
    ,0x71    // F
    ,0x40    // -
    ,0x80    // .
    ,0        // 全灭
};

void delay100ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=19;c>0;c--)
        for(b=20;b>0;b--)
            for(a=130;a>0;a--);
}

main()
{
    uchar i = 0;
    uchar num[4] = {0};

    init_TM1618();

    for(i=0;i<18;i++)
    {
        Write_num(0,tab[i]);
        Write_num(2,tab[i]);
        Write_num(4,tab[i]);
        Write_num(6,tab[i]);

        delay100ms();
    }

    while(1)
    {
        i = Read_key();

        while(Read_key() == i)//等待按键释放
        {
        }

         num[i]++;
        if(num[i] >15)                        
        {
            num[i]=0;
        }
       
        Write_num(i*2,tab[num[i]]);
    }
}
这是主函数
程序代码:
#ifndef    _TM1618_H
#define    _TM1618_H

#include    <./Atmel/REG51.H>

#define BYTE unsigned char

//引脚定义
sbit    DIO=P2^0;
sbit    CLK=P2^1;
sbit    STB=P2^2;


void TM1618_WriteBYTE(unsigned char    DATA)            //写一个字节
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        CLK=0;
        if(DATA&0X01)
            DIO=1;
        else
            DIO=0;
        DATA>>=1;
        CLK=1;
    }
}

unsigned char TM1618_Read(void)                    //读数据函数
{
    unsigned char i;
    unsigned char temp=0;
    DIO=1;    //设置为输入
    for(i=0;i<8;i++) 
    { 
        temp>>=1; 
        CLK=0; 
        CLK=1; 
        if(DIO) 
           temp|=0X80; 
    }
    return temp;
}

void Write_command(unsigned char cmd)        //发送命令字
{
    STB=0;
    TM1618_WriteBYTE(cmd);
    STB=1;
}

unsigned char Read_key(void)          //读按键
{
    unsigned char a=0, b=0, c=0;
   
    STB=0;
   
    TM1618_WriteBYTE(0x42);

    a = TM1618_Read();
    b = TM1618_Read();
    c = TM1618_Read();
   
    STB=1;

      if((a & 0x02) != 0)
    {
        return 0;
    }
    if((a & 0x10) != 0)
    {
        return 1;
    }
    if((b & 0x02) != 0)
    {
        return 2;
    }
    if((b & 0x10) != 0)
    {
        return 3;
    }

    return 255;
}

void Write_num(BYTE add, BYTE DATA)
{
    Write_command(0x44);
   
    STB=0;
    TM1618_WriteBYTE(0xc0|add);
    TM1618_WriteBYTE(DATA&0x1F);//seg1~seg5     键扫描
    STB=1;

    STB=0;
    TM1618_WriteBYTE(0xc0|add+1);
    TM1618_WriteBYTE((DATA&0xE0)>>2);//seg12~seg14   
    STB=1;
}

void init_TM1618(void)
{
    unsigned char i;

    Write_command(0x00);//4位8段模式
    Write_command(0x8b);//亮度
    Write_command(0x40);//地址自动+1模式

    STB=0;
    TM1618_WriteBYTE(0xc0);
    for(i=0;i<16;i++)
        TM1618_WriteBYTE(0x00);
    STB=1;
}

#endif
这是调用函数等等。程序的实现功能是四个按键控制四个数码管,按一下加一,怎么样修改才能实现四个按键功能分别为:控制小数点,加以键,减一键,确认键
2012-08-16 17:52
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:15 
控制小数点的话,你先找出小数点对应段,然后把另外的段熄灭就可以了
既然有加1的,减一朝反向就可以了;
确认件可以单独做个变量,加个判断语句来读取;

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-08-16 19:32
坏孩子1912
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2012-7-31
收藏
得分:0 
回复 2楼 pauljames
能给点程序不
2012-08-17 10:10
快速回复:请教一个问题,关于c51的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019797 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved