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

📄 12864h2.c

📁 用AVR芯片
💻 C
📖 第 1 页 / 共 2 页
字号:
       switch (s)
              {
               case 0:
                    temp=(dat|temp);
                    break;
               case 1:
                    // dat=~dat;
                    temp=(dat&temp);
                    break;
              }
      }   
   ctrl(x|0x40,i);
   write(temp,i);
}

//==============================================
//先设字符的首地址该地址,以字符的左上角的点为起始
//display 6x8,8x8 dots  子程序
//writetext (x地址,y地址,显示数据,显示/消隐)
//==============================================
void wtext8x8(uchar da,uchar s)   //
 {
// uchar a,c,i,ii,yy,dat,temp, col_x,row_y,;
 uchar a,i,yy,dat,temp, col_x,row_y;
 col_x=column*6; 
 row_y=row*8;  
 a=row_y%8;
 yy=(row_y/8)|0xb8;
 if (a==0)
      {
       ctrl(yy,0); 						//set page address
       ctrl(yy,1); 						//set page address
       for(i=0;i<5;i++)
          {
			dat=pgm_read_byte(&t5x8[(da-0x20)*5+i]);
           //dat=t5x8[(da-0x20)*5+i];
           disp(col_x+i,dat,s);
          }
       }
else
      {
         for(i=0;i<5;i++)
             {
             ctrl(yy,0); 				//set page address
             ctrl(yy,1); 				//set page address
			 temp=pgm_read_byte(&t5x8[(da-0x20)*5+i]);
            // temp=t5x8[(da-0x20)*5+i];
             dat=temp<<a;
             disp(col_x+i,dat,s);
             ctrl(yy+1,0); 				//set page address
             ctrl(yy+1,1); 				//set page address
             dat=temp>>(8-a);
             disp(col_x+i,dat,s);
             }
         }
}    
/*
void wtext8x8(uchar col_x,uchar row_y,uchar da, uchar s)   //
 {
 uchar a,c,i,ii,yy,dat,temp;
   a=row_y%8;
   yy=(row_y/8)|0xb8;
   if (a==0)
      {
       ctrl(yy,0); 						//set page address
       ctrl(yy,1); 						//set page address
       for(i=0;i<5;i++)
          {
           dat=t5x8[(da-0x20)*5+i];
           disp(col_x+i,dat,3);
          }
       }
   else
      {
         for(i=0;i<5;i++)
             {
             ctrl(yy,0); 				//set page address
             ctrl(yy,1); 				//set page address
             temp=t5x8[(da-0x20)*5+i];
             dat=temp<<a;
             disp(col_x+i,dat,3);
             ctrl(yy+1,0); 				//set page address
             ctrl(yy+1,1); 				//set page address
             dat=temp>>(8-a);
             disp(col_x+i,dat,3);
             }
         }
}      */
//========================================
//
//=======================================
 void scroll_up()
 {
 }

//====================================
//
//====================================
void write_text(uchar dat)
{
 uchar temp,temp1;
 temp=column*6; 
 temp1=row*8;  
// wtext8x8(temp,temp1,dat,3);
}

//===============================================
 //==== move cursor one character left ==========
 //===============================================
  void cursor_left()
  {
 if(column==0)
    {
     if(row!=0)
        { row--,column=21 ;}
    }
 else
    {column--;}
    wtext8x8(cursor,1);// write_text(cursor);
 }

 //===============================================
 //==== move cursor one character right ==========
 //===============================================
 void cursor_right()
  {
    column++;
    if(column>20)   //判列是否超出范围
        {
        row++;
        column=0;
        if(row>7)    //判行是否超出范围
            {
            if(autoscroll==1)    //超出范围,判是否卷动显示
               {
                scroll_up();                 //卷动显示
                column=0,row=7;          // display_line-1
                }
            else {row=0;}               //行返回第一行
            }
         }
    wtext8x8(cursor,1);//write_text(cursor);
  }

//=============================================
void EEPROM_write(uint addr, uchar dat)
{
 while(EECR & (1<<EEWE)); 	// 等待上一次写操作结束
 EEAR = addr;				// 设置地址和数据寄存器
 EEDR = dat;
 EECR |= (1<<EEMWE);		// 置位EEMWE //
 EECR |= (1<<EEWE);			// 置位EEWE 以启动写操作
}

//=====================================
uchar EEPROM_read(uint addr)
{
	while(EECR & (1<<EEWE)); 	// 等待上一次写操作结束 
	EEAR = addr;				// 设置地址寄存器
	EECR |= (1<<EERE);			// 设置EERE 以启动读操作
	return EEDR;				// 自数据寄存器返回数据 
}


//==============================

