📄 frequence.c
字号:
//ICC-AVR application builder : 2007-11-21 10:43:58
// Target : M16
// Crystal: 1.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define OUTPT PORTA //根据连接的端口,设置PORTA
#define OUTDR DDRA //根据连接的端口,设置DDRA
#define CS 0
#define CLK 1
#define DIO 2
#define KEY 3
#define Delay 2
#define LongDelay 10
//用于延时周期数
//Pure Command 纯指令,不带返回值
#define Reset 0xA4
#define Test 0xBF
#define LeftShift 0xA1
#define RightShift 0xA0
#define LeftCycle 0xA3
#define RightCycle 0xA2
//Command with parameter 带参数的指令
#define DispMethod0 0x80
#define DispMethod0Data 0x00
//上面为使用方式0显示数据,
//DispMethod0数值为 10000 a2 a1 a0,其中a2 a1 a0为显示位0-7地址
//DispMethod0Data为DP X X X d3 d2 d1 d0 ,其中DP为小数点
//d3 d2 d1 d0 为 0~9 - E H L P (空)的顺序编码
#define DispMethod1 0xC8
#define DispMethod1Data 0x00
//上面为使用方式1显示数据,
//DispMethod1数值为 11001 a2 a1 a0,其中a2 a1 a0为显示位0-7地址
//DispMethod1Data为DP X X X d3 d2 d1 d0 ,其中DP为小数点
//d3 d2 d1 d0 为 0~9 A~F 的顺序编码
#define BlinkControl 0x88
#define BlinkBit 0x00
//BlinkBit为d8 d7 d6 d5 d4 d3 d2 d1对应位 其中 0代表闪烁 1不闪烁
#define DisappearControl 0x98
#define DisappearBit 0x00
//DisappearBit为d8 d7 d6 d5 d4 d3 d2 d1对应位 其中1代表显示 0消隐
//消隐不能把所有的位都消隐
#define ReadKeyboard 0x15
#define ReadASCII
//ReadASCII为读出的键盘值,从0~3FH 没有键盘按下时为0xFF
//当ZLG7289A 检测到有效的按键时,KEY 引脚从高电平变为低电平并一直保持
//到按键结束。在此期间如果ZLG7289A 接收到“读键盘数据指令”则输出当前
//按键的键盘代码,没有有效按键输出FFH (11111111B)
unsigned char frequence=0;//用于记录频率
unsigned char save=0;//用于存数
void SetB(unsigned char k)
{//这里的PORTB根据自己的程序修改
OUTPT|=(1<<k);
}
void ClrB(unsigned char l)
{//这里的PORTB根据自己的程序修改
OUTPT&=~(1<<l);
}
void WriteOne7289(unsigned char Cmd)
{//写入一个字节,可以是单字节命令
unsigned char i=0;//用于移了几位
unsigned char j=0;//用于延时
SetB(CS);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
OUTDR|=0x0f;
ClrB(CS);
j=LongDelay;
while(j--);
for(i=0;i<8;i++)
{
if(0x80&Cmd)
{
SetB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
else
{
ClrB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
Cmd<<=1;
}
SetB(CS);
}
void WriteTwo7289(unsigned char Cmd,unsigned char Data)
{//写入一个带参数的命令
unsigned char i=0;//用于移了几位
unsigned char j=0;//用于延时
SetB(CS);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
OUTDR|=0x0f;
ClrB(CS);
j=LongDelay;
while(j--);
for(i=0;i<8;i++)
{//发送命令
if(0x80&Cmd)
{
SetB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
else
{
ClrB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
Cmd<<=1;
}//发送命令
for(i=0;i<8;i++)
{//发送参数
if(0x80&Data)
{
SetB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
else
{
ClrB(DIO);
j=Delay;
while(j--);
SetB(CLK);
j=Delay;
while(j--);
ClrB(CLK);
j=Delay;
while(j--);
}
Data<<=1;
}//发送参数
SetB(CS);
}
void DispChar(unsigned char Addr,unsigned char num)
{//地址Addr为数码管某一位,数值0-7
//用于在指定位置显示数据,当num为0~9时,显示同数字
//当num为10~15时,显示A~F,当num为16~21时,显示 - E H L P (空)
//当num为50~59时,显示0.~9.,当num为60~65时,显示A.~F.
if(num>=0&&num<16)//显示16进制数
{
WriteTwo7289(DispMethod1+Addr,num);
}
if(num>=50&&num<66)//显示带小数点的16进制数
{
WriteTwo7289(DispMethod1+Addr,0x80+num);
}
if(num>=16&&num<22)//显示特殊符号
{
WriteTwo7289(DispMethod0+Addr,num-6);
}
}
//TIMER0 initialize - prescale:Falling edge
//用于记录外部引脚的变化
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x00 /*INVALID SETTING*/; //set count
TCCR0 = 0x06; //启动计数器,记录低脉冲个数
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1000Hz
//用于产生1KHz的中断
void timer1_init(void)
{
TCCR1B = 0x00; //计时停止
TCNT1H = 0xFC; //设置计数次数64536
TCNT1L = 0x18;
TCCR1A = 0x00;
TCCR1B = 0x01; //启动定时器
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFC; //reload counter high value
TCNT1L = 0x18; //reload counter low value
TCCR0=0x00;
frequence=TCNT0;//读入脉冲个数
TCNT0=0;
TCCR0=0x06;//启动计数器,低电平记录
DispChar(1,frequence/10);
DispChar(0,frequence%10);
}
//初始化所有设备
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
timer0_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources TOIE1 T/C1的溢出中断程序
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
init_devices();
while(1);
//insert your functional code here...
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -