📄 mcu1__.c
字号:
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#define k0 PORTB.0
#define k1 PORTB.1
#define k2 PORTC.0
#define k3 PORTC.1
#define dat PORTB.3
#define clk PORTB.5
#define ss PORTB.2
bit time_1ms_ok;
unsigned long int time0_old,time0_new,freq_time;
unsigned long int freq;
unsigned char eep,z,i,p[9]={0,0,1,2,3,4,5,6,7},w[9]={0,1,2,3,4,5,6,7,8},tri=0,hold=0,fr,kr,zhi;
unsigned char e[9]={0b00000011,0b00000001,0b00000101,0b00000010,0b00000000,0b00000100,0b00001010,0b00001000,0b00001100};
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
time0_new = TCNT1; // 1ms到,记录当前T/C0的计数值
time_1ms_ok = 1;
}
spi_out(unsigned char j)
{
unsigned char u;
ss=0;
for(u=0;u<8;u++)
{
if(j&0b10000000)
{
dat=1;
}
else
{
dat=0;
}
delay_us(1);
clk=1;
delay_us(1);
clk=0;
delay_us(1);
j<<=1;
}
delay_us(1);
ss=1;
}
void freq_to_disbuff()
{ if(fr==0)
{
freq=freq*4;
}
eep=freq>>24;//取频率高8位
spi_out(eep);
delay_us(10);
eep=(freq>>16)&0xff;
spi_out(eep);
delay_us(10);
eep=(freq>>8)&0xff;
spi_out(eep);
delay_us(10);
eep=freq&0xff;//取频率低8位
spi_out(eep);
delay_us(10);
spi_out(w[i]);
delay_us(10);
spi_out(tri);
delay_us(10);
spi_out(hold);
delay_us(10);
spi_out(kr);
delay_us(10);
spi_out(zhi);
delay_us(10);
}
void time()
{
if (time_1ms_ok)
{ // 累计T/C0的计数值
if (time0_new >= time0_old) freq = freq + (time0_new - time0_old);
else freq = freq + (65536 - time0_old + time0_new);
time0_old = time0_new;
if (++freq_time >=125)
{
freq_time = 0;
// 1000ms到,
freq_to_disbuff();
// 将1000ms内的脉冲计数值送显示
freq = 0;
}
time_1ms_ok = 0;
}
}
void main(void)
{
unsigned char q;
DDRD=0XFF;
DDRB.5=1;
DDRB.3=1;
DDRB.2=1;
DDRB.0=1;
DDRB.1=1;
DDRC.0=1;
DDRC.1=1;
DDRC=0X00;
DDRD.5=0;
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
PORTC.4=1;
PORTC.5=1;
TCCR1B=0x06; // 外部T1脚下降沿触发计数,普通模式
TCNT1=0x00; // T/C2初始化
TCCR2=0b00001111; // 内部时钟,128分频(16M/1024=15.625KHz),CTC模式
TCNT2=0x00;
OCR2=0x7C; // OCR2 = 0x7C(124),(124+1)/15.625=8ms
TIMSK=0x80; // 允许T/C2比较匹配中断
time0_old = 0;
#asm("sei")
k0=0;
k1=0;
k2=0;
k3=0;
while(1)
{ look:
time();
zhi=0;
if(w[i]==7||w[i]==8)
{
TCCR2=0b00001111;
fr=1;
}
else
{
TCCR2=0b00001110;
fr=0;
}
if(PINC.5==0)
{
for(q=0;q<100;q++)
{
delay_us(100);
}
if(PINC.5==0)
{
if(i!=8)
{
i++;
PORTD=p[i];
}
}
while(PINC.5==0)
{
}
}
if(PINC.4==0)
{
for(q=0;q<100;q++)
{
delay_us(100);
}
if(PINC.4==0)
{
if(i!=0)
{
i--;
PORTD=p[i];
z=i+1;
}
}
while(PINC.4==0)
{
}
}
if(PINC.3==0)
{
for(q=0;q<100;q++)
{
delay_us(100);
}
if(PINC.3==0)
{
if(tri==0)
{
tri=1;
}
else
{
tri=0;
}
}
while(PINC.3==0);
}
/* if(PINC.2==0)
{
for(q=0;q<100;q++)
{
delay_us(100);
}
if(PINC.2==0)
{
if(hold==0)
{
hold=1;
}
else
{
hold=0;
}
}
while(PINC.2==0);
} */
if(PINC.2==0)
{
for(q=0;q<100;q++)
{
delay_us(100);
}
while(PINC.2==0);
zhi=1;
while(1)
{
time();
if(PINC.2==0)
{
for(q=0;q<200;q++)
{
delay_us(100);
}
if(PINC.2==0)
{
while(PINC.2==0);
goto look;
}
}
if(PINC.5==0)
{
for(q=0;q<200;q++)
{
delay_us(100);
}
if(PINC.5==0)
{
if(kr!=8)
{
kr++;
k0=(e[kr]&0b00000001);
k1=((e[kr]>>1)&0b00000001);
k2=((e[kr]>>2)&0b00000001);
k3=((e[kr]>>3)&0b00000001);
}
}
while(PINC.5==0)
{
}
}
if(PINC.4==0)
{
for(q=0;q<200;q++)
{
delay_us(100);
}
if(PINC.4==0)
{
if(kr!=0)
{
kr--;
k0=(e[kr]&0b00000001);
k1=((e[kr]>>1)&0b00000001);
k2=((e[kr]>>2)&0b00000001);
k3=((e[kr]>>3)&0b00000001);
}
}
while(PINC.4==0)
{
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -