⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fun.h

📁 液晶显示屏12232的开发程序
💻 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 + -