亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? main.c

?? AVRMega16單片機的項目
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**********************************************************************************************************
  								 陜 西 ?? 電 子 有 限 公 司
  Copyright (C), 2000-2008, LiFang Tech. Co., Ltd.
  File name:      // main.c
  Author:zhuxz		Version:v3.1	Date: 2008-8-29
  Description:    // 用于詳細說明此程序文件完成的主要功能,與其他模塊
                  // 或函數的接口,輸出值、取值范圍、含義及參數間的控
                  // 制、順序、獨立或依賴等關系
  Others:         // 其它內容的說明
	集成開發環境:ICCAVR6.31A	
  	主控芯片型號: ATMega16		
  	晶振頻率:	  外部 7.3728MHZ	
  	波特率: 	  9600
**********************************************************************************************************/

#include <macros.h>
#include <string.h>
#include <stdlib.h>
#include <iom16v.h>
#include "main.h"
#include "initial.h"


#define TW_MR_SLA_ACK   0x40
#define TW_MR_SLA_NACK  0x48
#define TW_MR_DATA_ACK  0x50
#define TW_MR_DATA_NACK 0x58
#define TW_MTR_ARB_LOST 0x38
#define TW_MT_DATA_NACK 0x30
#define TW_MT_DATA_ACK  0x28
#define TW_MT_SLA_NACK  0x20
#define TW_MT_SLA_ACK   0x18
#define TW_REP_START    0x10
#define TW_START        0x08

#define  RECVBUFFERLEN  14
//UART接收到PC緩沖區的長度
uchar UartRecvBuffer[RECVBUFFERLEN];
//UART接收緩沖區的索引
uchar UartRecvIndex = 0;
//接收PC傳來的UART完整一楨數據包標志
uchar  gbRecvPCFrameCmd  = 0;

//定義I2C總線的數據
//MCU I2C接收數據的緩存參數定義
uchar  I2cReceiveDataIndex = 0;
uchar  I2cReceiveDataLength= 0;
uchar  I2cReceiveData[16];
//MCU I2C發送數據的緩存參數定義
uchar  I2cSendData[16];
uchar  I2cSendDataIndex    = 0;
uchar  I2cSendDataLength   = 0;

//表明與I2C器件的通信狀態(成功:TRUE/失敗:FALSE)
uchar  gbi2cSendCmdStatus  = TRUE;
//MCU接收到I2C器件字節標志
uchar  gbi2cRecvByteStatus = FALSE;
//MCU發送出字節標志
uchar  gbi2cSendByteStatus = FALSE;

//Timer0溢出次數,用來控制刷卡時間
uint   gTmr0OvrCount     = 0;
//Timer2溢出次數,用來控制流水時間
uint   gTmr2OvrCount     = 0;

//鍵盤中斷標志
uchar  cKeyRiseEvent     = 0;


//FLASH地址操作的變量
uint  gnCurrentFlashPage = 0;	//當前操作的頁地址
uint  gnCurrentBytesBlock = 0;   //當前頁內的字節塊

uint  gnHistoryFlashPage = 0;	//歷史操作的頁地址
uint  gnHistoryBytesBlock = 0;   //歷史頁內的字節塊




void  SoftDelay(void)
{
     uint loop = 0;
	 
     for (loop = 0; loop <1000; loop++);     
}

/*******************************************************************************
**             串口發送字節子程序 
*******************************************************************************/ 
void Uart_Send(uchar senddata) 
{ 
    UDR = senddata;
	
    while(!(UCSRA & (1<<UDRE)));  //等待發送完
	
    UCSRA |= 0x40;                //清“發送完”標志位 
}


/******************************************************************************* 
**             SPI發送字節子程序 
*******************************************************************************/
void SPI_MasterTransmit(uchar cData)
{ 
	 /* 啟動數據傳輸 */
	 SPDR = cData;
	 /* 等待傳輸結束 */
	 while(!(SPSR & (1<<SPIF)));
}

