久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
PIC單片機驅動LCD12864顯示字符源代碼
[打印本頁]
作者:
51HEI666
時間:
2017-4-23 00:23
標題:
PIC單片機驅動LCD12864顯示字符源代碼
#include <pic.h> //調用頭文件,可以去PICC軟件下去查找PIC16F87XA單片機的頭文件
__CONFIG(XT&WDTDIS&LVPDIS);
//定義配置字,晶振類型:XT,關閉開門狗,禁止低電壓編程
#define Rs RB0 //并行數據/控制字選擇 H:數據 L:控制字
#define RW RB1 //并行讀/寫選擇 H:讀 L:寫
#define E RB2 //并行讀寫使能 H有效,下降沿鎖定數據
#define Psb RB3 //串口,并口選擇 H:并口 L:串口(開發板上引腳標識為CS1)
#define Rst RB5 //復位引腳 L:液晶復位
//---------------------------------------
//名稱: 延時函數
//-----------------------------------------
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<10;j++)
{
asm("NOP");
}
}
}
//---------------------------------------
//名稱: 數據總線處理函數
//ND118開發板中,因為布線的原因液晶的8位數據總線和單片機的8位數據線
//是反的,所以需要調換過來,即DB0-RD7、DB1-RD6。。。。DB7-RD0
//-----------------------------------------
void write_bus(unsigned char buf)
{
if(buf&0x01) RD7=1;
else RD7=0;
if(buf&0x02) RD6=1;
else RD6=0;
if(buf&0x04) RD5=1;
else RD5=0;
if(buf&0x08) RD4=1;
else RD4=0;
if(buf&0x10) RD3=1;
else RD3=0;
if(buf&0x20) RD2=1;
else RD2=0;
if(buf&0x40) RD1=1;
else RD1=0;
if(buf&0x80) RD0=1;
else RD0=0;
}
//---------------------------------------
//名稱: 寫命令字節到12864函數
//-----------------------------------------
void write_com(unsigned char cmdcode)
{
unsigned int ii=20000;
Rs=0; //設置該字節數據為命令代碼
RW=1; //設置此次操作為讀
E=1; //使能
TRISD=0B11111111; //RD設置為輸入
while((PORTD&0X01)&&(ii>0)) //讀忙狀態,不忙時退出
{
ii--;
}
E=0; //失能
TRISD=0B00000000; //RD設置為輸出
Rs=0; //設置該字節數據為控制命令
RW=0; //設置此次操作為讀寫
write_bus(cmdcode); //通過數據總線處理函數將命令字寫進總線中去
E=1; //使能寫
asm("NOP"); //略加延遲
asm("NOP");
asm("NOP");
E=0; //失能寫
}
//---------------------------------------
//名稱: 寫數據字節到12864函數
//-----------------------------------------
void write_data(unsigned char Rsspdata)
{
unsigned int ii=20000;
Rs=0; //設置該字節數據為命令代碼
RW=1; //設置此次操作為讀
E=1; //使能
TRISD=0B11111111; //RD設置為輸入
while((PORTD&0X01)&&(ii>0)) //讀忙狀態,不忙時退出
{
ii--;
}
E=0; //失能
TRISD=0B00000000; //RD設置為輸出
Rs=1; //設置該字節數據為數據
RW=0; //設置此次操作為讀寫
write_bus(Rsspdata); //通過數據總線處理函數將命令字寫進總線中去
E=1; //使能寫
asm("NOP"); //略加延遲
asm("NOP");
asm("NOP");
E=0; //失能寫
}
//---------------------------------------
//名稱: 寫地址函數
//輸入參數:x,y:顯示字符串的位置,x:0-7,y:0-3
//-----------------------------------------
void write_xy(unsigned char x,unsigned char y)
{
unsigned char address;
switch(y){
case 0:address=0x80+x;break; //第一行的首地址是0x80
case 1:address=0x90+x;break; //第二行的首地址是0x90
case 2:address=0x88+x;break; //第三行的首地址是0x88
case 3:address=0x98+x;break; //第四行的首地址是0x98
default:address=0x80+x;
}
write_com(address);
}
//---------------------------------------
//名稱: 初始化LCD屏
//-----------------------------------------
void init_lcd(void)
{
Rst=0; //復位液晶
delay(250); //加些延時
delay(250);
Rst=1; //復位結束
delay(250); //加些延時
Psb=1; //選擇8bit并口
write_com(0x30); //基本指令集
write_com(0x0c); //顯示開
write_com(0x06); //光標右移,整體顯示不移動
write_com(0x01); //清除顯示(清零DDRAM)
delay(250);
}
//---------------------------------------
//名稱: 指定地址中英文字符串顯示函數
//-----------------------------------------
void write_string(unsigned char x,unsigned char y,const unsigned char *s)
{
write_xy(x,y); //先寫入地址參數
while(*s) //只要字符串沒寫完就繼續寫
{
write_data(*s); //寫入一個字符串數據
s++; //指針轉到下一個
delay(10);
}
}
//---------------------------------------
//名稱: 整行中英文字符串顯示函數
//-----------------------------------------
void lcd12864_dis_oneline(unsigned char line,const unsigned char *p)
{
unsigned char c;
switch(line%4)
{
case 0:
write_com(0x80); //第一行的首地址為0x80
for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 1:
write_com(0x90); //第二行的首地址為0x90
for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 2:
write_com(0x88); //第三行的首地址為0x88
for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
case 3:
write_com(0x98); //第四行的首地址為0x98
for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
{
write_data(*p);
p++;
if(*p==0)
{
break;
}
}
break;
default : break;
}
}
//---------------------------------------
//名稱: 主函數
//-----------------------------------------
void main(void)
{
TRISB=0B11000000; //RB0-5設置為輸出
TRISD=0B00000000; //RD設置為輸出
init_lcd(); //初始化12864
write_string(0,0,"XXXX電子有限");
write_string(0,1,"公司");
write_string(0,2,"MovingChip.com");
write_string(0,3,"0574-86878555");
while(1)
{
}
}
復制代碼
作者:
huchunhb
時間:
2018-6-22 17:28
PIC關于LCD12864驅動的文章很少,學習了。有個問題想請教樓主:可否不要并串口的選擇口,還有就是一定要復位嗎?
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
在线观看欧美日韩
|
国产精品久久久久久久成人午夜
|
www中文字幕
|
黄色片久久
|
国产伦精品一区二区三区88av
|
日韩一级大片
|
国产午夜精品一区二区三区视频
|
久久久精品
|
福利视频免费
|
国产黄色在线
|
在线日韩欧美
|
欧美一级在线
|
日本精品视频在线
|
日本一区二区不卡
|
亚洲精品中文字幕乱码三区91
|
天天射av
|
亚洲美女网站
|
黄色免费网站视频
|
黄色一区二区三区
|
日韩欧美高清
|
黄色在线观看网址
|
在线观看视频一区二区
|
亚洲第一伊人
|
久久99精品国产麻豆91樱花
|
伊人久久影院
|
欧美色图一区二区
|
成人久久av
|
国产一区在线播放
|
日韩精品免费
|
精品理论片
|
国产视频一区二区三区四区
|
97精品国产露脸对白
|
亚洲黄色小视频
|
99re这里只有精品6
|
激情五月综合
|
开心激情婷婷
|
成人动漫在线看
|
五月婷色
|
日本精品久久
|
日本伊人网
|
国产三级成人
|