下载此文档

TG12232集中程序设计实例.pdf


文档分类:IT计算机 | 页数:约12页 举报非法文档有奖
1/12
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/12 下载此文档
文档列表 文档介绍
该【TG12232集中程序设计实例 】是由【小s】上传分享,文档一共【12】页,该文档可以免费在线阅读,需要了解更多关于【TG12232集中程序设计实例 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
TG12232E是一款带字库的122×32点液晶屏,可以串接(3线或2线),可并接。并接又有
两种接法,4位并接和8位并接。可以说这是一款很好用的液晶屏。它的控制芯片是ST7920。
目前市面上的带字库的液晶屏基本上也是用这个芯片,所以本程序是可以移植到其他液晶屏
的。
这个屏我们有几种玩法:
1、采用3线串行方式
2、采用并行8位式
3、采用并行8位式(C++)
TG12232E的数据手册和芯片资料
采用3线串行方式的程序
//--------------------------------------------
//name:TG12232E驱动程序
//mcu:ATmega8
//software:winavr
//time::.
//--------------------------------------------
//CS-----PB2LCD片选(串行)0:禁止1:允许
//SID----PB3LCD输入串行数据(串行)
//CLK----PB5LCD输入串行脉冲(串行)
#include<>
#include<avr/>
#include<avr/>
#defineFREQ8//Meaga8L,8MHz
#defineSSPB2//LCD片选(串行)0:禁止1:允许
#defineMOSIPB3//LCD输入串行数据(串行)
#defineSCKPB5//LCD输入串行脉冲(串行)
voidport_init(void)
{
DDRB=0;//设置B口全为输入
DDRC=0;//设置C口全为输入
DDRD=0;//设置D口全为输入
PORTB=0xff;//设置B口全部上拉
PORTC=0xff;//设置C口全部上拉
PORTD=0xff;//设置D口全部上拉
}
voidspi_init(void)
{
//设置MOSI和SCK及SS为输出,其他为输入
DDRB=(1<<MOSI)|(1<<SCK)|(1<<SS);
PORTB=(1<<MOSI)|(1<<SCK)|(1<<SS);
SPCR=(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0);
}
voiddelay_ms(unsignedintt)
{
unsignedinti;
for(i=0;i<t;i++)
_delay_loop_2(250*FREQ);
}
voidspi_send(unsignedchardata)
{
SPDR=data;//启动spi
while(!(SPSR&(1<<SPIF)));//等待传输结束:.
}
//---------------------------------------------------
//发送8位LCD控制命令
//--------------------------------------------------
voidlcd_send_com(unsignedcharcom)
{
PORTB|=(1<<SS);//SS=1,启动SPI
spi_send(0xf8);//发送LCD控制命令
spi_send(com&0xf0);//发送高4位LCD控制命令
spi_send(com<<4);//发送低4位LCD控制命令
PORTB&=~(1<<SS);//SS=0,关闭SPI
if(com==0x01)_delay_loop_2(1600*FREQ);//
else_delay_loop_2(72*FREQ);//st7920要求等待72uS
}
//--------------------------------------------------------
//发送8位LCD显示数据
//-------------------------------------------------------
voidlcd_send_data(unsignedchardata)
{
PORTB|=(1<<SS);//SS=1,启动SPI
spi_send(0xfa);//发送LCD显示数据
spi_send(data&0xf0);//发送高4位LCD显示数据
spi_send(data<<4);//发送低4位LCD显示数据
PORTB&=~(1<<SS);//SS=0,关闭SPI
_delay_loop_2(72*FREQ);//st7920要求等待延时72uS
}
//---------------------------------------------------
//LCD初始化设置
//---------------------------------------------------
voidlcd_init(void)
{
delay_ms(100);//上电等待延时1000Ms
spi_init();//SPI初始化
lcd_send_com(0b00100000);//发送4位控制命令
lcd_send_com(0b00000100);//发送进入点命令
lcd_send_com(0b00001100);//发送开显示关光标命令
lcd_send_com(0b00000001);//发送清除显示命令
lcd_send_com(0b10000000);//发送设定DDRAM地址0x00命令
}
//------------------------------------------:.
//定位
//----------------------------------------
unsignedcharset_lcd_position(unsignedcharrow,unsignedcharcol)
{
if((row<2)&&(col<8))//(汉字必须偶数对齐)
{
lcd_send_com(0x80+row*16+col);//发送设定DDRAM地址row*16+col命令
return1;//成功返回
}
else
return0;//失败返回
}
//---------------------------------------------------
//显示字符串
//---------------------------------------------------
voidlcd_display_string(unsignedchar*string)
{
while(*string)lcd_send_data(*string++);
}
//------------------------------------------------------------------------------------
//在指定位置显示
//------------------------------------------------------------------------------------
voidlcd_display(unsignedcharrow,unsignedcharcol,unsignedchar*string)
{
if(set_lcd_position(row,col))
{
lcd_display_string(string);
}
}
//========main=======================
intmain(void)
{
port_init();
lcd_init();
set_lcd_position(0,1);//汉字定位到上行左端
lcd_display_string('欢迎光临本站');
lcd_display(1,0,'');
while(1);:.
}
采用并行8位式的程序
//--------------------------------------------
//name:TG12232E驱动程序
//mcu:ATmega8
//software:winavr
//time:
//author:Bromi
//7920中文LCD屏,带中文字库TG12232E并行8位
//联接:LCDMEGA8
//RS-----
//RD-----
//EN-----
//DB0~7-----PORTB
//-----------------------------------------------
#include<>
#include<avr/>
#include<avr/>
#defineFREQ8//Meaga8L,8MHz
voiddelay_ms(unsignedintt)//毫秒延迟
{
unsignedinti;
for(i=0;i<t;i++)
_delay_loop_2(250*FREQ);
}
#defined_us(d)_delay_loop_2(d*FREQ)//微秒延迟
//-----------------------------------------------
//将数据输出到LCD接口,LCD数据口宽度为8bit
//rs:1操作指令寄存器,0操作数据寄存器
//rd:1从LCD读出数据,0向LCD写数据
//portb:要写入的数据
//-----------------------------------------------
//rs=
#defineset_rssbi(PORTD,0)//数据
#defineclr_rscbi(PORTD,0)//控制
//rw=
#defineset_rwsbi(PORTD,1)//读:.
#defineclr_rwcbi(PORTD,1)//写
//en=
#defineset_esbi(PORTD,2)
#defineclr_ecbi(PORTD,2)
#definelcd_send_com(d)clr_rs;clr_rw;PORTB=d;set_e;d_us(200);clr_e//写指令
#definelcd_send_data(d)set_rs;clr_rw;PORTB=d;set_e;d_us(200);clr_e//写数据
//---------------------------------------------------
//LCD初始化设置
//---------------------------------------------------
voidlcd_init(void)
{
delay_ms(100);//上电等待延时1000Ms
lcd_send_com(0b00110000);//发送8位控制命令
lcd_send_com(0b00000100);//发送进入点命令
lcd_send_com(0b00001100);//发送开显示关光标命令
lcd_send_com(0b00000001);//发送清除显示命令
lcd_send_com(0b10000000);//发送设定DDRAM地址0x00命令
}
//------------------------------------------
//定位
//----------------------------------------
unsignedcharset_lcd_position(unsignedcharrow,unsignedcharcol)
{
if((row<2)&&(col<8))//(汉字必须偶数对齐)
{
lcd_send_com(0x80+row*16+col);//发送设定DDRAM地址row*16+col命令
return1;//成功返回
}
else
return0;//失败返回
}
//---------------------------------------------------
//显示字符串
//---------------------------------------------------
voidlcd_display_string(unsignedchar*string)
{
while(*string)lcd_send_data(*string++);
}
//------------------------------------------------------------------------------------
//在指定位置显示
//------------------------------------------------------------------------------------:.
voidlcd_display(unsignedcharrow,unsignedcharcol,unsignedchar*string)
{
if(set_lcd_position(row,col))
{
lcd_display_string(string);
}
}
voidport_init(void)
{
DDRB=0xff;//设置B口全为输出
DDRC=0;//设置C口全为输出
DDRD=0xff;//设置D口全为输出
PORTB=0xff;//设置B口全部上拉
PORTC=0xff;//设置C口全部上拉
PORTD=0xff;//设置D口全部上拉
}
//========main=======================
intmain(void)
{
port_init();
lcd_init();
set_lcd_position(0,1);//汉字定位到上行左端
lcd_display_string('?迎光临本站')'
lcd_display(1,0,''')'
while(1);
}
采用并行8位式的程序(C++版)
//-------------------------------------------
//name:TG12232E驱动程序
//mcu:ATmega8
//software:AVR-GCCC++TEST
//time:
//-------------------------------------------
#include<>
#include<avr/>
#include<avr/>:.
#include<avr/>
#include<avr/>
#include<avr/>
#include<avr/>
#include<>
#include<avr/>
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#defineFREQ8//Meaga8L,8MHz
#defineSSPB2//LCD片选(串行)0:禁止1:允许
#defineMOSIPB3//LCD输入串行数据(串行)
#defineSCKPB5//LCD输入串行脉冲(串行)
classlcd
{
private:
unsignedcharrow,col;
voidspi_mode_set(void);
public:
lcd(void);//lcd的构造函数
voidlcd_send(unsignedchar);
voiddl_ms(unsignedint);
voidlcd_init(void);
voidlcd_send_com(unsignedchar);
voidlcd_send_data(unsignedchar);
unsignedcharset_position(unsignedchar,unsignedchar);
voidget_position(unsignedchar&,unsignedchar&);
voidlcd_display(unsignedchar,unsignedchar,constchar*);
voidlcd_display(constchar*);
voidlcd_display(uchar);
voidlcd_display(int);
};
lcd::lcd(void)
{
row=0;
col=0;:.
spi_mode_set();
}
voidlcd::spi_mode_set(void)
{
DDRB=(1<<MOSI)|(1<<SCK)|(1<<SS);
PORTB=(1<<MOSI)|(1<<SCK)|(1<<SS);
SPCR=(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0);
}
voidlcd::lcd_send(unsignedcharcData)
{
SPDR=cData;
while(!(SPSR&(1<<SPIF)));
}
voidlcd::dl_ms(unsignedintt)
{
unsignedinti;
for(i=0;i<t;i++)
_delay_loop_2(250*FREQ);
}
//--------------------------------------------------------
//发送8位LCD控制命令
//------------------------------------------------------
voidlcd::lcd_send_com(unsignedcharcCommand)
{
/*--------------------------------------------------------
发送同步脉冲11111WR(0)RS(0)0发送顺序从左至右)
--------------------------------------------------------*/
PORTB|=(1<<SS);//SS=1,启动SPI
lcd_send(0xf8);//发送LCD控制命令
lcd_send(cCommand&0xf0);//发送高4位LCD控制命令
lcd_send(cCommand<<4);//发送低4位LCD控制命令
PORTB&=~(1<<SS);//SS=0,关闭SPI
if(cCommand==0x01)_delay_loop_2(1600*FREQ);//
else_delay_loop_2(72*FREQ);//st7920要求等待72uS
}
/*--------------------------------------------------------
发送8位LCD显示数据
--------------------------------------------------------*/:.
voidlcd::lcd_send_data(unsignedcharcData)
{
/*--------------------------------------------------------
发送同步脉冲11111WR(0)RS(0)0发送顺序从左至右)
--------------------------------------------------------*/
PORTB|=(1<<SS);//SS=1,启动SPI
lcd_send(0xfa);//发送LCD显示数据
lcd_send(cData&0xf0);//发送高4位LCD显示数据
lcd_send(cData<<4);//发送低4位LCD显示数据
PORTB&=~(1<<SS);//SS=0,关闭SPI
_delay_loop_2(72*FREQ);//st7920要求等待延时72uS
}
/*---------------------------------------------------
LCD初始化设置
----------------------------------------------------*/
voidlcd::lcd_init(void)
{
dl_ms(100);//上电等待延时1000Ms
spi_mode_set();//SPI初始化
lcd_send_com(0b00100000);//发送4位控制命令
lcd_send_com(0b00000010);//发送位址归位命令,设定DDRAM位址计数器为0
lcd_send_com(0b00000100);//发送进入点命令
lcd_send_com(0b00001100);//发送开显示关光标命令
lcd_send_com(0b00000001);//发送清除显示命令
lcd_send_com(0b10000000);//发送设定DDRAM地址0x00命令
}
unsignedcharlcd::set_position(unsignedcharrow,unsignedcharcol)
{
row--;
col--;
if((row<2)&&(col<8)){//(汉字必须偶数对齐)
lcd_send_com(0x80+row*16+col);//发送设定DDRAM地址row*16+col命令
row=row;
col=col<<1;
return1;
}
else
return0;
}
voidlcd::get_position(unsignedchar&row,unsignedchar&col):.
{
row=row+1;
col=col+1;
}
voidlcd::lcd_display(unsignedcharrow,unsignedcharcol,constchar*string)
{
if(set_position(row,col))lcd_display(string);
}
voidlcd::lcd_display(constchar*string)
{
while(*string){
lcd_send_data(*string++);
col++;
}
}
voidlcd::lcd_display(ucharVal)
{
charstr[4];
itoa((int)Val,(char*)str,10);
lcd_display((char*)str);
}
voidlcd::lcd_display(intVal)
{
charstr[6];
itoa(Val,(char*)str,10);
lcd_display((char*)str);
}
lcddisp;
//-------------main程序------------------
intmain(void)
{
();//LCD初始化
for(;;)
{//死循环
//----------------------------------------------------------------:.
//C++函数重载演示,所有LCD显示函数都使用一个函数名lcd_display()
//----------------------------------------------------------------
(1,2,'迎光临本站');//在当前位置显示汉字串
(1000);//延时1000Ms
(2,1,'');//'
}
}
TG12232E的数据手册和芯片资料:


-

TG12232集中程序设计实例 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数12
  • 收藏数0 收藏
  • 顶次数0
  • 上传人小s
  • 文件大小345 KB
  • 时间2022-12-06