//讀取某頁內字節地址的命令
uchar  SPI_ReadPageCtx(uint page/*0~4095*/, uint byteAddr/*0~263*/)
{
     uchar cData=0;
	 
	 CLRBIT(PORTB,4);
	 
     SPI_MasterTransmit(0x52); //CMD, 1st
     
	 cData = 0x1F & ((char)(page>>7));
	 SPI_MasterTransmit(cData);//Page Addr High,2nd
	 
	 cData = ((char)(page & 0x7F))<<1;
	 cData |= (char)((byteAddr & 0x1FF)>>8);
	 SPI_MasterTransmit(cData);//Page Addr low,3rd
	 
	 cData = (char)(byteAddr & 0xFF);
	 SPI_MasterTransmit(cData);//byte Addr High,4th
	 
	 //空命令,湊足剩余4字節
	 SPI_MasterTransmit(0);
	 SPI_MasterTransmit(0);
	 SPI_MasterTransmit(0);
	 SPI_MasterTransmit(0);
	 
	 /* 等待傳輸結束 */
	 while(!(SPSR & (1<<SPIF)));
	 cData = SPDR;
	 
	 SETBIT(PORTB,4);
	 return cData;
}

//寫入某頁內某字節地址的命令
void  SPI_WritePageCtx(uint page/*0~4095*/, uint byteAddr/*0~263*/, uchar cByte)
{
     uchar cData =0;
	 
	 CLRBIT(PORTB,4);
	 
	 //把數據寫入Buffer1
     SPI_MasterTransmit(0x84); //CMD, 1st
	 SPI_MasterTransmit(0);    //Not Care
	 
	 cData |= (char)((byteAddr & 0x100)>>8);
	 SPI_MasterTransmit(cData);//Byte Addr High,3rd
	 
	 cData = (char)(byteAddr & 0xFF);
	 SPI_MasterTransmit(cData);//Byte Addr High,4th
	 
	 //傳輸字節
	 SPI_MasterTransmit(cByte);//Byte Data
	 
	 SETBIT(PORTB,4);
}

//擦除FLASH芯片所有內容
char  EraseFlashCtx(void)
{
     uchar bResult = 1;
     uchar cData   = 0;
	 char  page     = 0;
	 
	 CLRBIT(PORTB,4);
	 
	 for (page =0; page<4096; page++)
	 {
	  	 SPI_MasterTransmit(0x58); //CMD, 1st
	 	 cData = 0x1F & ((char)(page>>7));
	 	 SPI_MasterTransmit(cData);//Page Addr High,2nd
	 	 
	 	 cData = ((char)(page>>7))<<1;
	 	 SPI_MasterTransmit(cData);//Page Addr low,3rd
     	 
	 	 SPI_MasterTransmit(0);    //not care	 
	 	 
	 	 //讀取狀態寄存器
	 	 SPI_MasterTransmit(0x57);
		 
		 /* 等待傳輸結束 */
	     while(!(SPSR & (1<<SPIF)));
	 	 cData = SPDR;
		 
	 	 cData  &= 0x40;
	 	 bResult &= (cData == 0);
	 }
	 
	 SETBIT(PORTB,4);
	 return  bResult;
}

//向FLASH中寫入已使用的總頁數和字節數,或下一個頁數和字節地址
void  WriteContextInfo(uint curpage/*當前頁地址*/, 
	  					uchar curBlockIndex/*當前頁內字節塊的索引號*/)
{
 	 //頁地址高字節和低字節(范圍:22..4095),20個字節的倍數(范圍:0..12)
     SPI_WritePageCtx(0, 0, (uchar)(curpage>>8));
	 SPI_WritePageCtx(0, 1, (uchar)(curpage&0xFF));
	 SPI_WritePageCtx(0, 2, curBlockIndex);
}

