- #include <pic18.h> //调用头文件,可以去PICC18软件下去查找PIC18FXX2.H
- __CONFIG(1,XT) ; //晶振为外部4M
- __CONFIG(2,WDTDIS) ; //看门狗关闭
- __CONFIG(4,LVPDIS) ; //禁止低电压编程
- #define RSPIN RB5 //Data or Instrument Select
- #define RWPIN RB4 //Write or Read
- #define EPIN RB3 //6800 mode Enable single
- unsigned char table[]="LCD check ok"; //要显示的内容1放入数组tablel
- //此函数定义八个字符分别写入CGRAM的八个地址
- unsigned char pic[]={
- 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
- 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
- 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
- 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
- 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
- 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
- 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
- 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00
- };
- ///---------------------------------------
- //名称: 延时函数
- //-----------------------------------------
- void delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++)
- {
- for(j=0;j<10;j++);
- }
- }
- //---------------------------------------
- //名称: 1602忙检测函数
- //-----------------------------------------
- void lcd_wait_busy(void)
- {
- TRISD7=1; //为读状态做准备
- RSPIN=0; //选择指令寄存器
- RWPIN=1; //选择读
- EPIN=1; //使能线电平变化
- while(RD7==1); //读忙状态,不忙时退出
- EPIN=0; //恢复使能线电平
- TRISD7=0;
- }
- //---------------------------------------
- //名称: 1602写命令函数
- //-----------------------------------------
- void lcd_write_com(unsigned char combuf)
- {
- RSPIN=0; //选择指令寄存器
- RWPIN=0; //选择写
- PORTD=combuf; //把命令字送入RD
- EPIN=1; //使能线电平变化,命令送入1602的8位数据口
- asm("NOP");
- EPIN=0; //恢复使能线电平
- }
- //---------------------------------------
- //名称: 1602写命令函数(带忙检测)
- //-----------------------------------------
- void lcd_write_com_busy(unsigned char combuf)
- {
- lcd_wait_busy(); //调用忙检测函数
- lcd_write_com(combuf); //调用写命令函数
- }
- //---------------------------------------
- //名称: 1602写数据函数(带忙检测)
- //-----------------------------------------
- void lcd_write_data(unsigned char databuf)
- {
- lcd_wait_busy(); //调用忙检测函数
- RSPIN=1; //选择数据寄存器
- RWPIN=0; //选择写
- PORTD=databuf; //把数据字送入P2
- EPIN=1; //使能线电平变化,命令送入1602的8位数据口
- asm("NOP");
- EPIN=0; //恢复使能线电平
- }
- //---------------------------------------
- //名称: 1602显示地址写函数
- //-----------------------------------------
- void lcd_write_address(unsigned char x,unsigned char y)
- {
- x&=0x0f; //列地址限制在0-15
- y&=0x01; //行地址限制在0-1
- if(y==0x00)
- lcd_write_com_busy(x|0x80); //第一行的列地址写入
- else
- lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入
- }
- //---------------------------------------
- //名称: 1602初始化函数
- //-----------------------------------------
- void lcdreset(void)
- {
- lcd_write_com_busy(0x38); //8位数据,双列,5*7字形
- lcd_write_com_busy(0x08); //显示功能关,无光标
- lcd_write_com_busy(0x01); //清屏指令
- lcd_write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动
- lcd_write_com_busy(0x0c); //显示功能开,无光标,
- }
- //---------------------------------------
- //名称: 指定地址写入函数
- //-----------------------------------------
- void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf)
- {
- lcd_write_address(x,y); //写入地址
- lcd_write_data(buf); //写入显示数据
- }
- //显示字符串 ,还不能准确应用
- void lcd1602_write_character(unsigned char add,unsigned char *p)
- {
- lcd_write_com_busy(add);
- while (*p!='\0')
- {
- lcd_write_data(*p++);
- }
- }
- //将自定义字符写入CGRAM
- //add是CGRAM 的地址(0~7)
- //*pic_num是指向一个8位数组的首地址
- void lcd1602_write_pic(unsigned char add,unsigned char pic_num)
- {
- unsigned char i;
- add=add<<3;
- for(i=0;i<8;i++)
- {
- lcd_write_com_busy(0x40|add+i); //设定行地址,DB6=1,所以地址可定要加上0X40;
- lcd_write_data(pic_num);
- }
- }
- //---------------------------------------
- //名称: 主函数
- //-----------------------------------------
- void main(void)
- {
- char i,m;
- ADCON1=0X06; //所有IO均为数字口,模拟量输入禁止
- TRISB=0B11000111; //RB3-5设置为输出
- TRISD=0B00000000; //RD设置为输出
- lcdreset(); //复位1602
- lcd_write_char(6,0,0x31); //1
- lcd_write_char(7,0,0x36); //6
- lcd_write_char(8,0,0x30); //0
- lcd_write_char(9,0,0x32); //2
- lcd_write_char(10,0,0x35); //5
- lcd_write_char(11,0,'g'); //g
- lcd_write_char(12,0,'o'); //o
- lcd_write_char(13,0,'o'); //o
- lcd_write_char(14,0,'d'); //d
- lcd_write_com_busy(0x80+0x44);//8.重新设定显示地址为0xc0,即下排第0位
- for(m=0;m<12;m++) //将table1[]中的数据依次写入1602显示
- {
- lcd_write_data(table[m]);
- }
- //写八个自定义字符到CGRAM
- lcd_write_com_busy(0x40); //7.设定CGRAM地址0100; 0x06
- for(i=0;i<64;i++) //将心型代码写入CGRAM中
- lcd_write_data(pic[i]);//lcd1602_write_pic(i,pic[i]);
- //显示八个自定义字符
- lcd_write_com_busy(0x80);//设定上排的显示位置
- for(i=0;i<0x04;i++)//显示心型图案的上半部分
- lcd_write_data(i);
- lcd_write_com_busy(0xc0);////将显示坐标转移到下排和上排相对应的地方
- for(i=4;i<0x08;i++)
- lcd_write_data(i);
- while(1)
- {
-
- }
- }