12232液晶屏多种应用.docx
- 文档编号:10960471
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:26
- 大小:100.23KB
12232液晶屏多种应用.docx
《12232液晶屏多种应用.docx》由会员分享,可在线阅读,更多相关《12232液晶屏多种应用.docx(26页珍藏版)》请在冰豆网上搜索。
12232液晶屏多种应用
12232液晶屏幕多种应用
TG12232E是一款带字库的122×32点液晶屏,可以串接(3线或2线),可并接。
并接又有两种接法,4位并接和8位并接。
可以说这是一款很好用的液晶屏。
它的控制芯片是ST7920。
目前市面上的带字库的液晶屏基本上也是用这个芯片,所以本程序是可以移植到其他液晶屏的。
这个屏我们有几种玩法:
1、采用3线串行方式
2、采用并行8位式
3、采用并行8位式(C++)
TG12232E的数据手册和芯片资料
采用3线串行方式的程序
//--------------------------------------------
//name:
TG12232E 驱动程序
//mcu:
ATmega8
//software:
winavr
//time:
2005.5.10
//--------------------------------------------
// CS ----- PB2 LCD片选(串行) 0:
禁止 1:
允许
// SID ---- PB3 LCD输入串行数据(串行)
// CLK ---- PB5 LCD输入串行脉冲(串行)
#include
#include
#include
#define FREQ 8 //Meaga8L,8MHz
#define SS PB2//LCD片选(串行) 0:
禁止 1:
允许
#define MOSI PB3//LCD输入串行数据(串行)
#define SCK PB5//LCD输入串行脉冲(串行)
void port_init(void)
{
DDRB = 0;//设置B口全为输入
DDRC = 0;//设置C口全为输入
DDRD = 0;//设置D口全为输入
PORTB = 0xff;//设置B口全部上拉
PORTC = 0xff;//设置C口全部上拉
PORTD = 0xff;//设置D口全部上拉
}
void spi_init(void)
{
// 设置MOSI 和SCK 及SS 为输出,其他为输入
DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS);
PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS);
SPCR = (1< } void delay_ms(unsigned int t) { unsigned int i; for(i = 0; i < t; i++) _delay_loop_2(250 * FREQ); } void spi_send(unsigned char data) { SPDR = data; // 启动spi while(! (SPSR & (1 << SPIF))); // 等待传输结束 } //--------------------------------------------------- // 发送8位LCD控制命令 //-------------------------------------------------- void lcd_send_com(unsigned char com) { 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);//1.6mS else _delay_loop_2(72 * FREQ); //st7920要求等待72uS } //-------------------------------------------------------- // 发送8位LCD显示数据 //------------------------------------------------------- void lcd_send_data(unsigned char data) { 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初始化设置 //--------------------------------------------------- void lcd_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命令 } //------------------------------------------ //定位 //---------------------------------------- unsigned char set_lcd_position(unsigned char row, unsigned char col) { if ((row < 2) && (col < 8)) //汉字字符为2行7.5列(汉字必须偶数对齐) { lcd_send_com(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令 return 1;//成功返回 } else return 0;//失败返回 } //--------------------------------------------------- //显示字符串 //--------------------------------------------------- void lcd_display_string(unsigned char * string) { while(*string) lcd_send_data(*string ++); } //------------------------------------------------------------------------------------ //在指定位置显示 //------------------------------------------------------------------------------------ void lcd_display(unsigned char row, unsigned char col, unsigned char * string) { if (set_lcd_position(row, col)) { lcd_display_string(string); } } //========main======================= int main(void) { port_init(); lcd_init(); set_lcd_position(0,1); //汉字定位到上行左端 lcd_display_string('欢迎光临本站'); lcd_display(1,0,' WWW.ICBEAN.COM '); while (1); } 采用并行8位式的程序 //-------------------------------------------- //name: TG12232E 驱动程序 //mcu: ATmega8 //software: winavr //time: 2005.5.10 //author: Bromi //7920中文LCD屏,带中文字库 TG12232E 并行8位 //联接: LCD MEGA8 // RS ----- PORTD.0 // RD ----- PORTD.1 // EN ----- PORTD.2 // DB0~7 ----- PORTB //----------------------------------------------- #include #include #include #define FREQ 8 //Meaga8L,8MHz void delay_ms(unsigned int t) //毫秒延迟 { unsigned int i; for(i = 0; i < t; i++) _delay_loop_2(250 * FREQ); } #define d_us(d) _delay_loop_2(d * FREQ)//微秒延迟 //----------------------------------------------- //将数据输出到LCD接口,LCD数据口宽度为8bit //rs: 1 操作指令寄存器,0 操作数据寄存器 //rd: 1 从LCD读出数据, 0 向LCD写数据 //portb: 要写入的数据 //----------------------------------------------- //rs=PORTD.0 #define set_rs sbi( PORTD,0) //数据 #define clr_rs cbi( PORTD,0) //控制 //rw=PORTD.1 #define set_rw sbi( PORTD,1) //读 #define clr_rw cbi( PORTD,1) //写 //en=PORTD.2 #define set_e sbi( PORTD,2) #define clr_e cbi( PORTD,2) #define lcd_send_com(d) clr_rs;clr_rw;PORTB=d;set_e;d_us(200);clr_e //写指令 #define lcd_send_data(d) set_rs;clr_rw;PORTB=d;set_e;d_us(200);clr_e //写数据 //--------------------------------------------------- // LCD初始化设置 //--------------------------------------------------- void lcd_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命令 } //------------------------------------------ //定位 //---------------------------------------- unsigned char set_lcd_position(unsigned char row, unsigned char col) { if ((row < 2) && (col < 8)) //汉字字符为2行7.5列(汉字必须偶数对齐) { lcd_send_com(0x80 + row * 16 + col);//发送设定DDRAM地址row * 16 + col命令 return 1;//成功返回 } else return 0;//失败返回 } //--------------------------------------------------- //显示字符串 //--------------------------------------------------- void lcd_display_string(unsigned char * string) { while(*string) lcd_send_data(*string ++); } //------------------------------------------------------------------------------------ //在指定位置显示 //------------------------------------------------------------------------------------ void lcd_display(unsigned char row, unsigned char col, unsigned char * string) { if (set_lcd_position(row, col)) { lcd_display_string(string); } } void port_init(void) { DDRB = 0xff; //设置B口全为输出 DDRC = 0; //设置C口全为输出 DDRD = 0xff; //设置D口全为输出 PORTB = 0xff; //设置B口全部上拉 PORTC = 0xff; //设置C口全部上拉 PORTD = 0xff; //设置D口全部上拉 } //========main======================= int main(void) { port_init(); lcd_init(); set_lcd_position(0,1); //汉字定位到上行左端 lcd_display_string('? 迎光临本站')' lcd_display(1,0,' 'WW.ICBEAN.COM ')' while (1); } 采用并行8位式的程序(C++版) //------------------------------------------- //name: TG12232E 驱动程序 //mcu: ATmega8 //software: AVR-GCC C++ TEST //time: 2005.5.10 //------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #define uchar unsigned char #define uint unsigned int #define FREQ 8 //Meaga8L,8MHz #define SS PB2//LCD片选(串行) 0: 禁止 1: 允许 #define MOSI PB3//LCD输入串行数据(串行) #define SCK PB5//LCD输入串行脉冲(串行) class lcd { private: unsigned char row,col; void spi_mode_set(void); public: lcd(void); //lcd的构造函数 void lcd_send(unsigned char); void dl_ms(unsigned int); void lcd_init(void); void lcd_send_com(unsigned char); void lcd_send_data(unsigned char); unsigned char set_position(unsigned char, unsigned char); void get_position(unsigned char &, unsigned char &); void lcd_display(unsigned char, unsigned char, const char *); void lcd_display(const char *); void lcd_display(uchar); void lcd_display(int); }; lcd: : lcd(void) { row = 0; col = 0; spi_mode_set(); } void lcd: : 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); } void lcd: : lcd_send(unsigned char cData) { SPDR = cData; while(! (SPSR & (1 << SPIF))); } void lcd: : dl_ms(unsigned int t) { unsigned int i; for(i = 0; i < t; i++) _delay_loop_2(250 * FREQ); } //-------------------------------------------------------- // 发送8位LCD控制命令 //------------------------------------------------------ void lcd: : lcd_send_com(unsigned char cCommand) { /*-------------------------------------------------------- 发送同步脉冲11111 WR(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);//1.6mS else _delay_loop_2(72 * FREQ);//st7920要求等待72uS } /*-------------------------------------------------------- 发送8位LCD显示数据 --------------------------------------------------------*/ void lcd: : lcd_send_data(unsigned char cData) { /*-------------------------------------------------------- 发送同步脉冲11111 WR(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12232 液晶屏 多种 应用