仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
- #include <reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include "hanzi.h" //汉字库头文件
- #include "shuzi.h" //字符库头文件
- #define uchar unsigned char
- #define uint unsigned int
- // lcd12864(ks0108)
- #define LCD_DATA P2 //LCD8位并行数据口
- sbit LCD_RS=P0^5; //寄存器选择
- sbit LCD_RW=P0^6; //读/写选择
- sbit LCD_EN=P0^7; //读写使能
- sbit LCD_CS1=P0^2; //右半屏选择,1有效
- sbit LCD_CS2=P0^3; //左半屏选择,1有效
- sbit LCD_RST=P0^4; //复位信号
- //*********************************************//
- // 函数声明
- void init_lcd(void);
- void lcd_delay(uint time); //延时
- void lcd_write_com(uchar cmdcode); //写命令
- void lcd_write_data(uchar Rsspdata); //写数据
- void lcd_Clr_Scr(void); //清屏
- void lcd_werite_x_y(uchar x,uchar y); //写地址
- void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat); //任意位置显示任意汉字
- void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat); //任意位置显示任意字符
- //****************************************************************************//
- //---------------------------------------
- // 主函数
- //---------------------------------------
- void main(void)
- {
- init_lcd(); //初始化
- lcd_Clr_Scr(); //清屏
- while(1)
- {
- lcd_write_english(0,0,0,SHUZI);
- lcd_write_english(0,8,1,SHUZI);
- lcd_write_english(0,16,2,SHUZI);
- lcd_write_english(0,24,3,SHUZI);
- lcd_write_english(0,32,4,SHUZI);
- lcd_write_english(0,40,5,SHUZI);
- lcd_write_english(0,48,6,SHUZI);
- lcd_write_english(0,56,7,SHUZI);
- lcd_write_english(0,64,8,SHUZI);
- lcd_write_english(0,72,9,SHUZI);
-
- lcd_write_chinese(2,0,0,HANZI);
- lcd_write_chinese(2,16,1,HANZI);
- lcd_write_chinese(4,0,2,HANZI);
- lcd_write_chinese(4,16,3,HANZI);
- lcd_write_chinese(4,32,4,HANZI);
- lcd_write_chinese(4,48,5,HANZI);
- lcd_write_chinese(4,64,6,HANZI);
- lcd_write_chinese(4,80,7,HANZI);
- lcd_write_chinese(4,96,8,HANZI);
- while(1);
- }
- }
- //---------------------------------------
- // 延时函数
- //---------------------------------------
- void lcd_delay(uint time)
- {
- uint i;
- for(i=0;i<time;i++);
- }
- //---------------------------------------
- // 12864初始化函数
- //---------------------------------------
- void init_lcd(void)
- {
- LCD_RST=0; //液晶复位
- lcd_delay(250); //适当延时
- LCD_RST=1; //复位结束
- LCD_CS1=1; //左半屏选通
- LCD_CS2=1; //右半屏选通
- lcd_delay(250); //适当延时
- lcd_write_com(0x3f); //显示开
- }
- //---------------------------------------
- // 写命令函数
- //---------------------------------------
- void lcd_write_com(uchar cmdcode)
- {
- LCD_RS=0; //选择命令寄存器
- LCD_RW=0; //写选通
- LCD_DATA=cmdcode; //将命令写入总线
- _nop_(); //空操作,做短暂的延时
- LCD_EN=1; //E的下降沿,数据写入
- _nop_(); //空操作,做短暂的延时
- LCD_EN=0; //E的下降沿,数据写入
- }
- //---------------------------------------
- // 写数据函数
- //---------------------------------------
- void lcd_write_data(uchar Rsspdata)
- {
- LCD_RS=1; //选择数据寄存器
- LCD_RW=0; //写选通
- LCD_DATA=Rsspdata; //将数据写入总线
- _nop_(); //空操作,做短暂的延时
- LCD_EN=1; //E的下降沿,数据写入
- _nop_(); //空操作,做短暂的延时
- LCD_EN=0; //E的下降沿,数据写入
- }
- //---------------------------------------
- // 清屏函数
- //---------------------------------------
- void lcd_Clr_Scr(void)
- {
- uchar j,k;
- LCD_CS1=1; //左半屏选通
- LCD_CS2=1; //右半屏选通
- lcd_write_com(0x40+0); //将列地址写入
- for(k=0;k<8;k++)
- {
- lcd_write_com(0xb8+k); //将行地址写入
- for(j=0;j<64;j++) //每行的64列都写0,因为选了左右两屏,
- {
- lcd_write_data(0x00); //64列同时写0
- }
- }
- }
- //---------------------------------------
- // 地址写入函数
- //---------------------------------------
- void lcd_werite_x_y(uchar x,uchar y)
- {
- y=y&0x7f; //限定范围,列不能超过128
- x=x&0x07; //限定范围,行不能超过8
- if(y<64) //如果列小于64
- {
- LCD_CS1=1; //选通左半屏
- LCD_CS2=0; //关闭右半屏
- lcd_write_com(0x40+y); //将列地址写入
- }
- else
- {
- LCD_CS1=0; //关闭左半屏
- LCD_CS2=1; //选通右半屏
- y&=0x3f;
- lcd_write_com(0x40+y); //将列地址写入
- }
- lcd_write_com(0xb8+x); //将行地址写入
- }
- //---------------------------------------
- // 指定位置写16*16汉字函数
- //---------------------------------------
- void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat)
- {
- uchar i=0;
- lcd_werite_x_y(x,y); //设定起始地址
- for(i=0;i<16;i++)
- lcd_write_data(dat[hz*32+i]); //先写上半个字,共16个字节
- lcd_werite_x_y(x+1,y); //设定起始地址,此次将行地址加1,以便写下行
- for(i=0;i<16;i++)
- lcd_write_data(dat[hz*32+16+i]); //再写下半个字,共16个字节
- }
- //---------------------------------------
- // 指定位置写8*16字符函数
- //---------------------------------------
- void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat)
- {
- uchar i=0;
- lcd_werite_x_y(x,y); //设定起始地址
- for(i=0;i<8;i++)
- lcd_write_data(dat[en*16+i]); //先写上半个字,共8个字节
- lcd_werite_x_y(x+1,y); //设定起始地址,此次将行地址加1,以便写下行
- for(i=0;i<8;i++)
- lcd_write_data(dat[en*16+8+i]); //再写下半个字,共8个字节
- }
复制代码
全部资料51hei下载地址:
LCD12864显示汉字-字符程序.zip
(114.98 KB, 下载次数: 558)
|