12864 C语言程序 带详细注解
来源:互联网 发布:java读取zip文件乱码 编辑:程序博客网 时间:2024/06/10 17:23
/*Allen.H 2010-8-30*/
/*逐字显示汉字*/
#i nclude <reg52.h>
#i nclude <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*TS12864A-3 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^4; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_E = P2^6; //液晶并行使能控制
sbit LCD_PSB = P2^1; //串/并方式控制
uchar code dis1[] = {
"你好色彩日格科技" //写英文字符的话一行写16个
"我们的未来不是梦"
"让世界更美好美丽"
"品质卓越至尊服务"
};
#define delayNOP(); {_nop_();_nop_();_nop_();};
void delay(int);
bit lcd_busy();
void lcd_init();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar cmd);
void lcd_pos(uchar X,uchar Y);
/* 主程序 */
void main()
{
uchar i;
unsigned int j=0,k;
P0=0x00; //初始化数据口
lcd_init(); //初始化LCD
while(1)
{
i = 0;
delayNOP();
delayNOP();
delayNOP();
delayNOP();
delayNOP();
lcd_pos(0,0); //定位到第一行第一个字符地址
delay(15);//改变这个时间可以改变垂直方向的显示,
//时间短就是动态显示,四行同时显示,时间不合适就会闪烁
for(j=0;j<16;j++) //显示8个汉字,每个汉字两个字符宽,
//若是英文的话,数组中一行输入16个字符
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);//改变时间控制逐字输出
}
lcd_pos(1,0);
delay(15);
for(j=16;j<32;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
lcd_pos(2,0);
delay(15);
for(j=32;j<48;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
lcd_pos(3,0);
delay(15);
for(j=48;j<64;j++)
{
lcd_wdat(dis1[i]);
i++;
for(k=25000;k>0;k--);
}
}
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++) //0.5ms
{
_nop_();
_nop_();
// _nop_();
// _nop_();
}
}
}
/*写指令数据到LCD RS=L,RW=L,E=脉冲,D0-D7=指令码。只有LCD_RS的值不同
故这个函数可以和下面的写数据的函数写到一起,用两个参数,读者自己改写*/
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;//并行指令选择打开
LCD_RW = 0;//写
delayNOP();
delayNOP();
delayNOP();
// P0 = cmd;
LCD_E = 1;//打开并口
delayNOP();
_nop_();
P0 = cmd;
delayNOP();
delayNOP();
LCD_E = 0; //关闭并口 这个函数怎么写,完全参照时序图去写,
}
/*写显示数据到LCD RS=H,RW=L,E=脉冲,D0-D7=数据。*/
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
delayNOP();
delayNOP();
delayNOP();
//P0 = dat;
LCD_E = 1;
delayNOP();
_nop_();
P0 = dat;
delayNOP();
delayNOP();
LCD_E = 0;
}
/* LCD显示汉字初始化设定,只设必须的,若显示图片初始化设定得另外设定 */
void lcd_init()
{
unsigned int i;
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //扩充指令操作 0011xRGL R=1扩充指令G=0关闭绘图显示L=0
for(i=400;i>0;i--);
lcd_wcmd(0x30); //基本指令操作
for(i=400;i>0;i--);
lcd_wcmd(0x08); //睡眠模式
for(i=400;i>0;i--);
lcd_wcmd(0x0C); //显示开,关光标00001DCB D=1整体显示,C=0关光标,B=0关游标位置
for(i=80;i>0;i--);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(20); //改变启动时间长短
/* lcd_wcmd(0x02);
delay(5);
lcd_wcmd(0x80);
delay(5);*/
}
//设定显示位置
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;} //参照12864PDF文档设定
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos);
}
- 12864 C语言程序 带详细注解
- 1602液晶显示程序(C语言详细解说)
- C语言下程序的堆栈调用(详细,图示)
- 单片机实现TCP_IP协议的完整C源程序,带程序注解
- c语言详细讲解!
- 约瑟夫环问题求解--程序+详细注解
- word2vec之TrainModelThread程序详细注解
- MT4自带的EA,高手做的详细注解
- C语言详细介绍----初识C语言
- 版本控制, C语言的两个宏, __DATE__, __TIME__, VS2005带参运行程序
- 版本控制, C语言的两个宏, __DATE__, __TIME__, VS2005带参运行程序
- C语言inline详细讲解
- 五子棋(C语言) 详细注释
- C语言inline详细讲解
- C语言inline详细讲解
- C语言inline详细讲解
- C语言inline详细讲解
- C语言inline详细讲解
- 传智博客JAVA基础第八天
- C#respnse 跳转到指定frame
- 配接器(包括仿函数),萃取器、分配器、迭代器
- 磁盘配额(quota)
- Android得到控件在屏幕中的坐标
- 12864 C语言程序 带详细注解
- 《JavaWeb----利用dom4j解析xml文件》
- Linux线程-pthread_kill
- VxWorks下载程序
- 百度面试经历及总结
- HTML网页BODY中如何设置背景图拉伸的最有效方法
- typedef和typename关键字
- Java大数处理
- C/C++中memcpy与strcpy之间的区别