//確認當前消費記錄寫操作成功,完成寫入和讀出的記錄錢數要相等。
//成功:1, 失敗:0。
char  CommitPaidSuccess(uint curpage/*當前頁地址*/, 
	  	uchar curBlockIndex/*當前頁內字節塊的索引號*/, uchar *szBytes, uchar num)
{
 	  char  cByteNum = 0;
	  uchar CmpData[20];
	  
	  //先寫入當前的記錄
	  for (cByteNum = 0; cByteNum<20; cByteNum++)
	  {
	   	  	SPI_WritePageCtx(curpage, curBlockIndex*20+cByteNum, *szBytes++);
	  }
	  
	  //再讀出當前消費記錄
	  for (cByteNum = 0; cByteNum<20; cByteNum++)
	  {
	   	  	CmpData[cByteNum] = SPI_ReadPageCtx(curpage, curBlockIndex*20+cByteNum);
	  }
	  
	  cByteNum = memcmp((void *)szBytes, (void *)CmpData, 20);
	  
 	  return cByteNum == 0;
}

//讀出前次消費記錄的待寫FLASH頁地址和頁內字節地址。
void  GetHistoryPageAndBytesAddr(uint *oldpage, uint *oldByteAddr)
{
      uchar  cData = 0;
      
 	  *oldpage = SPI_ReadPageCtx(0, 0);
	  cData = SPI_ReadPageCtx(0, 1);
	  
	  *oldpage     = *oldpage*256;
	  *oldpage     += cData;
	  
	  *oldByteAddr = SPI_ReadPageCtx(0, 2);
}

//計算出下次消費記錄的待寫FLASH頁地址和頁內字節地址。
//注意忽略每頁的后4個字節,只考慮使用前260個字節,每條記錄20個字節。
void  CalcNextPageAndBytesAddr(uint oldpage, uint oldByteAddr, uint *newPage, 
	  							uint *newByteAddr)
{
 	  *newByteAddr = oldByteAddr +1;
      *newPage     = oldpage;
	  
	  if (*newByteAddr > 12) //換頁時
	  {
	   	 *newPage  = oldpage + 1;
		 *newByteAddr = 0;
	  }
}







/******************************************************************************* 
**            與I2C通信的子程序 
*******************************************************************************/
void i2cSendByte(uchar data) 
{ 
   	// 裝載數據到 TWDR 
   	TWDR=data; 
   	// 發送開始 
   	TWCR = (TWCR&0x0F)|(1<<TWINT); 
}

// 發送開始信號
void i2cSendStart(void) 
{   
 	TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWSTA); 
}

// 發送停止信號
void i2cSendStop(void) 
{ 
    TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); 
}

// 產生應答信號否
void i2cAckSignal(uchar ackFlag) 
{ 
   if( ackFlag )
       TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWEA); 
   else
       TWCR = (TWCR&0x0F)|(1<<TWINT);
}

//向I2C器件發送字符串
void I2C_SendInfo(uchar wsla, uchar suba, uchar *szBuff, uchar num)
{
     I2cSendData[0] = wsla;
	 I2cSendData[1] = suba;
	 if (num > 0)
	 memcpy((void *)&I2cSendData[2], (void *)szBuff, num);
	 
     I2cSendDataLength = num+1;
     I2cSendDataIndex  = 0;	 //從從地址開始計算
     
	 //啟動I2C傳送
	 i2cSendStart();
}

//向I2C器件發送字符串
void I2C_RecvInfo(uchar wsla, uchar suba, uchar *szBuff, uchar num)
{
     I2cSendData[0] = wsla;
	 I2cSendData[1] = suba;
	 
	 //接收功能的變量
     I2cReceiveDataLength = num;
     I2cReceiveDataIndex  = 0;	 //從0開始計算
	 
	 //發送命令的變量
     I2cSendDataIndex     = 0;   //專為子地址才有此代碼
	 I2cSendDataLength    = 1;	 
	 gbi2cSendByteStatus  = FALSE;
	 
	 //先啟動I2C傳送寫從地址和子地址
	 i2cSendStart();
	 
	 //再重啟I2C傳送,僅寫從地址
	 while(!gbi2cSendByteStatus); //等到已發送子地址后,可以接收數據
	 
	 I2cSendData[0] = wsla+1;
	 i2cSendStart();
}

//向ZLG7290發送單個字節
void Zlg7290_SendChar(uchar SegNo, uchar cByte)
{
     I2C_SendInfo(WriteZlg7290Addr, DPRAM0+SegNo, &cByte, 1);
}

