?? pp.c.bak
字號:
/*****************0XDFE4*****************************庫定義*/
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#include "define.h"
//*******************************************************************寫數據11//
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
PORTB = WDLCM;
SET_LCD_RS;CLR_LCD_RW;SET_LCD_RS;CLR_LCD_RW;
CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
SET_LCD_E;SET_LCD_E;
}
//********************************************************************寫指令12//
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC) ReadStatusLCM(); //根據需要檢測忙
PORTB = WCLCM;
CLR_LCD_RS;CLR_LCD_RW;
CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
SET_LCD_E;SET_LCD_E;
}
//*******************************************************************讀狀態13//
unsigned char ReadStatusLCM(void)
{
DDRB=0x00; //輸入
CLR_LCD_RS;SET_LCD_RW;
CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;CLR_LCD_E;
SET_LCD_E;SET_LCD_E;
while (PINB&0x80); //檢測忙信號
DDRB=0xff;//變回輸出
return(PINB);
}
//*************************************************************顯示一個字符14//
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1; X &= 0xF;
if (Y) X |= 0x40;
X |= 0x80;
WriteCommandLCM(X, 1);
WriteDataLCM(DData);
WriteCommandLCM(X, 1);
}
//************************************************************顯示ROM字符串15//
void DisplayListChar(unsigned char X, unsigned char Y, const unsigned char *DData,unsigned char Leng)
{
unsigned char j;
Y &= 0x01;X &= 0x0F;
for(j=0;j<Leng;X++,j++)
{
if(X<=0xf)DisplayOneChar(X,Y,DData[j]);
}
}
//************************************************************顯示RAM字符串16//
void DisplayListChar1(unsigned char X, unsigned char Y, unsigned char *DData,unsigned char Leng)
{
unsigned char j;
Y &= 0x01;X &= 0x0F;
for(j=0;j<Leng;X++,j++)
{
if(X<=0xf)DisplayOneChar(X,Y,DData[j]);
}
}
//****************************************************************LCM初始化17//
void LCMInit(void)
{
PORTB = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
delay_ms(5);
WriteCommandLCM(0x38,0);
delay_ms(5);
WriteCommandLCM(0x38,0);
delay_ms(5);
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(0x0C,1); // 顯示開及光標設置
}
//***************************************************中斷任務//
//*************************************************************接收串口數據21//
void RxUart(void)
{
switch(RxUartAddr)
{
case(0)://接收關閉
{
RxUartTemp=UDR;RxUartAddr=0;return;
}
case(1)://接收初始
{
RxUartLeng=0;RxUartDely=200;RxUartAddr=2;return;
}
case(2)://接收處理
{
if((UCSRA)&(1<<RXC))
{
RxUartTemp=UDR;RxUartWait=2;RxUartDely=200;
if(RxUartLeng>=250) return;
RxUartDbuf[RxUartLeng++]=RxUartTemp;
return;
}
else
{
if(!RxUartWait) return;
if(--RxUartDely) return;
RxUartDely=200;
if(--RxUartWait) return;
RxUartAddr=0;return;
}
}
}
}
//***************************************************************輸出三色燈22//
void OutLed(void)
{
switch(OutLedAddr)
{
case(0)://停止閃爍
{
OutLedAddr=0;return;
}
case(1)://綠燈閃
{
if(++OutLedDely<1000) return;
OutLedDely=0;PORTC|=0x08;PORTC^=0x06;return;
}
case(2)://紅燈閃
{
if(++OutLedDely<1000) return;
OutLedDely=0;PORTC|=0x06;PORTC^=0x08;return;
}
case(3)://關燈
{OutLedDely=0;PORTC|=0x0C;return;}
}
}
//***************************************************************輸出提示聲23//
void OutTone(void)
{
switch(OutToneAddr)
{
case(0):
{
OutToneAddr=0;return;
}
case(1):
{
if(!OutToneCount) return;
OutToneDely=0;OutToneAddr=2;return;
}
case(2):
{
if(++OutToneDely<400) return;
if(!(--OutToneCount)) {PORTC|=0x01;OutToneCount=0;OutToneAddr=0;return;}
OutToneDely=0;PORTC^=0x01;return;
}
}
}
#pragma interrupt_handler Time2:iv_TIMER2_COMP
//****************************************************************調用中斷任務//
void Time2(void)
{
RxUart();
OutLed();
OutTone();
}
//****************************************************單時任務//
//********************************************************發送ROM數據到串口31//
void TxRomUart(const unsigned char *data,unsigned int leng)
{
while(leng)
{
while(!((UCSRA)&(1<<UDRE)));
UDR=*data;data++;leng--;
}
}
//********************************************************發送RAM數據到串口32//
void TxRamUart(unsigned char *data,unsigned int leng)
{
while(leng)
{
while(!((UCSRA)&(1<<UDRE)));
UDR=*data;data++;leng--;
}
}
//**************************************************************拷貝ROM數據33//
unsigned char CopyRom(const unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
{
while(leng1)
{
*data2=*data1;data2++;leng2--;data1++;leng1--;
if(!leng2) return 1;
}
return 0;
}
//**************************************************************拷貝RAM數據34//
unsigned char CopyRam(unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
{
while(leng1)
{
*data2=*data1;data2++;leng2--;data1++;leng1--;
if(!leng2) return 1;
}
return 0;
}
//**************************************************************比較ROM數據35//
unsigned char CmpsRom(unsigned char *data1,unsigned char leng1,const unsigned char *data2,unsigned char leng2)
{
while(leng1)
{
if(*data1!=*data2) return 1;
data1++;data2++;leng1--;leng2--;
if(!leng2) return 1;
}
return 0;
}
//**************************************************************比較RAM數據36//
unsigned char CmpsRam(unsigned char *data1,unsigned char leng1,unsigned char *data2,unsigned char leng2)
{
while(leng1)
{
if(*data1!=*data2) return 1;
data1++;data2++;leng1--;leng2--;
if(!leng2) return 1;
}
return 0;
}
//***************************************************************毫秒級延時37//
void delay_ms(unsigned int time)
{
while(time)
{
while(TCNT0<(fosc/64/1000));
TCNT0=0;
time--;
}
}
//************************************************************ATMEGA8初始化38//
void init_atmega(void)
{
SFIOR&=(~(1<<PUD));//上拉SFIOR
DDRB=0xFF;
DDRD=0xF8;//,PD7(E),PD6(RW),PD5(RS),PD4(SPS),PD2(ICC),PD1(TXD),PD0(RXD);
PORTD=0xFB;
DDRC=0x0F;//PC4,PC3(REN),PC2(GREEN),PC0(BUZZER)
PORTC=0x01;
UCSRB=(1<<RXEN)|(1<<TXEN);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH=(fosc/16/(baud+1))/256;
UBRRL=(fosc/16/(baud+1))%256;
TCCR2=0x0a;
TCNT2=0x00;
OCR2=fosc/8/2000;//500us
TIMSK=1<<OCIE2;
TCCR0=(1<<CS01)|(1<<CS00);//64分頻
TCNT0=0;
SEI();
}
//*****************************************************************接收遠程41//
void RxGsm(void)
{
switch(RxGsmAddr)
{
case(0)://接收停止
{
RxGsmAddr=0;return;
}
case(1)://接收初始
{
RxUartAddr=1;RxGsmAddr=2;return;
}
case(2)://接收是否完成
{
if(RxUartAddr) return;
if(CmpsRom(RxUartDbuf,RxUartLeng,"AA",2)) {RxGsmAddr=1;return;}
RxGsmAddr=0;return;
}
}
}
//***************************************************************接收卡信息42//
void RxCal(void)
{
switch(RxCalAddr)
{
case(0)://檢測停止
{
RxCalAddr=0;return;
}
case(1)://檢測是否有卡
{
if(!(PIND&0x04)) return;
WriteCommandLCM(0x01,1); //顯示清屏
DisplayListChar(0, 0, table_1,12);
RxCalAddr=2;RxCalDely=0;return;
}
case(2)://檢測100ms去抖動讀卡
{
if(PIND&0x04) RxCalDely=0;
if(++RxCalDely<100) {OutLedAddr=1;return;}
RxCalAddr=3;RxUartAddr=1;OutLedAddr=2;RxUartWait=20;TxRomUart(readcal1,13);return;
}
case(3)://判斷讀卡是否成功
{
if(RxUartAddr) return;
/*RxUartDbuf[0]=0x31;
RxUartDbuf[1]=0x32;
RxUartDbuf[2]=0x33;
RxUartDbuf[3]=0x34;*/
TxRamUart(RxUartDbuf,RxUartLeng);
if(CmpsRom(RxUartDbuf,RxUartLeng,readcal1,2)) {RxGsmAddr=1;OutToneCount=4;RxCalAddr=1;return;}
//if(CmpsRom(RxUartDbuf+3,RxUartLeng,readcal1+3,1)) {RxGsmAddr=1;OutToneCount=4;RxCalAddr=1;return;}
//RxUartAddr=1;RxUartWait=0;
//if(!RxUartLeng) return;
//TxRomUart(RxUartDbuf,RxUartLeng);
/*CopyRam(RxUartDbuf+4,RxUartLeng,NameBuf,11);
CopyRam(RxUartDbuf+15,RxUartLeng,NameBuf,12); */
RxCalAddr=1;OutToneCount=2;RxUartAddr=1;//接收處理
return;
}
case(4):
{
/*DisplayListChar(0, 0, Name);
DisplayListChar1(5, 0, NameBuf);
DisplayListChar(0, 1, Num);
DisplayListChar1(4, 1, NumBuf);*/
RxCalAddr=1;return;
}
}
}
//*********************************************調用分時任務//
void Time0(void)
{
while(TCNT0<(fosc/64/500));//毫秒
TCNT0=0;
//ScanKey();
//RxGsm();//遠程接收
RxCal();
}
//***************************************************主程序//
void main(void)
{
init_atmega();
delay_ms(400); //啟動等待,等LCM講入工作狀態
//LCMInit(); //LCM初始化
//delay_ms(10); //延時片刻
//TxRomUart("jkkfda",6);
//DisplayListChar(0, 0, table_1,12);
RxCalAddr=2;
OutLedAddr=1;
//delay_ms(5);
//DisplayListChar(0, 1, table_2);
/*
delay_ms(400); //啟動等待,等LCM進入工作狀態
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(0x0f,1); // 顯示開及光標設置,閃
for(i=0;i<8;i++)
{
DisplayOneChar(i, 0, table_1[i]); //顯示單個字符
}
//WriteCommandLCM(0x07,1); // 顯示光標移動設置
for(i=0;i<8;i++)
{
DisplayOneChar(i+8, 0, table_2[i]); //顯示單個字符
}
WriteCommandLCM(0x0c,1); // 顯示開及光標設置,不閃
//ReadDataLCM();//測試用句無意義*/
while(1)
{
Time0();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -