?? 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 + -