//從ZLG7290讀取單個字節
uchar Zlg7290_ReadKey(void)
{
     gbi2cRecvByteStatus = FALSE;
	 
     //需從鍵值寄存器讀取哪個鍵被按下
     I2C_RecvInfo(WriteZlg7290Addr, 0x01, 0, 1);
	 
	 //等到接收到回應
	 while (!gbi2cRecvByteStatus && I2cReceiveDataIndex < 1);
	 
	 return I2cReceiveData[0];
}

//向M41T0發送多個字節,此處為時間(格式為:秒-分-小時-星期-日-月-年-控制字)
void M41T0_SendInfo(uchar *szData, uchar num)
{ 
     I2C_SendInfo(WriteM41T0Addr, 0/*從秒開始*/, szData, num);
}

//從M41T0讀取多個字節,此處為時間(格式為:秒-分-小時-星期-日-月-年-控制字)
void M41T0_ReadInfo(uchar *szData, uchar num)
{
     if (num != 8)
	   return;
     
     gbi2cRecvByteStatus = FALSE;
	 
     //需從寄存器讀取時間
     I2C_RecvInfo(WriteM41T0Addr, 0x0/*從秒開始*/, 0/*忽略*/, 8);
	 
	 //等到接收到回應
	 while (!gbi2cRecvByteStatus && I2cReceiveDataIndex < 8);
	 
	 memcpy((void *)szData, (void *)I2cReceiveData, num);     
}









/**********************************************************************

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区四区在线观看| 日韩影视精彩在线| 亚洲综合一区二区| 激情六月婷婷久久| 欧美区一区二区三区| 日韩精品一区二区三区视频| 国产三级精品视频| 日韩av成人高清| 99re热视频这里只精品| 亚洲三级电影网站| 国产精品一区二区不卡| 在线观看日韩高清av| 欧美极品xxx| 极品少妇xxxx精品少妇| 色天天综合久久久久综合片| 国产日韩高清在线| 久久精品国内一区二区三区| 色999日韩国产欧美一区二区| 欧美激情一区二区在线| 久久99久久99| 精品久久人人做人人爽| 舔着乳尖日韩一区| 欧美日韩一区三区四区| 偷拍亚洲欧洲综合| 亚洲国产精品久久人人爱| 成人久久视频在线观看| 中文字幕乱码亚洲精品一区| 狠狠狠色丁香婷婷综合激情 | 国产午夜亚洲精品羞羞网站| 国产精品综合网| 高清成人免费视频| 久久免费视频一区| 欧美一二三在线| 日韩精品乱码av一区二区| 91精品国产综合久久香蕉的特点| 在线亚洲一区二区| 一区二区成人在线视频| 在线精品视频小说1| 一区二区三区高清在线| 色综合久久九月婷婷色综合| 亚洲精品国产品国语在线app| 91免费观看在线| 亚洲一区二区三区视频在线| 欧美综合一区二区三区| 亚洲一区二区精品视频| 91精品国产一区二区三区| 日韩国产一区二| 精品久久人人做人人爰| 国产成人综合亚洲91猫咪| 国产精品色在线观看| 91小视频免费观看| 亚洲成人先锋电影| 日韩美女在线视频| 国产91综合网| 亚洲一区在线电影| 日韩视频不卡中文| 国产99久久久久久免费看农村| 亚洲欧洲精品一区二区三区| 色婷婷香蕉在线一区二区| 午夜久久久久久久久| 日韩精品一区二区三区蜜臀| 国产成人av一区二区三区在线观看| 欧美国产一区二区在线观看| 91美女在线观看| 日本不卡的三区四区五区| 国产亚洲一本大道中文在线| 91免费小视频| 麻豆成人久久精品二区三区小说| 国产人成亚洲第一网站在线播放| 在线欧美日韩精品| 韩国欧美一区二区| 一区二区免费视频| 久久久久久亚洲综合| 欧洲人成人精品| 国产精品资源网| 图片区日韩欧美亚洲| 国产欧美日韩在线视频| 欧美日韩在线综合| 国产精品伊人色| 天堂久久一区二区三区| 中文字幕第一区| 91麻豆精品国产91久久久资源速度 | 成人精品国产一区二区4080| 一区二区成人在线| 国产目拍亚洲精品99久久精品| 在线视频观看一区| 成人在线视频一区二区| 美女久久久精品| 亚洲一区在线观看网站| 国产精品国产三级国产| 精品国产乱子伦一区| 欧美日韩亚洲国产综合| gogo大胆日本视频一区| 精品一区二区在线看| 午夜国产不卡在线观看视频| 中文字幕在线一区免费| 久久久久久免费| 欧美电影免费观看高清完整版在线观看| 91毛片在线观看| 不卡高清视频专区| 国产ts人妖一区二区| 久久99精品国产.久久久久久| 亚洲国产精品视频| 亚洲图片欧美激情| 最新日韩在线视频| 国产精品久久精品日日| 国产亚洲精品7777| 久久久综合视频| www国产精品av| 精品日韩在线观看| 精品处破学生在线二十三| 欧美日韩一区二区在线观看| 一本色道久久加勒比精品| av电影在线观看完整版一区二区| 高清成人免费视频| 欧美一级二级在线观看| 欧美一区欧美二区| 日韩一二三区视频| 日韩精品一区二区在线观看| 日韩午夜在线观看| 精品国产免费视频| 久久久久国产精品麻豆| 久久久久9999亚洲精品| 国产欧美日韩卡一| 国产精品久久国产精麻豆99网站| 国产欧美一区二区三区鸳鸯浴| 久久精品日产第一区二区三区高清版 | 成人丝袜高跟foot| 99精品视频中文字幕| 一本一本大道香蕉久在线精品| 色婷婷亚洲精品| 欧美日本一区二区三区四区| 日韩欧美一级二级| 久久天天做天天爱综合色| 中文字幕成人在线观看| 一区二区中文字幕在线| 亚洲综合无码一区二区| 日韩国产精品91| 国产一区在线不卡| 成人黄页在线观看| 在线精品视频一区二区| 日韩视频免费观看高清完整版| 日韩色在线观看| 国产精品高清亚洲| 一区二区三区视频在线观看| 午夜视频在线观看一区| 国模大尺度一区二区三区| 成人精品小蝌蚪| 欧美日本一道本在线视频| 精品福利在线导航| 亚洲人成伊人成综合网小说| 午夜电影网一区| 成人午夜av电影| 欧美人动与zoxxxx乱| 国产亚洲污的网站| 亚洲国产精品一区二区久久 | 成人午夜视频福利| 欧美日韩一卡二卡三卡| 日韩欧美亚洲国产精品字幕久久久 | 椎名由奈av一区二区三区| 亚洲h在线观看| 国产91丝袜在线播放| 欧美日韩久久不卡| 国产精品美女久久久久aⅴ| 日韩av二区在线播放| 色哟哟国产精品免费观看| 日韩精品一区二区三区视频| 一区二区高清在线| 成人av午夜电影| 精品少妇一区二区三区在线播放| 国产真实乱子伦精品视频| 色婷婷久久99综合精品jk白丝| 欧美va亚洲va| 婷婷国产在线综合| 色婷婷亚洲精品| 中文一区在线播放| 国产在线播放一区三区四| 欧美精品久久99| 一区二区在线观看免费 | 国产精品网曝门| 激情深爱一区二区| 7777精品伊人久久久大香线蕉经典版下载| 中文字幕欧美三区| 久久99国产精品免费| 3atv一区二区三区| 亚洲国产精品久久不卡毛片 | 日本高清成人免费播放| 国产午夜精品福利| 国产一区二区网址| 精品少妇一区二区三区日产乱码| 亚洲成av人片一区二区三区| 成人av午夜影院| 最新日韩在线视频| 成人av资源在线| 日本一区二区成人| 成人av动漫在线| 中文字幕字幕中文在线中不卡视频| 粉嫩av亚洲一区二区图片| 国产欧美一区二区精品秋霞影院| 久久精品国产精品青草|