- #include <pic.h> //調(diào)用頭文件,可以去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; //為讀狀態(tài)做準備,把RD7設為輸入
- RSPIN=0; //選擇指令寄存器
- RWPIN=1; //選擇讀
- EPIN=1; //使能線電平變化
- while(RD7==1); //讀忙狀態(tài),不忙時退出
- EPIN=0; //恢復使能線電平
- TRISD7=0; //把RD7設置為輸出
- }
- void lcd_write_com(unsigned char combuf)
- {
- RSPIN=0; //選擇指令寄存器
- RWPIN=0; //選擇寫
- PORTD=combuf; //把命令字送入RD
- EPIN=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
- asm("NOP"); //來一個空操作,以延時片刻
- EPIN=0; //恢復使能線電平
- }
- void lcd_write_com_busy(unsigned char combuf)
- {
- lcd_wait_busy(); //調(diào)用忙檢測函數(shù)
- lcd_write_com(combuf); //調(diào)用寫命令函數(shù)
- }
- void lcd_write_data(unsigned char databuf)
- {
- lcd_wait_busy(); //調(diào)用忙檢測函數(shù)
- RSPIN=1; //選擇數(shù)據(jù)寄存器
- RWPIN=0; //選擇寫
- PORTD=databuf; //把數(shù)據(jù)字送入RD口
- EPIN=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口
- 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位數(shù)據(jù),雙列,5*7字形
- lcd_write_com_busy(0x08); //顯示功能關,無光標
- lcd_write_com_busy(0x01); //清屏指令
- lcd_write_com_busy(0x06); //寫入新的數(shù)據(jù)后,光標右移,顯示屏不移動
- 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); //寫入顯示數(shù)據(jù)
- }
- 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) //計數(shù)400次后,為0.1秒
- {
- a=0;
- if(++b>9999) a=0; //將顯示數(shù)字限定在0-9999中
- }
- }
- }
- void main(void)
- {
- ANSEL=0X00; //所有IO為數(shù)字IO
- ANSELH=0X00; //所有IO為數(shù)字IO
- OSCCON=0X08; //系統(tǒng)時鐘由CONFIG決定
- TRISB=0B11000111; //RB3-5設置為輸出
- TRISD=0B00000000; //RD設置為輸出
- lcdreset(); //復位1602
- timer0init();
- while(1)
- {
- lcd_write_char(0,0,0x30+b/1000); //顯示數(shù)據(jù)百位
- lcd_write_char(1,0,0x30+(b%1000)/100); //顯示數(shù)據(jù)十位
- lcd_write_char(2,0,0x30+(b%100)/10); //顯示數(shù)據(jù)個位
- lcd_write_char(3,0,'.'); //顯示"."
- lcd_write_char(4,0,0x30+b%10); //顯示數(shù)據(jù)小數(shù)
- lcd_write_char(5,0,'S'); //顯示"S"
- }
- }
復制代碼 |