📄 pp.c
字号:
/*****************0XDFE4*****************************库定义*/
#include <iom8v.h>
#include <macros.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=100;
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=1;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 0;
}
return 1;
}
//**************************************************************比较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 0;
}
return 1;
}
//***************************************************************毫秒级延时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)
{
unsigned char i;
switch(RxGsmAddr)
{
case(0)://接收停止
{
RxGsmAddr=0;return;
}
case(1)://接收初始
{
if(!(PIND&0x04)&&(RxCalAddr==1))
{RxGsmAddr=2;RxUartWait=0;RxUartAddr=1;return;}
else return;
}
case(2)://接收是否完成
{
if(!(PIND&0x04)&&(RxCalAddr==1))
{
if(RxUartAddr) return;
if(CmpsRom(RxUartDbuf,RxUartLeng,"DD",2)) {RxGsmAddr=1;OutToneCount=4;return;}//DD
OutToneCount=2;
CopyRam(RxUartDbuf+2,RxUartLeng,writecaltemp,16);//写信息到卡
checktemp=0;
for(i=2;i<=11;i++){checktemp^=writecal1[i];}
for(i=0;i<16;i++){checktemp^=writecaltemp[i];}
RxGsmAddr=3;RxUartAddr=1;RxUartWait=20;
TxRomUart(writecal1,12);TxRamUart(writecaltemp,16);TxRamUart(&checktemp,1);
return;
}
else {RxGsmAddr=1;return;}
}
case(3)://判断写卡是否成功
{
if(RxUartAddr) return;
if(CmpsRom(RxUartDbuf,RxUartLeng,writecal1,2)) {RxCalAddr=1;RxGsmAddr=1;OutToneCount=4;TxRomUart("EEWriteERROR ",13);TxRomUart(" ",16);return;}
if(CmpsRom(RxUartDbuf+3,RxUartLeng,writecal1+3,1)) {RxCalAddr=1;RxGsmAddr=1;OutToneCount=4;TxRomUart("EEWriteERROR ",13);TxRomUart(" ",16);return;}
TxRomUart("EEWrite OK ",13);//EE
TxRomUart(" ",16);
RxGsmAddr=1;return;
}
}
}
//***************************************************************接收卡信息42//
void RxCal(void)
{
switch(RxCalAddr)
{
case(0)://检测停止
{
RxCalAddr=0;return;
}
case(1)://检测卡是否还在
{
if(!(PIND&0x04)) return;
TxRomUart("EE ",13);//GG
TxRomUart(" ",16);
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=0;TxRomUart(readcal1,13);TxRomUart(" ",16);
return;
}
case(3)://判断读卡是否成功
{
if(RxUartAddr) return;
if(CmpsRom(RxUartDbuf,RxUartLeng,readcal1,2)) {TxRomUart("EERead ERROR ",13);TxRomUart(" ",16);RxCalAddr=1;OutToneCount=4;return;}//EE
if(CmpsRom(RxUartDbuf+3,RxUartLeng,readcal1+3,1)) {TxRomUart("EERead ERROR ",13);TxRomUart(" ",16);RxCalAddr=1;OutToneCount=4;return;}//EE
CopyRam(RxUartDbuf+4,RxUartLeng,NameBuf,7);
CopyRam(RxUartDbuf+11,RxUartLeng,NumBuf,9);
TxRomUart("DD",2);//DD
TxRamUart(NameBuf,7);
//TxRomUart("CC",2);//CC
TxRamUart(NumBuf,9);
TxRomUart("Read OK ",11);//EE
RxCalAddr=4;OutToneCount=2;RxUartAddr=1;//接收处理
return;
}
case(4):
{
DisplayListChar(0, 0, Name,5);
DisplayListChar1(5, 0, NameBuf,7);
DisplayListChar(0, 1, Num,4);
DisplayListChar1(4, 1, NumBuf,9);
RxCalAddr=1;return;
}
}
}
//*********************************************调用分时任务//
void Time0(void)
{
while(TCNT0<(fosc/64/500));//毫秒
TCNT0=0;
RxCal();
RxGsm();//远程接收
}
//***************************************************主程序//
void main(void)
{
unsigned char i,j;
init_atmega();
delay_ms(400); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
delay_ms(10); //延时片刻
DisplayListChar(0, 0, table_1,12);
RxCalAddr=2;
RxGsmAddr=1;
OutLedAddr=1;
OutToneAddr=1;
while(1)
{
Time0();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -