📄 fun.h
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include<util/delay.h>
#include<avr/pgmspace.h>
#define uchar unsigned char
#define uint unsigned int
#include <avr/eeprom.h>
#include<stdint.h>
#include <avr/pgmspace.h>
#define uint unsigned int
#define uchar unsigned char
#define E1 2
#define E2 1
#define RW 0
#define A0 3
#define DATA PORTC
#define CONTROL PORTA
uchar g_bTxdPos=0; //发送定位计数器
uchar g_bTxdLen=0; //等待发送字节数
uchar g_bRxdPos=0; //接收定位计数器
uchar g_bRxdLen=0; //等待接收字节数
uchar g_aSendBuf[16]; //发送数据绶冲区
uchar g_aRecvBuf[16]; //接收数据缓冲区
//左页数据
void outmd(uchar i)
{
CONTROL|=_BV(A0);
CONTROL|=_BV(E1);
DATA=i;
CONTROL&=~_BV(E1);
}
//左页命令
void outmi(uchar i)
{
CONTROL&=~_BV(A0);
CONTROL|=_BV(E1);
DATA=i;
CONTROL&=~_BV(E1);
}
//右页数据
void outsd(uchar i)
{
CONTROL|=_BV(A0);
CONTROL|=_BV(E2);
DATA=i;
CONTROL&=~_BV(E2);
}
//右页指令
void outsi(uchar i)
{
CONTROL&=~_BV(A0);
CONTROL|=_BV(E2);
DATA=i;
CONTROL&=~_BV(E2);
}
void lcdstart(void)
{
CONTROL&=~_BV(RW);//写选定
outmi(0XE2);
outsi(0XE2);//复位
outmi(0XAE);
outsi(0XAE);//开显示
outmi(0XA4);
outsi(0XA4);//动态驱动
outmi(0XA9);
outsi(0XA9);//1/32占空比
outmi(0XA0);
outsi(0XA0);//顺时针读显存输出
outmi(0XEE);
outsi(0XEE);//写模式
outmi(0X00);
outmi(0XC0);
outsi(0X00);
outsi(0XC0);
outmi(0XAF);
outsi(0XAF);
}
/*
函数说明:同时设置主从显示页为0-3页。
*/
void SetPage(uchar page0,uchar page1)
{
outmi(0xB8|page1);outsi(0xB8|page0);
}
/*
--------------------------------------------------------------------------------
函数说明:同时设置主从列地址为0-121。
--------------------------------------------------------------------------------
*/
void SetAddress(uchar address0,uchar address1)
{
outmi(address1);outsi(address0);
}
void PutCharR(uchar ch)
{
outsd(ch);
}
/*
调用方式:void PutChar1(uchar ch)
函数说明:在左页当前地址画一个字节8个点.
-*/
void PutCharL(uchar ch)
{
outmd(ch);
}
/*
调用方式:void clrscr(void)
函数说明:清屏
-*/
void clrscr(void)
{
for (uchar page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for (uchar i=0;i<61;i++){PutCharR(0);PutCharL(0);}
}
}
//图片显示
//采用字模2生成或字模3生成的都可以.
void DrawBmp1(uint x_add, uchar width,uchar *bmp)
{
uchar x,address,i=0; //address表示显存的物理地址
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp+i));
else PutCharL(pgm_read_byte(bmp+i));
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp+i+width));
else PutCharL(pgm_read_byte(bmp+i+width));
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp+i+width+width));
else PutCharL(pgm_read_byte(bmp+i+width+width));
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp+i+width+width+width));
else PutCharL(pgm_read_byte(bmp+i+width+width+width));
i++;
x_add++;
}
}
//---------------------------------------------------------------
//采用zimo2 显示汉字,以汉字的显示方式
//void Draw_word(uchar d_where,uint x_add,uchar layer,uchar width)
//d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。
//---------------------------------------------------------------
void Draw_word(uchar d_where,uint x_add,uchar layer,uchar width)
{
uchar x,address; //address表示显存的物理地址
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
d_where=d_where*32;
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;
if(layer==0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp001+d_where));//右边
else PutCharL(pgm_read_byte(bmp001+d_where));//左边
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp001+d_where+width));
else PutCharL(pgm_read_byte(bmp001+d_where+width));
}
else
{ //显示第二行八个汉字
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp001+d_where));//右边
else PutCharL(pgm_read_byte(bmp001+d_where));//左边
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(bmp001+d_where+width));
else PutCharL(pgm_read_byte(bmp001+d_where+width));
}
x_add++;
d_where++;
}
}
void Draw_num(uchar d_where,uint x_add,uchar layer,uchar width)
{
uchar x,address; //address表示显存的物理地址
uchar window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
d_where=d_where*16;
for (x=width;x>1;x--)
{
if (x_add>60) {window=1;address=x_add%61;}
else address=x_add;
if(layer==0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(numbmp+d_where));//右边
else PutCharL(pgm_read_byte(numbmp+d_where));//左边
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(numbmp+d_where+width));
else PutCharL(pgm_read_byte(numbmp+d_where+width));
}
else
{ //显示第二行八个汉字
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(numbmp+d_where));//右边
else PutCharL(pgm_read_byte(numbmp+d_where));//左边
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(pgm_read_byte(numbmp+d_where+width));
else PutCharL(pgm_read_byte(numbmp+d_where+width));
}
x_add++;
d_where++;
}
}
void logo(void)
{
clrscr();
DrawBmp1(0,122,bmp1); //LOGO自动升降旗
_delay_ms(1000);
DrawBmp1(0,122,bmp2);//安徽大学
_delay_ms(1000);
DrawBmp1(0,122,bmp3);//参加者
_delay_ms(1000);
}
//串行通信
//初始化
void initusart(void)
{
//接收中断允许、发送中断允许,接收使能、发送使能
UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
//下面要设置波特率。这一点为在GCC的LIBC MANUAL 上得知此用法
#define BAUD 20000
#include<util/setbaud.h>
UBRRH=UBRRH_VALUE;
UBRRL=UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
}
//接收中断
ISR(USART_RXC_vect)
{
uchar c=UDR;
if(c!=0x00)
{
int d=c>>4;
Draw_num(c,110,0,8);
Draw_num(d,100,0,8);
_delay_ms(2000);
Draw_num(0,100,0,8);
}
}
//发送中断
ISR(USART_TXC_vect)
{
;
}
//eeprom操作
void eeput(uint8_t *dr,uchar a)
{
_EEPUT(dr,a);
_delay_ms(9);
}
//eeprom准备好中断函数
ISR(EE_RDY_vect)
{
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -