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

📄 st7920iccavrmega8._c

📁 AVR学习开发 板
💻 _C
字号:
/****************************************************************************************
           LCM(DM12864M-带字库,ST7920控制芯片)mega8控制显示程序   
		                                                
             程序功能:该程序是用AVR来控制对DM12864M
			           读写信号等的操作.
             硬件连接:采用串行方式显示,分配PB6=SID,PB7=SCK,PB1=LCD_ON
			           三个I/O口分别作为LCM数据,时钟信号,背光开关
					   的控制。
					   CS和/RESET直接接VCC;PSB直接接GND 
					                                 作者:张国旗
													 2008年12月29号       
****************************************************************************************/
#include <iom8v.h>
#include <macros.h>
#include <stdio.h>

#define LCDDDR        DDRB
#define LCDDDR_IN     LCDDDR&=~BIT(PB6);
#define LCDDDR_OUT    LCDDDR|=BIT(PB1)|BIT(PB6)|BIT(PB7);
/*===============================================================*/
#define LCDCTL      PORTB   
#define SID_ON      LCDCTL |= BIT(PB6)  //数据                            
#define SID_OFF     LCDCTL &= ~BIT(PB6)  
#define SCK_ON      LCDCTL |= BIT(PB7)  //时钟                          
#define SCK_OFF     LCDCTL &= ~BIT(PB7) 
#define LCD_ON      LCDCTL |= BIT(PB1)  //开启背光
#define LCD_OFF     LCDCTL &= ~BIT(PB1)  
//#define uchar unsigned char
/***********************函数体部分*********************************/
unsigned char  AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
//=========发送一个字节程序=========
void SendByte(unsigned char Dbyte)
{
    unsigned char i;
    for(i=0;i<8;i++)
 	{
  	 	if(Dbyte&0x80)SID_ON;
  		else SID_OFF;
  		SCK_ON;
  		SCK_OFF;
  		Dbyte=Dbyte<<1;
 	}
}
//接收一个字节程序((0xf0&temp1)+(0x0f&temp2))
unsigned char ReceiveByte(void)  
{
    unsigned char i,temp1,temp2;
    temp1=temp2=0;
    for(i=0;i<8;i++)
    {
	    LCDDDR_IN;
		temp1=temp1<<1;
        if ((PINB&0x40)!=0)temp1++;  //与端口设置有关,主要修改端口时修改此位
    	LCDDDR_OUT;
		SCK_ON;
  		SCK_OFF;
  	}
    for(i=0;i<8;i++)
    {
	    LCDDDR_IN;
		temp2=temp2<<1;
        if ((PINB&0x40)!=0)temp2++;  //与端口设置有关,主要修改端口时修改此位
		LCDDDR_OUT;
		SCK_ON;
  		SCK_OFF;
    }
        return ((0xf0&temp1)+(0x0f&temp2));
}
//液晶忙检查CheckBusy
void CheckBusy( void )               
{
    do SendByte(0xfc);               //11111,RW(1),RS(0),0
    while(0x80&ReceiveByte());
}
//========写命令========
void WriteCommand( unsigned char Cbyte )
{
	CheckBusy();
    SendByte(0xf8);           	    //11111,RW(0),RS(0),0
    SendByte(0xf0&Cbyte);
    SendByte(0xf0&Cbyte<<4);
}
//========写数据========
void WriteData( unsigned char Dbyte )
{
    CheckBusy();
    SendByte(0xfa);           		//11111,RW(0),RS(1),0
    SendByte(0xf0&Dbyte);
    SendByte(0xf0&Dbyte<<4);
}
//========读数据========
unsigned char ReadData( void )
{
    CheckBusy();
    SendByte(0xfe);           		//11111,RW(1),RS(1),0
    return ReceiveByte();
}
//===延时程序 ,12M/ms==
void Delay(unsigned int MS)
{
    unsigned char us,usn;
    while(MS!=0)             		//for 12M
    { 
	    usn = 2;
    	while(usn!=0)
        {
            us=0xf5;
            while (us!=0){us--;};
            usn--;
        }
        MS--;
    }
}
//=====液晶初始化======
void LcmInit( void )          
{
    WriteCommand(0x30); //基本指令,选择8位CPU控制方式,关图显
    WriteCommand(0x03); //复位地址计数器
    WriteCommand(0x0C); //开整体显示
    WriteCommand(0x01); //清除屏显的数据
    WriteCommand(0x06); //设置地址计数器递增
}
//=======清文字========
void LcmClearTXT( void )     
{
    LcmInit();
}
//=======清图片========
void LcmClearBMP( void )    
{
    unsigned char i,j;
    WriteCommand(0x34);		 	//关图显
    for(i=0;i<32;i++)
    {
        WriteCommand(0x80|i);	//写入列地址
        WriteCommand(0x80);  	//写入行地址
        for(j=0;j<32;j++)
        WriteData(0);
    }
	//WriteCommand(0x36);//开图显
}
//==写入一段文字,写完一屏,清屏,从头在写新的一屏=======
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{
    WriteCommand(0x30);	  		//基本指令,选择8位CPU控制方式,关图显
    WriteCommand(AC_TABLE[8*row+col]);
    while(*puts != '\0')
    {
        if(col==8)
        {
            col=0;
            row++;
        }
        if(row==4) row=0;
        WriteCommand(AC_TABLE[8*row+col]);
        WriteData(*puts);		//一个汉字的ASC码是一个16位的,所以要写入两个字节
        puts++;
        WriteData(*puts);
        puts++;
        col++;
	}
}
//========写入一屏图片128*64=======
void PutBMP(unsigned char *puts)
{
    unsigned char x,y,i,j,k;
	x=0x80;
	WriteCommand(0x34);	  		//关图显
    for(k=0;k<2;k++)
	{	
	    y=0x80;
		for(j=0;j<32;j++)
		{
		    WriteCommand(y);	//写入列地址
            WriteCommand(x);  	//写入行地址
            for(i=0;i<16;i++)
			{
			 WriteData(*(puts++));			
			}
			y++;
		}
		x=0x88;
	}
	WriteCommand(0x36);			//开图显
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -