找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3687|回復(fù): 0
收起左側(cè)

ATMEGA16A單片機(jī)1602字符顯示程序

[復(fù)制鏈接]
ID:587926 發(fā)表于 2019-7-24 12:39 來自手機(jī) | 顯示全部樓層 |閱讀模式
* 【編譯環(huán)境】: ICCAVR  
* 【函數(shù)功能】: 1602字符顯示        
* 【晶    振】:  8M               
* 【芯    片】:  ATMEGA16A         

#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int

uchar wz[]={"mcustudio1com-cn"};
uchar gd[]={"Tel:15980xx5601"};
#define uchar unsigned char
#define uint unsigned int

#define RS 0
#define RW 1
#define EN 2

void s_ms(uint ms)
{
        for(;ms>1;ms--);
}        

//查忙
void busy(void)
{
    uchar temp;
        s_ms(500);
        PORTA&=~(1<<RS);    //RS=0
        s_ms(500);
        PORTA|=(1<<RW);     //RW=1
        s_ms(500);
        while(temp)
        {
                PORTA|=(1<<EN); //EN=1
                s_ms(500);
                DDRB=0x00;      //A口變輸入
                PORTB=0xff;     //上拉使能
                s_ms(500);
                temp = PINB&0x80;    //讀取A口
                s_ms(500);      
                DDRB=0xff;      
                PORTB=0xff;        //A口變輸出
                s_ms(500);
                PORTA&=~(1<<EN);   //EN=0
                s_ms(500);
        }
}

//寫指令
void writecom(uchar        com)
{
        busy();
        s_ms(500);
        PORTA&=~(1<<RS);   //RS=0
        s_ms(500);
        PORTA&=~(1<<RW);   //RW=0
        s_ms(500);
        PORTA|=(1<<EN);    //EN=1
        s_ms(500);
        PORTB = com;       //輸出指令
        s_ms(500);
        PORTA&=~(1<<EN);   //EN=0
        s_ms(500);
}

//1602初始化
void        LcdInit(void)
{
    DDRB = 0xff;
    PORTB = 0x00;
        writecom(0x38);
        s_ms(1000);
        writecom(0x01);
        s_ms(1000);
        s_ms(1000);
        s_ms(1000);
        s_ms(1000);
        s_ms(1000);
        s_ms(1000);
        s_ms(1000);
        writecom(0x02);
        s_ms(1000);
        writecom(0x06);
        s_ms(1000);
        writecom(0x0c);
        s_ms(1000);
        writecom(0x38);        
        s_ms(1000);
}        

//寫數(shù)據(jù)
void        writedata(uchar data)
{
        busy();
        s_ms(500);
        PORTA|=(1<<RS);   //RS=1
        s_ms(500);
        PORTA&=~(1<<RW);   //RW=0
        s_ms(500);
        PORTA|=(1<<EN);    //EN=1
        s_ms(500);
        PORTB = data;      //輸出數(shù)據(jù)
        s_ms(500);
        PORTA&=~(1<<EN);   //EN=0
        s_ms(500);
}


//讀數(shù)據(jù)
uchar        readdata(void)
{
        uchar temp;
        busy();
        s_ms(500);
        PORTA|=(1<<RS);  //RS=1
        s_ms(500);
        PORTA|=(1<<RW);  //RW=1
        s_ms(500);
        PORTA|=(1<<EN);  //EN=1
        s_ms(500);
        DDRB=0x00;       //A端口變輸入
        s_ms(500);
        temp = PINB;     //讀A端口
        s_ms(500);
        DDRB=0xff;       //A端口變輸出
        s_ms(500);
        PORTA&=~(1<<EN); //EN=0
        s_ms(500);
        return temp;        
}

//=================================================
// 描述: 寫LCD內(nèi)部CGRAM函數(shù)
// 入口: ‘num’要寫的數(shù)據(jù)個(gè)數(shù)
//        ‘pbuffer’要寫的數(shù)據(jù)的首地址
// 出口: 無
//================================================
void        WriteCGRAM(uint        num, const uint        *pBuffer)
{
        uint        i,t;
        writecom(0x40);
        PORTA|=(1<<RS);
        PORTA&=~(1<<RW);
        for(i=num;i!=0;i--)
        {
                t = *pBuffer;
                PORTA|=(1<<EN);
                PORTB = t;
                PORTA&=~(1<<EN);                                
                pBuffer++;
        }
        
}

//=================================================
//描述:寫菜單函數(shù),本程序使用的LCD規(guī)格為 16 * 2
//入口:菜單數(shù)組首地址
//出口:無
//=================================================
void        WriteMenu(const uchar *pBuffer)
{
        uchar        i,t;
        writecom(0x80);   //數(shù)據(jù)地址
        
        PORTA|=(1<<RS);
        PORTA&=~(1<<RW);
        s_ms(50);
        for(i=0;i<16;i++)
        {
                t = *pBuffer;
                PORTB = t;
                PORTA|=(1<<EN);
                s_ms(50);
                PORTA&=~(1<<EN);                                
                pBuffer++;
        }
        writecom(0xC0);

        PORTA|=(1<<RS);
        PORTA&=~(1<<RW);
        s_ms(50);        
        for(i=0;i<16;i++)
        {
                t = *pBuffer;
                PORTB = t;
                PORTA|=(1<<EN);
                s_ms(50);
                PORTA&=~(1<<EN);                                
                pBuffer++;
        }
}
//====================================================
// 描述:在任意位置寫數(shù)字函數(shù)
// 入口:’row‘表示要寫數(shù)字所在的行地址,只能為1或2
//       ’col‘表示要寫數(shù)字所在的列地址,只能為0--15
//                 ‘num’表示要寫的數(shù)字,只能為0--9
// 出口:無
//===================================================
void        WriteNum(uint        row,uint        col,uint         num)
{
        if (row == 1)        row = 0x80 + col;
        else        row = 0xC0 + col;
        writecom(row);
        if (num<=0 | num>9)        num =0x30;
        else        num = 0x30 + num;

        PORTA|=(1<<RS);
        s_ms(500);
        PORTA&=~(1<<RW);
        s_ms(500);
        PORTB = num;
        s_ms(500);
        PORTA|=(1<<EN);
        s_ms(500);
        PORTA&=~(1<<EN);        
        s_ms(500);                        
}
//================================================================
// 描述:在任意位置寫任意多個(gè)字符
// 入口:’row‘要寫的字符所在的行,只能為1或2;
//       ‘col’要寫的字符所在的列,只能為0---15
//       ‘num’要寫字符的個(gè)數(shù)
//       ‘pbuffer’要寫字符的首地址
//==================================================================
void        WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
{
        uchar i,t;
        if (row == 1)        row = 0x80 + col;
        else        row = 0xC0 + col;
        writecom(row);
        //if (num<=0 | num>9)        num =0x30;
        //else        num = 0x30 + num;

        PORTA|=(1<<RS);
        s_ms(500);
        PORTA&=~(1<<RW);
        s_ms(500);
        for(i=num;i!=0;i--)
        {
                t = *pBuffer;
                s_ms(500);
                PORTDB = t;
                s_ms(500);
                PORTA|=(1<<EN);
                s_ms(500);
                PORTA&=~(1<<EN);               
                s_ms(500);               
                pBuffer++;
        }
        
}

void main()
{
    DDRA=0xff;   
    PORTA=0xff;
    DDRD=0xff;
    PORTD=0xff;
    s_ms(5000);      //延時(shí)
    LcdInit();     //1602初始化
    WriteChar(1,1,13,wz);    //顯示第一行
    WriteChar(2,1,16,gd);    //顯示第二行
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表