📄 driver.c
字号:
#include <iom128v.h>
#include <macros.h>
#include "define.h"
#include "define_variable.h"
#include "driver.h"
//*******************************************************************************************
//驱动程序,包括:45DB041读写操作、读写内部eeprom的驱动、液晶的驱动、无线接收的驱动、
//串口驱动、键盘扫描、字库读取、常用的子程序、MCU上电初始化、100us定时器中断
//eeprom空间分配:本机号码-0-16 存放是否取消按键音-17
//通话纪录:51-250 共存10条通话纪录,每条20个字节
//短信息:251-3250 共存15条短信息,每条200个字节
//*******************************************************************************************
//*******************************一些常用的子程序*********************************************//
//******************************************************
//看门狗喂狗子程序
//******************************************************
void CLEAR_WATCHDOG(void)
{
if((currency_flag&RESET_PROGRAME_CURRENCY_F) == 0)
{
if( PORTB&WDI )
{
PORTB &=~WDI; //如果是高电位,则翻转为低电位
}
else
{
PORTB |=WDI; //如果是低电位,则翻转为高电位
}
}
}
//******************************************************
//将ASCII字符转换为16进制的数
//for example:input_h=0x31,input_l=0x32,the result=12
//******************************************************
unsigned char ASCIITOHEX( unsigned char input_h,unsigned char input_l )
{
if(( input_h>0x40 )&&(input_h<0x47))
{
input_h=input_h-0x37;
}
else if(( input_h>0x60 )&&(input_h<0x67))
{
input_h=input_h-0x57;
}
else
{
input_h=input_h-0x30;
}
if(( input_l>0x40 )&&(input_l<0x47))
{
input_l=input_l-0x37;
}
else if(( input_l>0x60 )&&(input_l<0x67))
{
input_l=input_l-0x57;
}
else
{
input_l=input_l-0x30;
}
return( input_h*16+input_l );
}
//********************************************************
//将一个数转换ASCII数值
//example:数值1 to 0x31
//********************************************************
unsigned char ASCII(unsigned char input)
{
if(input > 9)
{
return(input + 0x37);
}
else
{
return(input + 0x30);
}
}
//********************************************************
//延时子程序
//FUNCTION:100us延时
//********************************************************
void DELAY_TIME(unsigned int count)
{
unsigned int i;
for(i=0;i<count;i++)
{
}
//while(time < count)
//{
//CLEAR_WATCHDOG();
//}
}
//********************************************************
//将8个数写入single8[8]中
//********************************************************
void ADD_NUMBER_TO_SINGLE(unsigned char num_0,unsigned char num_1,unsigned char num_2,unsigned char num_3,unsigned char num_4,unsigned char num_5,unsigned char num_6,unsigned char num_7)
{
single8[0]=num_0;
single8[1]=num_1;
single8[2]=num_2;
single8[3]=num_3;
single8[4]=num_4;
single8[5]=num_5;
single8[6]=num_6;
single8[7]=num_7;
}
//******************************对内部EEPROM的操作************************************//
//********************************************************
//向AVR单片机内部EEPROM中指定位置写入数据
//********************************************************
void EEPROM_WRITE(unsigned int address, unsigned char data)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE));
/* 设置地址和数据寄存器 */
EEAR = address;
EEDR = data;
/* 置位EEMWE */
EECR |= (1<<EEMWE);
/* 置位EEWE 以启动写操作E */
EECR |= (1<<EEWE);
}
//********************************************************
//读出AVR单片机内部EEPROM中指定位置的数据
//********************************************************
unsigned char EEPROM_READ(unsigned int address)
{
/* 等待上一次写操作结束 */
while(EECR & (1<<EEWE));
/* 设置地址寄存器 */
EEAR = address;
/* 设置EERE 以启动读操作 */
EECR |= (1<<EERE);
/* 自数据寄存器返回数据 */
return EEDR;
}
//**************************对外部串行EEPROM-45DB041的读写驱动****************************************//
//*******************************************
//初始化SPI
//*******************************************
void SPI_INITIALIZE(void)
{
/* 设置MOSI和SCK为输出,其他为输入 */
//DDRB = (1<<DDB2)|(1<<DDB1);
/* 使能SPI为主机模式,设置时钟为fck/16,SPI工作模式选择为模式3 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0);
SEND_COM1_AT((const unsigned char *)SPI_INIT_RUN,sizeof(SPI_INIT_RUN) );
}
//********************************************
//向外部EEPROM送一个字节数据
//********************************************
void SPI_TRANSBYTE(unsigned char data)
{
/* 启动数据传输 */
SPDR = data;
/* 等待传输结束 */
while(!(SPSR & (1<<SPIF)));
}
//********************************************************
//读主存储区一个页的数据到buffer1
//********************************************************
void READ_ONE_PAGE_TO_BUFFER1(unsigned int pageaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x53);
SPI_TRANSBYTE((char)(pageaddress>>7));
SPI_TRANSBYTE((char)(pageaddress<<1));
SPI_TRANSBYTE(0x00);
PORTE |=0x80;
}
//********************************************************
//读主存储区一个页的数据到buffer2
//********************************************************
void READ_ONE_PAGE_TO_BUFFER2(unsigned int pageaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x55);
SPI_TRANSBYTE((char)(pageaddress>>7));
SPI_TRANSBYTE((char)(pageaddress<<1));
SPI_TRANSBYTE(0x00);
PORTE |=0x80;
}
//********************************************************
//在buffer1中的一个指定地址读一个字节的数据
//********************************************************
unsigned char READ_BYTE_FROM_BUFFER1(unsigned int byteaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x54);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE((char)(byteaddress>>8));
SPI_TRANSBYTE((char)byteaddress);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE(0xFF);
PORTE |=0x80;
return SPDR;
}
//********************************************************
//在buffer2中的一个指定地址读一个字节的数据
//********************************************************
unsigned char READ_BYTE_FROM_BUFFER2(unsigned int byteaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x56);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE((char)(byteaddress>>8));
SPI_TRANSBYTE((char)byteaddress);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE(0xFF);
PORTE |=0x80;
return SPDR;
}
//********************************************************
//在buffer1中的一个指定的地址写一个字节
//********************************************************
void WRITE_ONE_BYTE_TO_BUFFER1(unsigned int byteaddress,unsigned char writeonebyte )
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x84);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE((char)(byteaddress>>8));
SPI_TRANSBYTE((char)byteaddress);
SPI_TRANSBYTE(writeonebyte);
PORTE |=0x80;
}
//********************************************************
//在buffer2中的一个指定的地址写一个字节
//********************************************************
void WRITE_ONE_BYTE_TO_BUFFER2(unsigned int byteaddress,unsigned char writeonebyte )
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x87);
SPI_TRANSBYTE(0x00);
SPI_TRANSBYTE((char)(byteaddress>>8));
SPI_TRANSBYTE((char)byteaddress);
SPI_TRANSBYTE(writeonebyte);
PORTE |=0x80;
}
//********************************************************
//将buffer1中的数据写入主存储区一个指定的页,
//前提条件是buffer1中确定是需要写入的数据
//********************************************************
void WRITE_BUFFER1_TO_PAGE(unsigned int pageaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x83);
SPI_TRANSBYTE((char)(pageaddress>>7));
SPI_TRANSBYTE((char)(pageaddress<<1));
SPI_TRANSBYTE(0x00);
PORTE |=0x80;
}
//********************************************************
//将buffer2中的数据写入主存储区一个指定的页,
//前提条件是buffer2中确定是需要写入的数据
//********************************************************
void WRITE_BUFFER2_TO_PAGE(unsigned int pageaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x86);
SPI_TRANSBYTE((char)(pageaddress>>7));
SPI_TRANSBYTE((char)(pageaddress<<1));
SPI_TRANSBYTE(0x00);
PORTE |=0x80;
}
//********************************************************
//擦除一页
//********************************************************
void ERASE_ONE_PAGE(unsigned int pageaddress)
{
PORTE &=~0x80;
SPI_TRANSBYTE(0x81);
SPI_TRANSBYTE((char)(pageaddress>>7));
SPI_TRANSBYTE((char)(pageaddress<<1));
SPI_TRANSBYTE(0x00);
PORTE |= 0x80;
}
//*************************************
//保护引脚置高,保护Flash中内容
//*************************************
void OPR_SPI_END(void)
{
PORTE |= 0x80;
}
//*************************************
//保护引脚置低,允许修改Flash中内容
//*************************************
void OPR_SPI_START(void)
{
PORTE &=~0x80;
}
//**************************************串口驱动*************************************************//
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
//********************************************************************
//串口0初始化
//********************************************************************
void UART0_INITIALIZE(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
//*******************************************************************
//串口0中断子程序
//receive0_buffer[512]分成两部分,分别存放接收到的两个命令
//命令格式0x24,0x04,0x00,0x0d
//*******************************************************************
void UART0_RX_ISR(void)
{
unsigned char c = 0;
c = UDR0;
if(start_receive_com0_data==1)//开始存数据,根据包长度来存
{
receive0_buffer[receive0_buffer_point]=c;
receive0_buffer_point++;
if(receive0_buffer_point==receive0_buffer[1])
{
start_receive_com0_data=0;
receive0_buffer_over=1;
receive0_buffer_point=0;
}
}
else if(start_receive_com0_length==1)
{
receive0_buffer[1]=c; //存包长度
receive0_buffer_point=2;
start_receive_com0_length=0;
start_receive_com0_data=1;
}
else if(c==0x24)
{
receive0_buffer[0]=c; //存包头
start_receive_com0_length=1;
}
}
//*************************************************
//串口0发送1byte
//*************************************************
void USART0_TRANSMIT( unsigned char data )
{
//等待发送缓冲器为空
while ( !( UCSR0A & (1<<UDRE0)) );
//将数据放入缓冲器,发送数据
UDR0 = data;
}
//UART1 initialisation
// desired baud rate:9600
// actual baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
//******************************************************************
//串口1初始化
//******************************************************************
void UART1_INITIALIZE(void)
{
UCSR1B = 0x00; //disable while setting baud rate00
UCSR1A = 0x00;//00
UCSR1C = 0x06;//00
UBRR1L = 0x33; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x98;//98
}
//******************************************************************
//串口1中断子程序
//******************************************************************
void UART1_RX_ISR(void)
{
//uart has received a character in UDR
uart1_rec = UDR1;
}
//*******************************************************************
//串口1发送1byte
//*******************************************************************
void USART1_TRANSMIT( unsigned char data )
{
// 等待发送缓冲器为空
while ( !( UCSR1A & (1<<UDRE1)) );
// 将数据放入缓冲器,发送数据
UDR1 = data;
}
//********************************************************
//通过串口0发送一个字节
//********************************************************
void SEND_COM0_BYTE(unsigned char input)
{
USART0_TRANSMIT(input);
}
//********************************************************
//通过串口0发送一个字符串
//********************************************************
void SEND_COM0_STRING(unsigned char *point,unsigned int count)
{
while(count > 0)
{
USART0_TRANSMIT(*point);
point++;
count--;
}
}
//********************************************************
//通过串口0发送一个const字符串
//********************************************************
void SEND_COM0_AT(const unsigned char *point,unsigned int count)
{
while(count>0)
{
USART0_TRANSMIT(*point);
point++;
count--;
}
}
//********************************************************
//通过串口1发送一个字节
//********************************************************
void SEND_COM1_BYTE(unsigned char input)
{
USART1_TRANSMIT(input);
}
//********************************************************
//通过串口1发送一个字符串
//********************************************************
void SEND_COM1_STRING(unsigned char *point,unsigned int count)
{
while(count>0)
{
USART1_TRANSMIT(*point);
point++;
count--;
}
}
//********************************************************
//通过串口1发送一个const字符串
//********************************************************
void SEND_COM1_AT(const unsigned char *point,unsigned int count)
{
while(count>0)
{
USART1_TRANSMIT(*point);
point++;
count--;
}
}
//**************************************初始化MCU配置,以及定时器的设置*******************************************//
//******************************************************************
//初始化AVR的寄存器,IO端口方向,串口波特率等
//******************************************************************
void MCU_INITIALIZE(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -