- #include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F88X单片机的头文件
- __CONFIG(XT&WDTDIS&LVPDIS&BORDIS); //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程,禁止欠压复位
- #define RSPIN RB5 //Data or Instrument Select
- #define RWPIN RB4 //Write or Read
- #define EPIN RB3 //6800 mode Enable single
- unsigned int a;
- unsigned int b;
- void delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++)
- {
- for(j=0;j<10;j++);
- }
- }
-
- void lcd_wait_busy(void)
- {
- TRISD7=1; //为读状态做准备,把RD7设为输入
- RSPIN=0; //选择指令寄存器
- RWPIN=1; //选择读
- EPIN=1; //使能线电平变化
- while(RD7==1); //读忙状态,不忙时退出
- EPIN=0; //恢复使能线电平
- TRISD7=0; //把RD7设置为输出
- }
- void lcd_write_com(unsigned char combuf)
- {
- RSPIN=0; //选择指令寄存器
- RWPIN=0; //选择写
- PORTD=combuf; //把命令字送入RD
- EPIN=1; //使能线电平变化,命令送入1602的8位数据口
- asm("NOP"); //来一个空操作,以延时片刻
- EPIN=0; //恢复使能线电平
- }
- void lcd_write_com_busy(unsigned char combuf)
- {
- lcd_wait_busy(); //调用忙检测函数
- lcd_write_com(combuf); //调用写命令函数
- }
- void lcd_write_data(unsigned char databuf)
- {
- lcd_wait_busy(); //调用忙检测函数
- RSPIN=1; //选择数据寄存器
- RWPIN=0; //选择写
- PORTD=databuf; //把数据字送入RD口
- EPIN=1; //使能线电平变化,命令送入1602的8位数据口
- asm("NOP");
- EPIN=0; //恢复使能线电平
- }
- 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); //第二行的列地址写入
- }
- void lcdreset(void)
- {
- delay(150);
- lcd_write_com(0x38);
- delay(50);
- lcd_write_com(0x38);
- delay(50);
- lcd_write_com(0x38);
- 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 timer0init(void)
- {
- T0CS=0; //TMR0工作于定时器方式
- PSA=1; //TMR0不分频
- T0IF=0; //清除TMR0中断标志
- T0IE=1; //TMR0中断允许
- TMR0=0x13; //赋初值,以便TMR0每250US中断一次
- GIE=1;
- }
- void interrupt ISR(void)
- {
- if(T0IF==1) //250us
- {
- TMR0=0x13;
- T0IF=0;
- if(++a>399) //计数400次后,为0.1秒
- {
- a=0;
- if(++b>9999) a=0; //将显示数字限定在0-9999中
- }
- }
- }
- void main(void)
- {
- ANSEL=0X00; //所有IO为数字IO
- ANSELH=0X00; //所有IO为数字IO
- OSCCON=0X08; //系统时钟由CONFIG决定
- TRISB=0B11000111; //RB3-5设置为输出
- TRISD=0B00000000; //RD设置为输出
- lcdreset(); //复位1602
- timer0init();
- while(1)
- {
- lcd_write_char(0,0,0x30+b/1000); //显示数据百位
- lcd_write_char(1,0,0x30+(b%1000)/100); //显示数据十位
- lcd_write_char(2,0,0x30+(b%100)/10); //显示数据个位
- lcd_write_char(3,0,'.'); //显示"."
- lcd_write_char(4,0,0x30+b%10); //显示数据小数
- lcd_write_char(5,0,'S'); //显示"S"
- }
- }
复制代码 |