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

📄 main._c

📁 m48,8兆,smg12232带16*16汉字库点阵液晶屏驱动程序,有详细注视,
💻 _C
字号:
                
/******************  SMG12232ZK串行接口程序******************
*ICC-AVR application builder : 2007-10-18
* Target : M8
* Crystal: 8.0000Mhz

* Title : Accessing to LCD-CONTROLLER                                   
* Date :  2007-10-18                                                      
* Support QQ:  16693799     
* Create by :	Joe Yuan      
* DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER */ 
                                                                      


#include <iom48v.h>		//ATMEGA48头文件
#include <macros.h>		//宏定义
#include "initrialm48.h"//初始化mcu
#include "define.h"		//端口定义
#include "delay.h"		//延时程序


#define LCD_PORT PORTD
#define LCD_DDR	DDRD
	#define LCD_SCLK PD0
	#define LCD_CS	PD2
	#define LCD_STD PD1


#define LCD_CS_H LCD_PORT |= BIT(LCD_CS)
#define LCD_CS_L LCD_PORT &=~ BIT(LCD_CS)
#define LCD_STD_H LCD_PORT |= BIT(LCD_STD)
#define LCD_STD_L LCD_PORT &=~ BIT(LCD_STD)
#define LCD_SCLK_H LCD_PORT |= BIT(LCD_SCLK)
#define LCD_SCLK_L LCD_PORT &=~ BIT(LCD_SCLK)



void Send_8bit(Word x);//串行发送8位数据
void Lcd_Write(Byte start,Byte data);//模块写入子程序
void Lcd_Reset(void);//模块复位子程序
void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer);//xpos为列数,ypos为行数,num字符串长度

Byte lcd_buf[5];
Word *pointer;
Byte data;

void Hzk_Dis_Data(Byte ypos,Byte xpos,Word data,Byte num)//xpos为列数,ypos为行数,num字符串长度									
{
	Byte i=0,ram_address;//ram_address:首地址
	for(i=0;i<num;i++)
	{
		lcd_buf[num-i-1]= data%10+0x30;
		data /= 10;
	}
	if(ypos==1)
	{
		ram_address = 0x80+xpos-1;
	}
	else if(ypos==2)
	{
		ram_address = 0x90+xpos-1;
	}
	Lcd_Write(0xf8,ram_address);
	pointer = lcd_buf;
	for(i=0;i<num;i++)
	{
		Lcd_Write(0xfa,*pointer);	
		pointer++;
	}	
	
}








void main(void)
{
	Word i;
 	Init_Devices();
	Lcd_Reset();
	Hzk_Dis_Words(1,1,"袁自刚");	
	Hzk_Dis_Data(2,1,12345,5);
	while(1)
		;	
}

void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer)//xpos为列数,ypos为行数,num字符串长度									
{
	Byte i=0,ram_address;//ram_address:首地址
	//首先判断字符串得长度
	while(*(lcd_pointer+i) != '\0')//字符串长度
	{
		i++;
	}//i=字符串长度	
	if(i>15)
	{
		i=15;
	}
	if(ypos==1)
	{
		ram_address = 0x80+xpos-1;
	}
	else if(ypos==2)
	{
		ram_address = 0x90+xpos-1;
	}
	Lcd_Write(0xf8,ram_address);
	for(;i>0;i--)
	{
		Lcd_Write(0xfa,*lcd_pointer);	
		lcd_pointer++;
	}	
	
}

/*
void Char_Dis(Byte ypos,Byte xpos,char *lcd_pointer)//xpos为列数,ypos为行数
								//0=<xpos<=8,0=<ypos<=2
{
	if(ypos==1)
	{
		Lcd_Write(0xf8,xpos-1+0x80);
		Lcd_Write(0xfa,*lcd_pointer);
		Lcd_Write(0xfa,*(lcd_pointer+1));
	}
	else if(ypos==2)
	{
		Lcd_Write(0xf8,xpos-1+0x90);
		Lcd_Write(0xfa,*lcd_pointer);
		Lcd_Write(0xfa,*(lcd_pointer+1));
	}	
}
*/

void Lcd_Reset(void)
{
	LCD_CS_H;//片选置高
	Delay_Ms(1);//等待内部复位
	Lcd_Write(0xf8,0x30);//使用基本指令集
	Lcd_Write(0xf8,0x0c);//整体显示on
	Lcd_Write(0xf8,0x01);//清除显示
	Delay_Ms(5);//4.6ms
	Lcd_Write(0xf8,0x06);//显示右移
	LCD_CS_L;//片选置低
}

void Lcd_Write(Byte start,Byte com)//start :起始字节com:命令/数据 						  
{
	LCD_CS_H;//片选置高
	Send_8bit(start);
	Delay_Us(100);//72us
		//将data变为datal 0000 datah 0000
	Send_8bit(com&0xf0);
	Delay_Us(100);//72us	
	Send_8bit((com&0x0f)<<4);
	Delay_Us(100);//72us
	LCD_CS_L;//片选置低
}
	
void Send_8bit(Word x)
{
	Byte i;
	for(i=0;i<8;i++)
	{
		if(x&0x80)//数据线发送数据
		{
			LCD_STD_H;
		}
		else
		{
			LCD_STD_L;
		}
		LCD_SCLK_L;//产生同步时钟
		Delay_Us(2);
		LCD_SCLK_H;
		Delay_Us(2);
		x <<= 1;
	}
}




⌨️ 快捷键说明

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