⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1621.c

📁 很好的红外解码程序
💻 C
字号:
 //ICC-AVR application builder : 2005-3-3 17:58:11
// Target : M8
// Crystal: 4.0000Mhz
//作者:xky183
//完成日期:2005年3月6日
//1621引线:CS:PB4  WR:PB5  Data:PB3

#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>

#define WR      0B00100000//时钟线
#define DATA    0B00001000//数据线
#define CS      0b00010000//片选线
#define P       0x80      
#define data_length 8
const char   seg_tab[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f,
                        0x77,0x7c,0x59,0x6e,0x79,0x71,0x58,0x76,0x00};
unsigned char disbuff[6] ={0,0,0,0,0,0};//对应LCD的6位
unsigned char p1 =0;
unsigned char p2 =0;


unsigned long int time =0;//每一毫秒加1
//1621的显存是4位*32的,故用16*8位的寄存器就能满足要求奇数显存放高4位,偶数放低4位
/*****************************************************************/
   //1621初始化命令
const char init_tab[]={
	  	   			   0b00000001,//打开系统振荡器命令
      	               0b00000011,//打开LCD偏压发生器命令
     				   0b00000101,//WDT 溢出标志输出失效命令
    				   0b00000110,//时基输出使能命令
    				   0b00011000,//系统时钟源片内RC振荡器命令
    				   0b00101001,//LCD1/3偏压选项4个公共口命令
    				   //0b01000000,//声音频率4KHz命令
    				   //0b00001001,//打开声音输出命令
    				   0b10100000,//时基/WDT 时钟输出1Hz命令
    				   0b10001000 //使/IRQ 输出有效命令
					  };
	
	
void send_data(unsigned char data_bus,unsigned char loop);
void delayns(void);
void display(void);
void display_init(void);
void votlageget(void);
void delay(int temp);
void port_init(void)
{
 PORTB = 0xFF;
 DDRB  = 0B11111000;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0xFF;
 DDRD  = 0XFF;
}
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFE; //setup
 TCNT1L = 0x0C;
 OCR1AH = 0x01;
 OCR1AL = 0xF4;
 OCR1BH = 0x01;
 OCR1BL = 0xF4;
 ICR1H  = 0x01;
 ICR1L  = 0xF4;
 TCCR1A = 0x00;
 TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)     //每毫秒中断一次
{
 //TIMER1 has overflowed
 TCNT1H = 0xFE; //reload counter high value
 TCNT1L = 0x0C; //reload counter low value
 time ++;
 
 disbuff[5] =time&0x0f;
 disbuff[4] =(time>>4)&0x0f;
 disbuff[3] =(time>>8)&0x0f;
 disbuff[2] =(time>>12)&0x0f;
 disbuff[1] =(time>>16)&0x0f;
 disbuff[0] =(time>>20)&0x0f;
 
 display();  //刷新1621的缓存
}

//***********************************************************************/
void display_init(void)
{
  unsigned char t;
  PORTB &=~CS;
  send_data(0b10000000,3);//送3位命令模式代码100
  for(t=0;t<=7;t++)
  {
   send_data(init_tab[t],9);//送9位命令代码 
  }
  PORTB |=CS;
  PORTB |=WR;
}

//***********************************************************************/
void display(void)
{
  unsigned char t;
  unsigned char seg_temp;
  
  PORTB &=~CS;
  PORTB &=~WR;
  send_data(0b10100000,3);//送3位“写 ”模式命令代码101
  send_data(0,6);//送6位首地址00h
  for(t=0;t<=5;t++)
  {
    seg_temp =seg_tab[disbuff[t]];
  
    send_data(seg_temp,data_length);//向显存送数据
  }
  PORTB |=CS;
  PORTB |=WR;
}

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

void send_data(unsigned char data_temp,unsigned char loop)
{
  for(;loop!=0;loop--)
  {
    delayns();
    PORTB &=~WR;
    delayns();
  if((data_temp&0b10000000)==0)
  {
    PORTB &=~DATA;
  }
  else
  {
    PORTB |=DATA;
  }
    data_temp=(data_temp<<1);
    PORTB |=WR;
  }
}
//~~~~~~~~~~~~~~~~~~~~~`
void delayns(void)
 {
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
 }
 
 //call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();
 TIMSK = 0x04; //timer interrupt sources
 SEI(); //re-enable interrupts
}

void main(void)
{
  init_devices();  //单片机初始化

  display_init();  //1621初始化
  while(1)
  {
    ;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -