当前位置:首页 > 单片机12864画线
#include
#define uchar unsigned char typedef unsigned int uint;
#define BASIC_SET 0x30 //基本指令集 #define EXTEND_SET 0x34 //扩展指令集 #define DRAW_ON 0x36 //绘图显示开 #define DRAW_OFF 0x34 sbit RS = P2^4; sbit RW = P2^5; sbit E = P2^6; sbit RES= P2^3; sbit PSB= P2^1; #define DataPort P0
/***************************** 大致7us
*****************************/ void DelayUs2x(uchar t) {
while(--t); }
/**************************** 大致1ms
*****************************/ void DelayMs(unsigned char t) {
while(t--) {
DelayUs2x(245); DelayUs2x(245); } }
void Check_Busy() {
DataPort=0xff; RS=0; RW=1; E=1;
while((DataPort&0x80)==0x80); E=0; }
void Write_Cmd(uchar Cmd)
//忙则等待 {
Check_Busy(); RS=0; RW=0;
DataPort=Cmd; E=1; E=0; }
void Write_Data(uchar Data) {
Check_Busy(); RS=1; RW=0;
DataPort=Data; E=1; E=0; }
uchar Read_Data() {
uchar LCD_DATA; Check_Busy(); DataPort=0xff; RS=1; RW=1; E=1;
LCD_DATA=DataPort; DelayUs2x(5); E=0;
DelayUs2x(5);
return LCD_DATA; }
/*------------------------------------------------ 显示字符串 x:横坐标值,范围0~8 y:纵坐标值,范围1~4
------------------------------------------------*/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s) {
switch(y) {
case 1: Write_Cmd(0x80+x);break; case 2: Write_Cmd(0x90+x);break; case 3: Write_Cmd(0x88+x);break;
case 4: Write_Cmd(0x98+x);break; default:break; }
while(*s>0) {
Write_Data(*s); s++; } }
void Init_ST7920() {
DelayMs(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式 DelayMs(1); //延时 RES=0; //复位 DelayMs(1); //延时
RES=1; //复位置高 DelayMs(10);
//Write_Cmd(0x30); //选择基本指令集 //DelayUs2x(50); //延时大于100us Write_Cmd(0x30); //选择8bit数据流 DelayUs2x(20); //延时大于37us
Write_Cmd(0x0c); //开显示(无游标、不反白) DelayUs2x(50); //延时大于100us
Write_Cmd(0x01); //清除显示,并且设定地址指针为00H DelayMs(15); //延时大于10ms
Write_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
DelayUs2x(50); //延时大于100us }
void LCD_Clear() {
Write_Cmd(0x01); DelayMs(15); }
/*清绘图*/
void LCD_Clear_GDRAM(void) {
uchar i,j;
for(j=0;j<32;j++) {
Write_Cmd(EXTEND_SET); Write_Cmd(0x80+j); Write_Cmd(0x80);
Write_Cmd(0x30); //基本指令集,绘图关 for(i=0;i<32;i++)
Write_Data(0x00); // 写入0x00 }
Write_Cmd(DRAW_ON); Write_Cmd(BASIC_SET); }
/*------------------------------------------------ 打点 x:横坐标值,范围0~127 y:纵坐标值,范围0~63
------------------------------------------------*/
void LCD_SET_Dot(uchar x,uchar y,bit Mode) {
uchar x_byte,x_bit; uchar y_byte,y_bit; uchar LCD_H,LCD_L;
x&=0x7f;//防止x坐标超过127 y&=0x3f;//防止y坐标超过63 x_byte=x/16;//那一个地址 x_bit=x; y_byte=y/32; y_bit=y2;
Write_Cmd(EXTEND_SET); Write_Cmd(DRAW_OFF); Write_Cmd(0x80+y_bit);//垂直
Write_Cmd(0x80+x_byte+8*y_byte);//水平 Read_Data();
LCD_H=Read_Data(); LCD_L=Read_Data();
Write_Cmd(0x80+y_bit);//垂直
Write_Cmd(0x80+x_byte+8*y_byte);//水平 if(x_bit<8) {
if(Mode) {
Write_Data(LCD_H|(0x01<<(7-x_bit))); Write_Data(LCD_L); } else
共分享92篇相关文档