void mcu_init()
{
    PORTA=0xff;
	DDRA=0xff;
   pdout=0xff;
	DDRB=0xff;
	pdout=0xff;
	DDRB=0xff;
	pcont=0xff;
	DDRC=0xff;
	pcont1=0xff;
	DDRD=0xff;
}

//==================================
//SPI初始化
//===============================
/*
 DDRB=0x2C;     //PB口初始化
    SPCR=0x53;     //SPI初始化,主机模式,时钟7.8.3K,时钟相位0度,极性Low,数据方向MSB
    while (1)      //循环函数
      {
        data=170;
        spi (data);//从spi口输出数据函数
        DDRC=255;
        PORTC=255;
        PORTC=0;
      };
*/
//===================================
//采用timer2 产生波形
// PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
//===================================
void timer2_init()
{
  TCCR2 = 0x00; //stop
  TCNT2= 0x01; //set count
  OCR2 = pwmbuf; //set compare
  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x01; // start timer 快速pwm模式,匹配清零,溢出置位 8分频
//占空比=高:低为OCR2-0X01)/(0XFF-OCR2)   OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)
//即OCR2越大,输出越大
}    
//========================================
//电压检测初始化
//===========================================
void Init_ADC(void)
{
 ADMUX=0x47;  //参考电压为 AVCC,转换结果左对齐 选择第七通道ADC7;
 ADCSRA=0xe6;  //125K转换速率,自由转换模式;启动AD转换器;
}
                 
//=====================================
//A/D转换采样电压值
//===================================
//参数说明:
//Channel:0 A点电压采样;1:B点电压采样;2:A、B电压差值
//返回值:电压采样值或者A、B点采样差值
uint ADC_Convert(void)
{
 uint temp1,temp2;
 delay(4);
 temp1=(uint)ADCL;
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 return(temp2);
}
/*
uint temp1,temp2;
delay(4);
 temp1=(uint)ADCL;
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 return(temp2);
*/

//====================================
 //分解2位16进制数据
 //=======================================
 void read16db(uint da)
 {
 // uchar i,ii;
	//	datbuf1=strcmp_P leddat[(uchar)(da&0x000f)];
         datbuf4=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
		 datbuf3=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
		 datbuf2=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
         datbuf1=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
/*  for (i=0;i<4;i++)
         {
         ii=3-i;
         datbuf[ii]=leddat[(uchar)(da&0x000f)];
         da=da>>4;
         } */
 }        
//======================================
//
//=======================================
void display_16()
{
// uchar i;
  wtext8x8(datbuf1,3);
  cursor_right();
  wtext8x8(datbuf2,3);
  cursor_right();
  wtext8x8(datbuf3,3);
  cursor_right();
  wtext8x8(datbuf4,3);
  cursor_right();
 /*
 for (i=0;i<4;i++)
         {
         wtext8x8(datbuf[i],3);//write_text(datbuf[i]);
         cursor_right();
         }*/

}

//=============================================
// 检测电压即获得ADC转换值 转换通道ADC7
//=============================================
uint work_adc7(void)
{
    uchar i;
	uint ret;
	uchar max_id,min_id,max_value,min_value;
	//ADMUX=0x47;							//内部AVCC参考电压,通道7
	ADMUX=0x43;
	ADCSRA=_BV(ADEN);					//使能ADC,单次转换模式
						
	for(i=0;i<8;i++)			//连续转换8 次
			{
			ADCSRA|=_BV(ADSC);
			_delay_loop_1(60);
			while(ADCSRA&_BV(ADSC))
			_delay_loop_1(60);
			ret=ADCL;
			ret|=(uint)(ADCH<<8);
			g_aAdValue[i]=ret;
			}
	ret=0;
	for(i=1;i<8;i++)
	ret+=g_aAdValue[i];
						//找到最大和最小值索引
	ret/=7;
	max_id=min_id=1;
	max_value=min_value=0;
	for(i=1;i<8;i++)
			{
			if(g_aAdValue[i]>ret)
					{
					 if(g_aAdValue[i]-ret>max_value)
								{
									max_value=g_aAdValue[i]-ret;
									max_id=i;
								}
					}
			else
					{
					if(ret-g_aAdValue[i]>min_value)
								{
									min_value=ret-g_aAdValue[i];
									min_id=i;
								}
					}
			}
									//去掉第一个和最大最小值后的平均值
	ret=0;
	for(i=1;i<8;i++)
			{
				if((i!=min_id)&&(i!=max_id))
				ret+=g_aAdValue[i];
			}
	if(min_id!=max_id){ret/=5;}
	else {ret/=6;}

   ADCSRA=0;//关闭ADC
   return ret;
}
//==========================
//
//=============================
uchar get_degree(void)
{
 uchar x,y;
 uint v_big,v_small,v_step;
 if (example<30) return 0x0b;

 for (x=0;x<60;x++) // 

⌨️ 快捷键说明

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