|
发表于 2012-11-12 23:11:18
|
显示全部楼层
you are very challenged, :)
Here is your code, modified for gcc-avr:
- /*
- */
- #include <avr/io.h> //we use gcc avr
- #include <avr/interrupt.h> //we use interrupts
- //#include "gpio.h"
- //hardware configuration
- #define HC164_PORT PORTE
- #define HC164_DDR DDRE
- #define HC164_SCK (1<<0)
- #define HC164_MOSI (1<<1)
- //rst pin tied high
- #define HC138_PORT PORTE
- #define HC138_DDR DDRE
- #define HC138_A (1<<5)
- #define HC138_B (1<<6)
- #define HC138_C (1<<7)
- #define HC138s (HC138_A | HC138_B | HC138_C) //selection on 7..5
- //end hardware configuration
- //pin macros
- #define IO_SET(port, bits) port |= (bits)
- #define IO_CLR(port, bits) port &=~(bits)
- #define IO_OUT(ddr, bits) IO_SET(ddr, bits)
- #define IO_IN(ddr, bits) IO_CLR(ddr, bits)
- //#include <iom64v.h>
- //#include <macros.h>
- #define uint8 unsigned char
- #define uint16 unsinged int
- #if 0 //cut out the bs
- /*a为要操作的寄存器, b要操作的位数*/
- #define set(a,b) a= a|(1<<b) //置1
- #define clr(a,b) a=a&~(1<<b) //置0
- #define DATA_H set(HC164_PORT,2) //数据输出至74HC164,高电平
- #define DATA_L clr(HC164_PORT,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数据低电平
- #endif
- 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]= {0x06, 0x5b, 0x4f, 0x66}; //下排数码管显示数据 = '1234'
- uint8 Axx[4]= { 0x00 ,HC138_A/*0x20*/ ,HC138_B/*0x40*/ ,HC138_A | HC138_B/*0x60*/}; //译码地址
- //#pragma interrupt_handler timer0:17
- //void timer0() {
- ISR(TIMER0_OVF_vect) {
- TCNT0=-100/*0x06*/;
- ms2_flag=1;
- }
- void write_164(uint8 ChrDat) {
- uint8 i;
- for(i=8; i>0; i--) {
- //clear sck
- IO_CLR(HC164_PORT, HC164_SCK); //PORTC&=~(1<<6);
- //asm("nop");
- if(ChrDat&0x80)// 输出数据
- IO_SET(HC164_PORT, HC164_MOSI); //PORTG|=(1<<2);
- else
- IO_CLR(HC164_PORT, HC164_MOSI); //PORTG&=~(1<<2);
- //set sck, strobe out data
- IO_SET(HC164_PORT, HC164_SCK); //PORTC|=(1<<6);//时钟给上升延信号
- //asm("nop");
- ChrDat<<=1;//数据移位
- }
- }
- //74F138输入口数据
- void write_138(uint8 ChrDat) {
- //uint8 i;
- //i = PORTA & 0x1F ;
- //ChrDat = ChrDat& 0xE0 ;
- HC138_PORT = (HC138_PORT & ~HC138s) | (ChrDat & HC138s); //PORTA = i | ChrDat;
- }
- void timer0_init() { //2ms iterval
- TCNT0=0x06;
- TCCR0A = 0x00; //normal port operations
- TCCR0B|=(1<<CS02);//1/64
- TIMSK0|=(1<<TOIE0);//开定时器0中断
- }
- int main(void) {
- uint8 static temp_address=0;
- IO_CLR(HC138_PORT, HC138s); //PORTA=0xe0;
- IO_OUT(HC138_DDR, HC138s); //DDRA=0xE0;//74HC138控制端CBA输为输出,初始值为111
- IO_SET(HC164_PORT, HC164_SCK | HC164_MOSI); //PORTC=0x7E;
- IO_OUT(HC164_DDR, HC164_SCK | HC164_MOSI); //DDRC=0xFE;
- //PORTG =0x00;
- //DDRG =0x04;
- timer0_init();
- sei(); //_SEI();//使能全局中断
- while(1) {
- if(ms2_flag) {
- ms2_flag=0;
- //temp_address++; //显示位的控制
- //if (temp_address >3) {
- // temp_address=0 ;
- //}
- temp_address = (temp_address==4)?0:(temp_address+1);
- write_138(HC138s/*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 ]) ; //显示
- }
- }
- }
复制代码 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
|