仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
效果圖(顯示黑色為仿真軟件問題).png (29.2 KB, 下載次數: 163)
下載附件
效果圖
2017-11-2 08:22 上傳
QQ截圖20171102081444.png (29.1 KB, 下載次數: 117)
下載附件
接線圖
2017-11-2 08:22 上傳
- #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個字節
- }
復制代碼
0.png (10.4 KB, 下載次數: 132)
下載附件
2017-11-2 15:55 上傳
全部資料51hei下載地址:
LCD12864顯示漢字-字符程序.zip
(114.98 KB, 下載次數: 558)
2017-11-2 08:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|