📄 12864h2.c
字号:
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 + -