搜索
bottom↓
回复: 6

点亮3排数码管遇到问题,求助调了两天了没调通

[复制链接]

出0入0汤圆

发表于 2012-11-12 20:53:39 | 显示全部楼层 |阅读模式
#include <iom64v.h>
#include <macros.h>
#define   uint8 unsigned char
#define   uint16 unsinged int

/*a为要操作的寄存器, b要操作的位数*/
#define   set(a,b)   a= a|(1<<b)      //置1
#define   clr(a,b)    a=a&~(1<<b)     //置0
#define   DATA_H   set(PORTG,2)  //数据输出至74HC164,高电平
#define   DATA_L   clr(PORTG,2)  //数据输出至74HC164,低电平
#define   CLK_H    set(PORTC,6)  //时钟输出至74HC164,高电平
#define   CLK_L    clr(PORTC,6)  //时钟输出至74HC164,低电平
#define   CLR_DISABLE    set(PORTC,7)  //不清除74HC164数据,高电平
#define   CLR_ENABLE     clr(PORTC,7)  //清除74HC164,低电平
#define   AA_H    set(PORTA,5)  //74F138数据高电平
#define   AA_L    clr(PORTA,5)  //74F138数据低电平
#define   BB_H    set(PORTA,6)  //74F138数据高电平
#define   BB_L    clr(PORTA,6)  //74F138数据低电平
#define   CC_H    set(PORTA,7)  //74F138数据高电平
#define   CC_L    clr(PORTA,7)  //74F138数据低电平
uint8 ms2_flag=0;
//uint8 ms2_cnt=0;

/* -----------------数码显示扫描缓冲区------------------*/
uint8 uptemp[4]=    {0x77,0x12,0xD5,0xD6};  //上排数码管显示数据
uint8 middletemp[4]= {0xB2,0xE6,0xE7,0x52};  //中排数码管显示数据
uint8  downtemp[4]= {0xF7,0xF6,0xf6,0xf6};  //下排数码管显示数据
uint8  Axx[4]={ 0x00 ,0x20 ,0x40 ,0x60};//译码地址

#pragma interrupt_handler timer0:17
void timer0()
{
         TCNT0=0x06;
                   ms2_flag=1;
       
       
}
void write_164(uint8 ChrDat)
{
           uint8 i;
          
            for(i=8;i>0;i--)
           {
                          
                        if(ChrDat&0x80)// 输出数据
                                  PORTG|=(1<<2);
                        else
                                  PORTG&=~(1<<2);
                           ChrDat<<=1;//数据移位
               
                        PORTC&=~(1<<6);
                        asm("nop");
                        PORTC|=(1<<6);//时钟给上升延信号
                        asm("nop");
                       
                       
           }

}
//74F138输入口数据
void write_138(uint8 ChrDat)   
{
    uint8 i;
    i  = PORTA & 0x1F ;
    ChrDat = ChrDat& 0xE0 ;
        PORTA = i | ChrDat;
       

}
void timer0_init()      //2ms iterval
{
         TCNT0=0x06;
         TCCR0|=(1<<CS02);//1/64
         TIMSK|=(1<<TOIE0);//开定时器0中断
}
void main(void)
{
        uint8 static temp_address=0;
        PORTA=0xe0;
        DDRA=0xE0;//74HC138控制端CBA输为输出,初始值为111
        PORTC=0x7E;
        DDRC=0xFE;
        PORTG =0x00;
    DDRG =0x04;  
        timer0_init();
        _SEI();//使能全局中断
        while(1)
        {               
                 if(ms2_flag)
                        {
                                 ms2_flag=0;
                                  temp_address++;       //显示位的控制
               if (temp_address >3)  
                           {  
                                  temp_address=0 ;
                           }
                                write_138(0xc0) ;        //不显示,消影
                PORTC|=(1<<7);      //PC7为CLR,不清除74HC164数据,高电平
                write_164(downtemp[temp_address]);
                       
                                write_164(middletemp[temp_address]);
                       
                write_164(uptemp[temp_address]);
                               
                                write_138(Axx[temp_address ]) ;  //显示
                               
                               
                        }
                
                        
        }
}

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2012-11-12 20:55:35 | 显示全部楼层
我根本上没写小灯程序,怎么小灯也亮了,求解

