📄 00145.c
字号:
//ICC-AVR application builder : 2009-3-21 15:58:12
// Target : M128
// Crystal: 16.000Mhz
#include <iom128v.h>
#include <macros.h>
#include <eeprom.h>
//设置那一块的函数
#define uchar unsigned char
#define uint unsigned int
#define CLK_CHU DDRD|=BIT(4)
//定义 clk pd4
#define CLK_0 PORTD&=~BIT(4)
#define CLK_1 PORTD|= BIT(4)
//数据方向可以不定义 但是要在总的系统初始化里定义好
//定义 data pd5
#define DATA PIND&=BIT(5) //数据输入值
#define DATA_0 PORTD&=~BIT(5) //数据输出值
#define DATA_1 PORTD|= BIT(5)
#define DATA_RU DDRD&=~BIT(5)
#define DATA_CHU DDRD|=BIT(5) //数据方向
#define xtal_8 8
#define xtal_16 16
uchar shezhi=0,shuzijia=0,shuzijian=0,queren=0,tuichu=0, port_tmp=0;
void delay_1ms(void) //1ms级延时函数
{
uchar i;
for(i=0;i<(uchar)(xtal_8*143-2);i++); // xtal8待整理
}
void delay_nms(uchar n) //n*1ms的延时函数
{
uchar i=0;
for(i=0;i<n;i++) //最大255ms
delay_1ms();
}
/**********************************************/
void delay_1us(void) //1us级延时函数
{
asm("nop");
}
void delay_nus(uchar n) //n*1us的延时函数
{
uchar i=0;
for(i=0;i<n;i++) //最大255us
delay_1us();
}
/********************************************************/
void shezhi0 ()
{
port_tmp = PINB;
while ((port_tmp&0x01)==0) //设置键的按下
{
delay_nms(200);
while ((port_tmp&0x01)==0)
{
shezhi=1; //设置键的标志置1
}
}
}
void shuzijia0 ()
{
port_tmp = PINB;
while ((port_tmp&0x02)==0) //数字加键的按下
{
delay_nms(200);
while ((port_tmp&0x02)==0)
{
shuzijia=1; //数字加的标志置1
}
}
}
void shuzijian0 ()
{
port_tmp = PINB;
while ((port_tmp&0x04)==0) //数字减的按下
{
delay_nms(200);
while ((port_tmp&0x04)==0)
{
shuzijian=1; //数字减的标志置1
}
}
}
void queren0 ()
{
port_tmp = PINB;
while ((port_tmp&0x20)==0) //确认键的按下
{
delay_nms(200);
while ((port_tmp&0x20)==0)
{
queren=1; //确认的标志置1
}
}
}
void tuichu0 ()
{
port_tmp = PINB;
while ((port_tmp&0x80)==0) //退出键的按下
{
delay_nms(200);
while ((port_tmp&0x80)==0)
{
tuichu=1; //退出的标志置1
shezhi=0;
tuichu=0;
}
}
}
//剩下3个键做备用
// ***********************************************************
// * 向 BC728X 发送一个字节 *
// ***********************************************************
void send_byte(uchar send_byte)
{
uchar ba;
DATA_RU;
do
{ // 产生clk 脉冲
CLK_0;
delay_nus(2);
CLK_1; //怎么是一个上升沿
//delay_nus(2);
} while (DATA); // 等待 BC728X 输出 dat 低电平响应
CLK_0; // 再次输出一 clk 脉冲
delay_nus(2);
CLK_1;
//delay_nus(2);
// while (!DATA);
// 等待 BC728X 进入接收状态
//再次输出一 clk 脉冲之后,DATA会变为高电位,(!DATA)为假
//while (!DATA)退出循环 进入下一级
for (ba=0;ba<8;ba++)
{ // 发送 8 个比特
if ((send_byte&0x80)==0)
{
DATA_CHU;
DATA_0; // 如果待发bit为0, 置 dat 为 0
delay_nus(3);
}
else
{
DATA_CHU;
DATA_1; // 反之置为 1
delay_nus(3);
}
send_byte=send_byte*2; // send_byte 左移一位
//其实就是send_byte最高位丢弃不要了
//剩下二进制是00000000
//重新进入下一位的检测与发送
CLK_0; // 输出一 clk 脉冲
delay_nus(2);
CLK_1;
delay_nus(8); // 短暂延时
}
DATA_1; // 恢复 dat 为高电平
delay_nus(8);
}
// **************************************************************
// 写入BC728X, 第一参数为目标寄存器地址, 第二参数为要写入的数据
// **************************************************************
void write728x(uchar reg_add, uchar write_data)
{
send_byte(reg_add); // 发送寄存器地址
send_byte(write_data); // 发送数据字节
}
/********************************************************/
/********************************************************/
/************************显示子函数**********************/
/********************************************************/
void shuzi_display(uchar shuzi)
{
uchar bf=0,baiwei=0,baiweisj=0,shiwei=0,shiweisj=0,gewei=0,geweisj=0;
CLK_CHU;
bf=shuzi;
//7281开机就开始上电复位了 之后自然不用复位
baiwei=shuzi/100;
//调用BC7281显示函数
baiweisj=(baiwei|0x30);
write728x(0x15, baiweisj);
shiwei=((shuzi%100)/10);
//调用BC7281显示函数
shiweisj=(shiwei|0x20);
write728x(0x15, shiweisj);
gewei =((shuzi%100)%10);
//调用BC7281显示函数
geweisj=(gewei|0x10);
write728x(0x15, geweisj);
}
/********************************************************/
/********************************************************/
/**********************0~255数字的选定*******************/
/********************************************************/
uchar shuzi_xuanze()
{
uchar shuzi=0; // 0~255
while (shuzijia==1) //数字加键确认
{
shuzi++;
if(shuzi>255) shuzi=0;//要显示
shuzi_display(shuzi);//调用bc7281程序
shuzijia=0 ;
}
while (shuzijian==1) //数字减键确认
{
shuzi--;
if(shuzi<0)shuzi=255;
//要显示
//可以调用bc7281程序
shuzi_display(shuzi);
shuzijian=0;
}
if(queren==1) return shuzi; //需要确认才能返回
queren=0;
}
/********************************************************/
/********************************************************/
/**********************项目选定子函数********************/
/********************************************************/
uchar xiangmuxuanding()
{
uchar xmzhi;
shuzi_xuanze();
xmzhi=shuzi_xuanze();
return xmzhi;
}
/********************************************************/
/********************************************************/
/**********************数值选定子函数********************/
/********************************************************/
uchar shuzhixuanding()
{
uchar shuzhi;
shuzi_xuanze();
shuzhi=shuzi_xuanze();
return shuzhi;
}
/***************写EEPROM子函数**********************************/
void W_EEP(uint add,uchar dat)
{
while(EECR&(1<<EEWE));
EEAR=add;
EEDR=dat;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
}
//****************读EEPROM子函数*******************
uchar R_EEP(uint add)
{
while(EECR&(1<<EEWE));
EEAR=add;
EECR|=(1<<EERE);
return EEDR;
}
/********************************************************/
/********************************************************/
/********************************************************/
/************************设置大函数**********************/
/********************************************************/
void shezhizong ()
{
while (shezhi==1)
{
CLI();
write728x(0x12,0x82);
// 初始化BC728x为164模式,不反相,BMS=1, KMS=0
/**********************调用项目选定函数****有返回值*****/
//xiangmuxuanding();
//add=xiangmuxuanding();
/********************调用数值选定函数****有返回值*******/
//shuzhixuanding();
//dat=shuzhixuanding();
// EEPROM的写函数(有2个形参)
//***************写EEPROM子函数*****************
W_EEP(xiangmuxuanding(),shuzhixuanding());
shezhi=0;//退出设置大函数
SEI(); //重新开启全局允许中断
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -