仿真原理图如下
#include
#include
#include
#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
}
//---------------------------------------
// 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; //关闭左半屏
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』