日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這幾天我又對程序進行了修改——將AD檢測過程與屏幕刷新過程分離,大大提高了檢測速度。(此外我將程序修改為5秒自動刷新,以方便觀察。)

修改后的main.c如下。

#include #include"XPT2046.h"

#define uint unsigned int

#define uchar unsigned char

uchar xdata a[128];

sbit RS=P2^6; //這個是LCD的數據命令選擇端

sbit RW=P2^5; //這個是LCD的寫入或是讀出選擇端

sbit RST=P1^0; //這個是LCD的復位端口

sbit LCDE=P2^7; // 這個是LCD的使能端

sbit PSB=P3^2;

void delay(uchar i)

{

while(i--);

}

void delayms(uint c)? ?//誤差 0us

{

uchar a,b;

for (; c>0; c--)

{

for (b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

}

void lcd_busy()

{

RS=0;

RW=1;

P0=0XFF;

LCDE=1;

delay(14);

while((P0&0x80)==0x80);

LCDE=0;

}

void write_com(uchar com)

{

lcd_busy();RS=0;

RW=0;

LCDE=0;

P0=com;

delay(9);

LCDE=1;

delay(9);

LCDE=0;

}

void write_num(uchar num)

{

lcd_busy();

RS=1;

RW=0;

LCDE=0;

P0=num;

delay(7);

LCDE=1;

delay(9);

LCDE=0;

}

uchar read_data()

{

uchar read;

lcd_busy();

RS=1;

RW=1;

LCDE=0;

delay(7);

LCDE=1;

delay(9);

read=P0;

LCDE=0;

delay(11);;

return read;

}

void clear_lcd()

{

uchar i,j;

write_com(0x34);

for(i=0;i<32;i++)? ?? ?? ?? ? //因為LCD有縱坐標32格所以寫三十二次

{

write_com(0x80+i);? ?? ?? ?//先寫入縱坐標Y的值

write_com(0x80);? ?? ?? ?//再寫入橫坐標X的值

for(j=0;j<32;j++)? ?? ?? ?//橫坐標有16位,每位寫入兩個字節的的數據,也就寫入32次

{? ?? ?? ?? ?? ?? ?? ?? ? //因為當寫入兩個字節之后橫坐標會自動加1,所以就不用再次寫入地址了。

write_num(0x00);

}

}

write_com(0x36);

write_com(0x30);

}

void put_point(uchar x,uchar y)

{

uint bt=0,read=0;

uchar x_adr,y_adr,h_bit,l_bit;

y_adr=0x80+y2;? ?? ?? ?? ?//計算Y軸的地址,應為縱坐標有64個,所有對32求余,當Y大于31時,Y的坐標是下半屏的。

if(y>31) //計算X軸的地址當Y大于31時X的地址在下半屏,從0X88開始,小于31時X的地址是在上半屏,從0X80開始

x_adr=0x88+x/16;

else

x_adr=0x80+x/16;

bt=0x8000>>(x); //求這個點到底是在哪個點

write_com(0x34);

write_com(0x34);

write_com(y_adr);? ???//讀取數據的時候要先寫入所取數據的地址

write_com(x_adr);

read_data();? ?? ?? ?//讀取的第一個字節不要,

read=read_data();? ???//從第二個字節開始接收。

read<<=8;

read|=read_data();

bt=bt|read;

h_bit=bt>>8;

l_bit=bt;

write_com(y_adr);? ???//寫入點的時候,重新寫入地址,因為地址已經改變。

write_com(x_adr);

write_num(h_bit);

write_num(l_bit);

write_com(0x36); //開顯示

write_com(0x30);? ???//轉回基本指令集

}

/*

液晶初始化

*/

void lcd_init()

{

PSB=1;

RST=1;

write_com(0x30);? ???//基本指令操作

write_com(0x0c);? ???//開顯示

write_com(0x01);? ???//清除LCD顯示

}

void main()

{

while(1)

{

uchar x,i,y;

lcd_init();

clear_lcd();

write_com(0x34);

write_com(0x34);

write_com(0x80);

write_com(0x88);

for(i=16;i>0;i--) //畫出X軸

{

write_num(0xff);

}

for(i=0;i<64;i++) //畫出Y軸

{

put_point(0,i);

}

for(i=0;i<128;i++)

{

a[i] = Read_AD_Data(0xE4);

}

for(i=0;i<128;i++)

{

x=i;

y=32-(a[i]/10);

put_point(x,y);

}

write_com(0x36);

write_com(0x30);

delayms(5000);

}

}

總結

以上是生活随笔為你收集整理的单片机 怎调用显示屏字库_51单片机示波器制作(12864显示带字库)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。