出0入0汤圆

发表于 2012-11-12 21:20:29 | 显示全部楼层
问题都说的不清楚 别人都不知道说啥

出0入0汤圆

发表于 2012-11-12 21:23:12 | 显示全部楼层
还有电路图 虽然不懂多少电路 但感觉怪怪的

出0入0汤圆

 楼主| 发表于 2012-11-12 21:42:24 | 显示全部楼层
yklstudent 发表于 2012-11-12 21:23
还有电路图 虽然不懂多少电路 但感觉怪怪的

就是点亮数码管时,没选通小灯,小灯怎么会灯

出0入0汤圆

发表于 2012-11-12 23:11:18 | 显示全部楼层
you are very challenged, :)

Here is your code, modified for gcc-avr:

  1. /*
  2. */

  3. #include <avr/io.h>                                                //we use gcc avr
  4. #include <avr/interrupt.h>                                //we use interrupts
  5. //#include "gpio.h"

  6. //hardware configuration
  7. #define HC164_PORT                        PORTE
  8. #define HC164_DDR                        DDRE
  9. #define HC164_SCK                        (1<<0)
  10. #define HC164_MOSI                        (1<<1)
  11. //rst pin tied high

  12. #define HC138_PORT                        PORTE
  13. #define HC138_DDR                        DDRE
  14. #define HC138_A                                (1<<5)
  15. #define HC138_B                                (1<<6)
  16. #define HC138_C                                (1<<7)
  17. #define HC138s                                (HC138_A | HC138_B | HC138_C)                //selection on 7..5
  18. //end hardware configuration

  19. //pin macros
  20. #define IO_SET(port, bits)        port |= (bits)
  21. #define IO_CLR(port, bits)        port &=~(bits)
  22. #define IO_OUT(ddr, bits)        IO_SET(ddr, bits)
  23. #define IO_IN(ddr, bits)        IO_CLR(ddr, bits)

  24. //#include <iom64v.h>
  25. //#include <macros.h>
  26. #define   uint8 unsigned char
  27. #define   uint16 unsinged int

  28. #if 0                                                                        //cut out the bs
  29. /*a为要操作的寄存器, b要操作的位数*/
  30. #define   set(a,b)   a= a|(1<<b)      //置1
  31. #define   clr(a,b)    a=a&~(1<<b)     //置0
  32. #define   DATA_H   set(HC164_PORT,2)  //数据输出至74HC164,高电平
  33. #define   DATA_L   clr(HC164_PORT,2)  //数据输出至74HC164,低电平
  34. #define   CLK_H    set(PORTC,6)  //时钟输出至74HC164,高电平
  35. #define   CLK_L    clr(PORTC,6)  //时钟输出至74HC164,低电平
  36. #define   CLR_DISABLE    set(PORTC,7)  //不清除74HC164数据,高电平
  37. #define   CLR_ENABLE     clr(PORTC,7)  //清除74HC164,低电平
  38. #define   AA_H    set(PORTA,5)  //74F138数据高电平
  39. #define   AA_L    clr(PORTA,5)  //74F138数据低电平
  40. #define   BB_H    set(PORTA,6)  //74F138数据高电平
  41. #define   BB_L    clr(PORTA,6)  //74F138数据低电平
  42. #define   CC_H    set(PORTA,7)  //74F138数据高电平
  43. #define   CC_L    clr(PORTA,7)  //74F138数据低电平
  44. #endif
  45. uint8 ms2_flag=0;
  46. //uint8 ms2_cnt=0;

  47. /* -----------------数码显示扫描缓冲区------------------*/
  48. uint8 uptemp[4]=    {0x77,0x12,0xD5,0xD6};  //上排数码管显示数据
  49. uint8 middletemp[4]= {0xB2,0xE6,0xE7,0x52};  //中排数码管显示数据
  50. uint8  downtemp[4]= {0x06, 0x5b, 0x4f, 0x66};  //下排数码管显示数据 = '1234'
  51. uint8  Axx[4]= { 0x00 ,HC138_A/*0x20*/ ,HC138_B/*0x40*/ ,HC138_A | HC138_B/*0x60*/}; //译码地址

  52. //#pragma interrupt_handler timer0:17
  53. //void timer0() {
  54. ISR(TIMER0_OVF_vect) {
  55.     TCNT0=-100/*0x06*/;
  56.     ms2_flag=1;


  57. }
  58. void write_164(uint8 ChrDat) {
  59.     uint8 i;

  60.     for(i=8; i>0; i--) {

  61.         //clear sck
  62.         IO_CLR(HC164_PORT, HC164_SCK);        //PORTC&=~(1<<6);
  63.         //asm("nop");

  64.         if(ChrDat&0x80)// 输出数据
  65.             IO_SET(HC164_PORT, HC164_MOSI);         //PORTG|=(1<<2);
  66.         else
  67.             IO_CLR(HC164_PORT, HC164_MOSI);                //PORTG&=~(1<<2);

  68.         //set sck, strobe out data
  69.         IO_SET(HC164_PORT, HC164_SCK);                        //PORTC|=(1<<6);//时钟给上升延信号
  70.         //asm("nop");

  71.         ChrDat<<=1;//数据移位

  72.     }

  73. }
  74. //74F138输入口数据
  75. void write_138(uint8 ChrDat) {
  76.     //uint8 i;
  77.     //i  = PORTA & 0x1F ;
  78.     //ChrDat = ChrDat& 0xE0 ;
  79.     HC138_PORT = (HC138_PORT & ~HC138s) | (ChrDat & HC138s);        //PORTA = i | ChrDat;


  80. }
  81. void timer0_init() {    //2ms iterval
  82.     TCNT0=0x06;
  83.     TCCR0A = 0x00;                //normal port operations
  84.     TCCR0B|=(1<<CS02);//1/64
  85.     TIMSK0|=(1<<TOIE0);//开定时器0中断
  86. }

  87. int main(void) {
  88.     uint8 static temp_address=0;
  89.     IO_CLR(HC138_PORT, HC138s);        //PORTA=0xe0;
  90.     IO_OUT(HC138_DDR, HC138s);        //DDRA=0xE0;//74HC138控制端CBA输为输出,初始值为111
  91.     IO_SET(HC164_PORT, HC164_SCK | HC164_MOSI);        //PORTC=0x7E;
  92.     IO_OUT(HC164_DDR, HC164_SCK | HC164_MOSI);        //DDRC=0xFE;
  93.     //PORTG =0x00;
  94.     //DDRG =0x04;
  95.     timer0_init();
  96.     sei();                                                //_SEI();//使能全局中断
  97.     while(1) {
  98.         if(ms2_flag) {
  99.             ms2_flag=0;
  100.             //temp_address++;       //显示位的控制
  101.             //if (temp_address >3) {
  102.             //    temp_address=0 ;
  103.             //}
  104.             temp_address = (temp_address==4)?0:(temp_address+1);
  105.             write_138(HC138s/*0xc0*/) ;        //不显示,消影
  106.             //PORTC|=(1<<7);      //PC7为CLR,不清除74HC164数据,高电平
  107.             write_164(downtemp[temp_address]);

  108.             write_164(middletemp[temp_address]);

  109.             write_164(uptemp[temp_address]);

  110.             write_138(Axx[temp_address ]) ;  //显示


  111.         }


  112.     }
  113. }
复制代码
The code is for usb1286, the last display data has been changed to '1234': I purposely wrote the code so you have to modify it to work with your hardware - so you will learn.



本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-11-13 19:18:18 | 显示全部楼层
millwood0 发表于 2012-11-12 23:11
you are very challenged, :)

Here is your code, modified for gcc-avr:The code is for usb1286, the la ...

TCCR0A = 0x00;                //normal port operations,这是有什么用处啊?这么两次定时器赋值不一样?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 18:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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