×
单片机 > 单片机程序设计 > 详情

LCD12864(KS0108)驱动程序 显示汉字-字符

发布时间:2020-08-26 发布时间:
|

仿真原理图如下
 

#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; //关闭左半屏


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实验八 交通灯控制(80C51单片机汇编语言编程)